簡體   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