2007-04-27

ssh の時間当たりの同一IPアドレスからの接続回数を制限してみる。

最近、ワームだかなんだかしらないが、ssh のユーザ名やパスワードをブルートフォース的にアタックしてきて、ssh サーバにしてみれば ssh handshake のためにCPUリソース喰われた感じでむかつく。 ブルートフォース的な攻撃は、攻撃元ホストにユーザ名リストとパスワードリストが置いてあるらしく、そのホストからリストにあるのユーザ名に対してリストにあるパスワードの組み合わせで攻撃してくるみたい。 同一ホストからの時間当たりの接続開始数がある程度超えたら切ってやれば、ちとは対処になるかなと思った。


そこで思いついた|思い出したのが inetd の max-connections-per-ip-per-minute、これは同一IPアドレスから同一ポートへの接続が1分間に設定回数以上に達したら、そのIPアドレスからそのポートへの接続をできなくするようにしている。 厳密にはコネクションは一旦開くのだが、接続できない条件になったら即コネクションを閉じるという具合になっている。


今回はFreeBSDのinetd でやってみた。 やり方だが、こんな感じ。


まずは inetd.conf に下記のような内容を書く


ssh     stream  tcp     nowait/64/5     root    /usr/sbin/sshd sshd -i

上記の設定では、/etc/services で書かれている ssh のポート (22番) では最大コネクション数64で、同一IPアドレスからの1分あたりの接続数を5回、と制限することとなる。 数値は変更可能で、0にすると無制限になります。 詳しくは man inetd.conf でも見てください。


この設定をして、時間当たりのコネクション数に達してコネクションを拒否したら、/var/log/messages あたりには下記のようなメッセージが残ります。


Apr 27 23:31:37 apr inetd[97]: ssh from 59.106.22.177 exceeded counts/min (limit 5/min)

あとは daemon として動いている sshd をとめたり起動しないような措置を取ります。 kill で sshd のプロセスをとめたり、/etc/rc.conf ではこんな内容を設定したり。


sshd_enable="YES"

この設定での要注意なのが、バッチ処理とかで sshd を同一ホストから1分間に大量に叩く場合、この閾値にあたってしまう可能性があります。 手元のSempronのマシン(この日記のWebサーバ)で、シーケンシャルに ssh を起動して date コマンドだけ叩かせたら、分間120回以上接続できるみたいなので、まぁ適当に絞ってくださいな。


これで少しは良くなればと思いながら、様子見。

0 件のコメント:

コメントを投稿