繁体   English   中英

当密钥不匹配时,如何判断 phpseclib sftp 响应是否是密码请求的挑战

[英]How to tell if phpseclib sftp response is a challenge with a password request when key doesn't match

最近有人无意中将用于我的 ssh/sftp 的密钥文件更改为远程服务器。 当我尝试从命令行通过 ssh 连接到服务器时,我推断出这一点,并且我收到了密码请求的挑战,这表明密钥不再被识别。

如何让我的 php 程序检测到意外的密码挑战? 目前我有这个:

$sftp = new SFTP(self::DOMAIN_NAME);

$Key = new RSA();

$private_rsa_key = file_get_contents('/home/ddfs/.ssh/' . self::KEY_FILE);

$Key->loadKey($private_rsa_key);
$rc = $sftp->login(self::USER, $Key);
$errors =  $sftp->getSFTPErrors();

目前我看到 $rc 设置为 FALSE 并且 $errors 是一个空数组。

SSH 发起的密码更改请求

SSH 有一个内置的密码重置机制。 我对RFC4252 § 8 的阅读意味着 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 数据包应该只在响应“密码”SSH_MSG_USERAUTH_REQUEST 时发送,但谁知道 OpenSSH 开发人员如何解释 RFC 的该部分。

由于您正在进行公钥身份验证,phpseclib 将发送一个“公钥” SSH_MSG_USERAUTH_REQUEST 所以看起来 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 不会是一个有效的响应,但同样,谁知道呢。

如果服务器确实以 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 数据包响应,那么您可以执行$sftp->getErrors() (而不是getSFTPErrors )并查找以SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:开头的数据包。 甚至可以做$sftp->getLastError()

getSFTPErrors返回 SFTP 层的错误 - 而不是 SSH2 层。 SFTP 作为协议不知道身份验证 - 这完全由 SSH 层处理。 IE。 您要查看的不是 SFTP 错误,而是 SSH 错误。

参考代码: https : //github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/SSH2.php#L2219

其他可能的密码请求机制

密码请求可能不是来自 SSH 的内置身份验证机制。 您可能会从“公钥”SSH_MSG_USERAUTH_REQUEST 获得 SSH_MSG_USERAUTH_SUCCESS 响应。

在这一点上,我可以看到两种可能性:

  1. 它可能是您看到的横幅消息。 您可以通过执行$sftp->getBannerMessage()来获得这些。

  2. 当您通过 SSH 进入服务器而不是 SFTP 进入服务器时,您可能只会看到此错误。 IE。 除非您$ssh->exec()$ssh->write()否则您可能看不到错误。 此时,“错误”可以通过 stderr 或 stdout 传达给您。

要确定我必须查看 SSH 日志。 phpseclib 日志可能足够也可能不够。 我的意思是你可以做$sftp->exec('pwd'); $sftp->read('[prompt]'); 但我的猜测是你还没有这样做。 如果你想走那条路,你可以define('NET_SSH2_LOGGING', 2); 然后在执行$sftp->exec()$sftp->read()echo $sftp->getLog() $sftp->read()

PuTTY 日志可能更有用。 要获取它们,您可以转到 PuTTY->Session->Logging,选中“SSH 数据包”单选按钮,然后照常连接。

不幸的是,据我所知,OpenSSH 不会记录原始/解密的 SSH2 数据包,因此 OpenSSH 在这里不会太有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM