sshdのログをみていると、ときどき辞書攻撃(というか名簿攻撃)をくらっているが、 そもそもパスワード認証は許可してないので侵入されるおそれはない。 そうはいっても大量のログが出るのはうっとうしいので、 FreeBSDのinetdには接続制限の機能をつかって同じアドレスから大量のコネクションが来ると 切断するようにしたところ、けっこう効果があった。
やったこと:
  1. /etc/rc.confを書き換えて sshd をデーモンで起動しない。
     #sshd_enable="YES"
     inetd_enable="YES"
    
  2. /etc/inetd.confを書き換えて inetd 経由で起動するようにする。
     ssh stream tcp nowait/0/6 root /usr/sbin/sshd sshd -i -4
    
    "nowait/0/6"の意味は、「接続がきたらどんどんデーモンを立ち上げる」/「同時接続数の制限はしない」/「同じIPアドレスからの接続は1分間あたり6接続に制限する」。 "sshd -4"はIPv6はつかってないのでIPv4のみでlisten、"sshd -i"はinetd経由でつかうのでstdin/stdoutをつかえという指示。 sshdのmanpageによるとinetd経由だとserver keyを生成する時間だけクライアントが待たされるよと書いてあるが、 試してみるとそんなに時間はかからない。
設定がおわったらsshdを止めてinetdを(再)起動する。
/etc/rc.d/sshd onestop
/etc/rc.d/inetd restart
これで連続して7回つなぎにいくと、7回目でエラーになるはず。
% ssh server date
Wed Aug 25 12:55:50 JST 2010
% ssh server date
Wed Aug 25 12:55:51 JST 2010
% ssh server date
Wed Aug 25 12:55:52 JST 2010
% ssh server date
Wed Aug 25 12:55:52 JST 2010
% ssh server date
Wed Aug 25 12:55:53 JST 2010
% ssh server date
Wed Aug 25 12:55:54 JST 2010
% ssh server date
ssh_exchange_identification: Connection closed by remote host
%
/var/log/messagesには次のようなメッセージが残る
Aug 25 12:55:55 server inetd[1204]: ssh from xxx.xxx.xxx.xxx exceeded counts/min (limit 6/min)