しつこいあいつは着信拒否

もう既にここでは、2つ目の投稿ですのではじめましてではありませんが軽くご挨拶をさせてください。
こんにちは、 たかはら(tumf) です。酒担当です。

酒好きのディノの中でもずっと酒量トップを張っていましたが、最近後継者が順調に育ってきたのでそろそろその座を譲ろうかと考えています。

PHPとか難しい事良く判らないのですがよろしくお願いします。

さて、本題。

サーバ大好きな私は、某所で個人用Linuxサーバを借りて我が子のように大事にしています。
その可愛い子が毎晩AM4:00のcronで起動するlogwatchで助けを求めてきます。


sshdへの攻撃跡

うちの子をいめるなんて許せません!いじめっ子を見つけて懲らしめてやりたいと思います。

と、いきごんでみたものの、懲らしめるなんて大げさな事はとてもできないので 着信拒否 という手で対抗します。

いじめっ子の手口

上のログを見ても判る通り、いじめっ子はSSHが通常立ち上がっている22番ポートに対し、ユーザ名を執拗に変えてログインを試みます。
このログだけでは判りませんが、いじめっ子はうちの子に散々ぱら攻撃した揚げ句、入れないと判るとどっかに行ってしまいます。そしてまた別のいじめっ子が別のところからやってきて攻撃します。

もちろん、SSHDの設定でパスワード認証を不可にしている為ログインを許す事はありません。ただ、毎日毎日このような攻撃(ブルートフォースアタック)があるのは気分が良いものではありません。これだけ攻撃のログが残っていると、ログの中から本当に重要なアラートを見逃してしまうかもしれませんね。

対抗策

一日一回のlogwatchを見て対抗したのでは、攻撃のあとすぐに逃げてしまういじめっ子には間に合いません。
攻撃をすぐに検知できるようにログを見張っておく必要があります。
ログを見張っておいて、怪しい接続があったら即座に遮断してしまえばいいのです。

実はiptablesのipt_recentを使って同じような事を実現できますが残念ながらうちの子には無理なようですので、工夫して別の方法で実現してみました。出来の悪い子ほど可愛いものです。

ログを見張って遮断

(飽きてきたので、そろそろ普通に書きますね)

対抗策を実現するために、daemontoolsでログを見張ってiptablesを使って繰り返しアクセスをするホストを遮断するスクリプトupdate-filterをRubyで書きました。(daemontoolsについては、インストール方法を省きます。)

update-filter.rbのダウンロード

このファイルを、/usr/local/bin/update-filter として実行属性を立てて置いて下さい。

iptablesにSSHFILTERチェインとSSHFILTEREDチェインが必要ですので以下のように作ります。

$ iptables -N SSHFILTER
$ iptables -N SSHFILTERED
$ iptables -A SSHFILTERED -j LOG --log-prefix "Rej-SSH "
$ iptables -A SSHFILTERED -j DROP

SSHFILTEREDチェインは怪しいとマークされたSSHの接続を記録するために存在します。

次に以下のようにして、INPUTチェインにSSHFILTERチェインを追加します。

$ iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j SSHFILTER

次に、daemontoolsのサービスを作成します。

$ mkdir -p /etc/sshfilter/log

/etc/sshfilter/run に実行属性を立てて以下のファイルをおきます。

#!/bin/sh
exec 2>&1
exec /usr/local/bin/update-filter

次に、 /etc/sshfilter/log/run に実行属性を立てて以下のファイルをおきます。

#!/bin/sh
exec multilog t ./main

あとは、/serviceにsymlinkを張るだけです。

$ ln -s /etc/sshfilter /service/sshfilter

デーモンとして立ち上がっているか確認しましょう。

$ svstat /service/sshfilter

として、/service/sshfilter: up (pid xxxx) 13 secondsとかでればとりあえず成功です。

これで完了。お疲れ様でした。あとは攻撃を待つだけです。

遮断状況の確認

攻撃を受けたときに、ちゃんと攻撃元を遮断しているか確認するためには以下のようにします。

$ iptables -L SSHFILTER

このコマンドでフィルターに攻撃元IPの遮断ルールが追加されているか調べましょう。遮断ルールは/var/log/secureがローテートされるまで追加されます。
サーバによって異なると思いますが、私の所で攻撃元は日に3〜4箇所程度。このスクリプトを運用してから数ヶ月きっちりと攻撃者を弾いています。

コメント / トラックバックはありません

コメントする