SSHサーバが受け付けている認証方法を調べるPerlモジュール

を、CPANに上げしました。

  • Net::Scan::SSH::Server::SupportedAuth
    • 予め Math::BigInt::GMP をインストールしておくのをお勧めします。じゃないと、Net::SSH::Perl (が使っている Crypt::DH) が遅くて、まともに使えませんので。

このモジュールは、SSH protocol 1と2のそれぞれについて、どの認証方法(パスワード認証か鍵認証か)が受け付け可能か調べるためのものです。

アーカイブには、sample/scan-sshauth.pl というサンプルスクリプトもあるので、モジュールをインストールすれば、コードを書かずとも試してみることができます。

ちなみにこのサンプルスクリプトは、

に対して調査できるので、出力などは用途にあうようにアレンジして、

  • 外部にさらしているサーバたち
  • イントラのネットワークセグメント

などに対して定期的にスキャンすれば、うっかり/いつのまにかパスワード認証やSSHv1を有効にしてしまっているマシンをあぶりだす、といったことができます。

$ ./sample/scan-sshauth.pl foo bar baz
HOST                   : SSH2  SSH1 (K=publickey, P=password)
===================================
foo                    : 2=K-  1=--
bar                    : 2=KP  1=--
baz                    : 2=KP  1=KP


さて、認証方法を調べるなら、sshコマンドを使って、

$ ssh -2 -o PreferredAuthentications=keyboard-interactive,password HOST
$ ssh -2 -o PreferredAuthentications=publickey                     HOST
$ ssh -1 -o PreferredAuthentications=keyboard-interactive,password HOST
$ ssh -1 -o PreferredAuthentications=publickey                     HOST

などとすれば調べられますが、

  • 4回もforkが発生する
  • コネクションが 4 回発生する
  • 認証エラーになる

などなどこの方法はいまいちです。

対して Net::Scan::SSH::Server::SupportedAuth は、

  • PerlSSHの実装 (Net::SSH::Perl) を使っているのでforkはしない
  • コネクションは多くて (SSHv2とSSHv1の) 2 回
  • ネゴシエーションの過程でサーバから提示される認証方法の情報を利用しているといった利点/特徴があります。