「あれ?最近EC2のCPU使用率が妙に高いぞ?」
CloudWatch を覗くと、いつもは5%程度のCPU使用率グラフが数分で一気に95%くらいまで駆け上がる異常状態。topコマンドを叩くと、httpd と php-fpm が走りまくってる。
「これは……何かが……来ている……!」
ログを辿っていくと、見慣れぬIPからの連打が。
GET /phpMyAdmin/scripts/setup.php GET /webadmin/scripts/setup.php GET /pma/scripts/setup.php
phpMyAdmin や sqlweb、dbadmin など、過去によく使われた Web管理ツールの既知パスをスキャンし、不適切に公開された setup.php を探す謎のスキャナに遭遇。しかもアクセスのたびに WordPressのcanonical.php が悲鳴を上げていた:
PHP Warning: Undefined array key "host" PHP Warning: Undefined array key "scheme"
WordPressも困ってる。Apacheも焦ってる。
これはもう「戦うしかない」。
まずは攻撃元を叩き落とすため、iptablesでDROPルールを叩き込みます。(XXX.XXX.XXX.XXXは攻撃者のIPアドレス)
sudo iptables -A INPUT -s XXX.XXX.XXX.XXX -j DROP
シュッ。静寂が戻る。
しかも iptables-save しておけば再起動後も忘れない(:
sudo iptables-save | sudo tee /etc/sysconfig/iptables > /dev/null
でも忘れがちなので、systemctlで自動起動もON!
sudo systemctl enable iptables sudo systemctl start iptables
なんだと!悪いヤツらは一人じゃないって?
104.234.x.x や 198.235.x.x など、名前は違えど顔は同じbotたちが続々と来襲。
手動で追加ブロックも面倒になってきたころ、ふと気づく。
そうだ、fail2banがあるじゃないか!
というわけで、Amazon Linux 2 に fail2ban を導入。
最初は「パッケージないじゃん!」と突っ込まれるも…
sudo amazon-linux-extras enable epel sudo yum clean metadata sudo yum install epel-release -y sudo yum install fail2ban -y sudo systemctl enable fail2ban sudo systemctl start fail2ban
Apacheログを監視する jail を有効にする
sudo vi /etc/fail2ban/jail.local
次のように記述
[apache-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/httpd/access_log maxretry = 5 bantime = 86400 findtime = 600
再起動
sudo systemctl restart fail2ban
これで準備OK!
あとは設定して監視開始。今後は404連発とかしたやつは自動でBANだ!
せっかく導入した fail2ban、
見てみると……
sudo fail2ban-client status apache-badbots
出力:
Currently banned: 0 Total banned: 0
……おい。
どうやら標準の apache-badbots じゃ力不足らしい。スキャナたちは賢く、User-Agentを偽装していた。
以下を /etc/fail2ban/jail.local に追記:
[apache-404] enabled = true port = http,https filter = apache-404 logpath = /var/log/httpd/access_log maxretry = 10 bantime = 86400 findtime = 600
※ jail.local はfail2ban全体の監視対象を定義する設定ファイルです。jail.confは編集せず、jail.localを使いましょう。
フィルター定義ファイルも作成(どこに?)
以下を /etc/fail2ban/filter.d/apache-404.conf として新規作成:
[Definition] failregex = ^<HOST> -.*"(GET|POST) .* HTTP.*" 404 ignoreregex =
fail2ban 再起動で有効化
sudo systemctl restart fail2ban
その後どう?
sudo fail2ban-client status apache-404
で確認すると、短時間に /notfound1, /phpmyadmin2, /admin/setup.php などを連打してくるbotは見事にBANされます。
今回コストの関係でCloudFrontもロードバランサも導入しませんでした(特にロードバランサは導入すれば総コストが倍近くなるんで・・)が、
だけどもさ、やっぱりいろいろ危ういので最終的には CloudFront(or ALB) + WAF しかないんだよね。
WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!