2017-09-27 3 views
1

最近、私のssh/sftpで使用されているキーファイルを誤ってリモートサーバに変更しました。私はコマンドラインからサーバーにsshしようとしたときにこれを推測し、パスワード要求で挑戦しました。これはキーが認識されなくなったことを示しています。キーが一致しないときにphpseclib sftpレスポンスがパスワード要求の挑戦であるかどうかを確認する方法

私のPHPプログラムで予期しないパスワードの挑戦を検出するにはどうすればよいですか?私は$ RCがFALSEに設定され、$エラーは空の配列であることがわかり現時点で

$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(); 

:現在、私はこれを持っています。

答えて

1

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は有効な応答ではなく、誰でも知っているようです。

サーバーは$sftp->getErrors()(代わりのgetSFTPErrors)を行うと、SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:で始まるいずれかに見ることができるよりもSSH_MSG_USERAUTH_PASSWD_CHANGEREQパケットで応答しなかった場合。たぶんでも$sftp->getLastError()を実行します。

getSFTPErrorsは、SSH2レイヤではなくSFTPレイヤでエラーを返します。プロトコルとしてのSFTPは認証について知らない - それは完全にSSH層によって扱われる。すなわち、あなたが見たいSFTPエラーではなく、SSHエラーです。

リファレンスコード:https://github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/SSH2.php#L2219

他の可能なパスワード要求メカニズム

これは、パスワード要求は、SSHのビルトイン認証機構から来ていない可能性があります。 "publickey" SSH_MSG_USERAUTH_REQUESTからSSH_MSG_USERAUTH_SUCCESS応答を受け取っている可能性があります。

  1. は、それはあなたが見ているバナーメッセージのようになります。この時点で

    私は2つの可能性を見ることができます。あなたは$sftp->getBannerMessage()を行うことでそれらを得ることができます。

  2. SFTPを使用しているのではなく、サーバーにSSHを送信すると、このエラーが表示される可能性があります。すなわち、 $ssh->exec()または$ssh->write()を実行しない限り、エラーは表示されない可能性があります。この時点で、「エラー」はstderrまたはstdoutを介してあなたに伝えられます。

確かに私はSSHログを見る必要があります。 phpseclibログで十分である場合とそうでない場合があります。私はあなたが$sftp->exec('pwd');または$sftp->read('[prompt]');を行うことができることを意味しますが、私の推測はあなたがそれをやっていないということです。あなたが$sftp->exec()または$sftp->read()のいずれかを実行した後に、define('NET_SSH2_LOGGING', 2);を実行してからecho $sftp->getLog()を実行することができます。

PuTTYログが役立つ場合があります。それらを取得するにはPuTTY->セッション - >ロギングに行き、 "SSHパケット"ラジオボタンをチェックし、いつものように接続してください。

残念ながら、私の知る限り、OpenSSHは生の/復号化されたSSH2パケットを記録しないので、OpenSSHはあまり役に立たないでしょう。

+0

ありがとうございました。私は '$ errors = $ sftp-> getErrors();を追加しました。 $ last_error = $ sftp-> getLastError(); 'ログインに失敗すると、両方とも空になります。 –

+0

@NickWeavers - 私は自分の答えを更新しました。特に、サーバが 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ'を使用していないように聞こえるので、第2セクションに注意してください。 – neubert

関連する問題