SSBlocker – 攻撃元のIPアドレスをブロック

(Last Updated On: 2022年10月3日)

SSHなどよく知られたサービスポートで何も対策せずにいると数えきらないくらいの攻撃リクエストが来ます。不必要なログを増やしてリソースを無駄にし、もし不用意なユーザーやシステムがあると攻撃に成功する場合もあります。

SshguardはC作られており、flex/bisonのパーサールールを足せば拡張できますがカスタム版をメンテナンスするのも面倒です。必要なルールを足してプルリクエストを送ってもマージされる可能性の低いです。

Fail2banはPythonで作られていてメンテナンスも比較的容易です。しかし、削除された機能を使用しておりメンテナンス状態も良くないです。今のPythonで動くようにしても良いのですが、Fail2banは無駄に大きいです。そしてPythonはあまり速くもないです。

という事で簡単に拡張(どんなログでもパースしてブロック)できて、300行ほどの一つのスクリプトでそこそこ速く、簡単にカスタマイズできるIPアドレスブロッカーを書いたのでgithubに入れておきました。

https://github.com/yohgaki/ssblocker

必要要件

  • あまり古くないPHPコマンドライン
  • PCNTLモジュール(オプション)
  • SYSV Sem/Shmモジュール(ssblocker-serverのみ必須)

Windowsでも使えるようにできますが、基本的にはUNIX系OSで使うこと想定しています。

特徴

  • 設定が簡単で柔軟。個々のルールに対してブロックするまでの攻撃回数、ブロック時間、攻撃検知時間を設定可能
  • 攻撃検知ルールはカスタマイズ可能で単純な正規表現。IPアドレスさえ記録されていればどんなログにも利用可能
  • 繰り返し攻撃するIPのブロック時間を延長可能
  • 自動的にブロックを解除
  • ホワイトリスト(IPとドメイン)
  • 複雑なブロック処理が可能(PHP関数にできるのでメールやチャット通知も可能)
  • ログローテーションの自動検出
  • 内部状態のダンプ(処理したログ行数、検知した攻撃、ブロック状態、メモリ利用量など。USR1シグナルでダンプ、検知した攻撃回数に応じてダンプ可能。PHPコードになっているのでと統計処理したい場合も容易)
  • PHPの高速なハッシュ(配列)と高速なPCREを使っているので結構速い(PythonだとSIPハッシュで遅く、Python標準の正規表現はPCREよりかなり遅い)

使い方

IPTablesを使っていてSSHを保護したい場合は、rootで

cd /etc
git clone https://github.com/yohgaki/ssblocker.git
cd /etc/ssblocker
ln -s ssblocker ssblocker-sshd
ln -s ipv4-iptable.cfg/ssblocker-sshd.cfg
journalctl -u sshd -f | ./ssblocker-sshd

とすると攻撃されるとブロックします。攻撃とみなすログ、ブロックする時間、などは簡単にカスタマイズできます。SSBlockerのソースのsshblocker-sample.cfgに説明を記載しています。ssblocker-sshd.cfgを見るだけでも凡その意味は分かると思います。

セキュリティ対策コンプライアンス

OWASP TOP 10対策が出来ていること」が要求されることが多いと思います。2017年からOWASP TOP10では妥当なログとモニタリングを行えないシステムは脆弱だとされています。

https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/

繰り返し攻撃してくる、攻撃可能か試してくるような場合、リアルタイムかほぼリアルタイムな対応をとること(=自動的にブロックしたりすること)を要求しています。

どんな条件でIP丸ごとブロックするのか?は組織のセキュリティ要求仕様によって異なると思います。ログを簡単にスキャンできてブロック、通知できるプログラムが無いとWebアプリだけで実装するのは少し無理があります。

こういった場合にも、攻撃ログを適切に記録できていれば、SSBlockerに通知機能を付けるだけでOWASP TOP10:A09 2021にも対応できます。

その他

「OSSでシンプルで自由にブロックルールを書けるIPブロッカーは?」と聞かれて良いモノを見つけられ無かったので手元のスクリプトを公開しました。そこまでリアルタイム性は高い必要はないのでパフォーマンス/使い勝手とのトレードオフであまり頻繁にGCしたりログ監視をしたりしません。それでも実用には十分だと思います。「役に立った」と思ったらリポジトリに☆を付けて貰えたら参考になります!

100行もあれば結構使えるモノを書けます。攻撃を繰り返すIPアドレスをブロックするスクリプトを書いた人は沢山居ると思います。かなり適当に書いていたモノを少し手直しして公開しています。バグがある場合はGIt HubのIssueで送ってください。

自分自身をブロックしないよう、ホワイトリストを定義してから試すことをオススメします!

投稿者: yohgaki