最近、ワームだかなんだかしらないが、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_...