SSHなどよく知られたサービスポートで何も対策せずにいると数えきらないくらいの攻撃リクエストが来ます。不必要なログを増やしてリソースを無駄にし、もし不用意なユーザーやシステムがあると攻撃に成功する場合もあります。
SshguardはC作られており、flex/bisonのパーサールールを足せば拡張できますがカスタム版をメンテナンスするのも面倒です。必要なルールを足してプルリクエストを送ってもマージされる可能性の低いです。
Fail2banはPythonで作られていてメンテナンスも比較的容易です。しかし、削除された機能を使用しておりメンテナンス状態も良くないです。今のPythonで動くようにしても良いのですが、Fail2banは無駄に大きいです。そしてPythonはあまり速くもないです。
Webアプリも放置していれば攻撃できるか試し放題です。OWASP TOP 10 A09:2021-Security Logging and Monitoring Failures に準拠するにも「ほぼリアルタイム」のIPアドレスブロッカーが欠かせません。 A9:2021に対応するにはブロックツール以前に、Webアプリ攻撃ツールなどが生成するリクエスト(入力)を検知し記録しなければなりません。このためWebアプリの入力を厳格にバリデーションする必要があります。
参考:
(注意: A9:2021はWAFを導入するという基準ではないです。Webアプリが攻撃(≒無効な入力)を検知・記録・対応する機能がないと脆弱なWebアプリだとする基準です、念の為)
という事で簡単に拡張(どんなログでもパースしてブロック)できて、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-iptables.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にも対応できます。
メールサーバーのブロック例
実際にインターネット上で運用しているメールサーバーのブロック状態です。dovecotのPOP3もブロックしていますが、永久ブロック設定がないのでブロックIPが空の場合も多いです。SMTPとSubmissionは永久ブロックもしているので運用時間が長いとブロック数も増えてきます。
Chain ssblocker_dovecot_pop3 (1 references) target prot opt source destination Chain ssblocker_qmail_smtpd (1 references) target prot opt source destination DROP all -- 222.247.70.252 anywhere DROP all -- 175.148.76.6 anywhere DROP all -- 175.165.144.197 anywhere DROP all -- unknown.tino.vn anywhere DROP all -- 103.147.184.206 anywhere DROP all -- 43.153.177.100 anywhere DROP all -- 193.56.29.178 anywhere Chain ssblocker_qmail_submission (1 references) target prot opt source destination DROP all -- 1.193.20.21 anywhere DROP all -- 45.88.67.173 anywhere DROP all -- 45.12.253.208 anywhere DROP all -- vmi903353.contaboserver.net anywhere DROP all -- 191.96.110.19 anywhere DROP all -- 149.248.55.249.vultrusercontent.com anywhere DROP all -- 193.169.252.47 anywhere DROP all -- 45.88.67.176 anywhere DROP all -- 168.0.134.144 anywhere DROP all -- 91.206.228.46 anywhere DROP all -- 85.217.144.125 anywhere DROP all -- 93-56-100-45.ip347.fastwebnet.it anywhere DROP all -- 95.179.161.79.vultrusercontent.com anywhere DROP all -- ec2-18-139-124-195.ap-southeast-1.compute.amazonaws.com anywhere DROP all -- eglseer.cc anywhere DROP all -- ec2-43-207-148-249.ap-northeast-1.compute.amazonaws.com anywhere DROP all -- 171.22.30.15 anywhere DROP all -- 109.206.240.126 anywhere DROP all -- ec2-35-78-78-107.ap-northeast-1.compute.amazonaws.com anywhere DROP all -- 20.240.43.218 anywhere DROP all -- 171.22.30.146 anywhere DROP all -- 20.105.200.172 anywhere DROP all -- nrgsrvr.nrgwebservers.com anywhere DROP all -- bb.ptr64.ptrcloud.net anywhere DROP all -- mail.tuanagrupmobilya.com.tr anywhere DROP all -- 20.5.128.25 anywhere DROP all -- 94.187.9.93 anywhere DROP all -- 244.33.109.208.host.secureserver.net anywhere DROP all -- www-gs6.kgoma.com anywhere DROP all -- 107.151.10.2 anywhere DROP all -- static-68-235-57-202.cust.tzulo.com anywhere DROP all -- static-68-235-62-219.cust.tzulo.com anywhere DROP all -- static-208-77-20-227.cust.tzulo.com anywhere DROP all -- static-68-235-40-84.cust.tzulo.com anywhere DROP all -- ec2-18-179-8-8.ap-northeast-1.compute.amazonaws.com anywhere DROP all -- static.213-239-221-145.clients.your-server.de anywhere DROP all -- 162.212.152.19 anywhere DROP all -- 130.80.238.104.host.secureserver.net anywhere DROP all -- 111.229.118.208 anywhere DROP all -- shared07.friend-server.com anywhere DROP all -- 45.88.67.165 anywhere DROP all -- ec2-13-208-106-253.ap-northeast-3.compute.amazonaws.com anywhere DROP all -- 45.88.67.174 anywhere
その他
「OSSでシンプルで自由にブロックルールを書けるIPブロッカーは?」と聞かれて良いモノを見つけられ無かったので手元のスクリプトを公開しました。そこまでリアルタイム性は高い必要はないのでパフォーマンス/使い勝手とのトレードオフであまり頻繁にGCしたりログ監視をしたりしません。それでも実用には十分だと思います。「役に立った」と思ったらリポジトリに☆を付けて貰えたら参考になります!
100行もあれば結構使えるモノを書けます。攻撃を繰り返すIPアドレスをブロックするスクリプトを書いた人は沢山居ると思います。かなり適当に書いていたモノを少し手直しして公開しています。バグがある場合はGIt HubのIssueで送ってください。
自分自身をブロックしないよう、ホワイトリストを定義してから試すことをオススメします!