ウェブノウハウ

WEB KNOWHOW

サーバーは専門外のエンジニアのサーバートラブルからの解決劇

EC2にbotがやってきた!~phpMyAdminスキャンbotからの緊急避難対応~

ある日、サーバーが重かった

「あれ?最近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でシュッと制裁

まずは攻撃元を叩き落とすため、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を偽装していた。

じゃあ作ろう、自作の404検出ルール!

以下を /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されます。

まとめ:EC2直アクセスはツラいよ

今回コストの関係でCloudFrontもロードバランサも導入しませんでした(特にロードバランサは導入すれば総コストが倍近くなるんで・・)が、

  • EC2を直接ネットに晒すのはあんまりだね
  • WordPressは意外とログ吐きまくる(canonical.php さん、お疲れ様でした)
  • 緊急措置として iptables + fail2ban の2段構えでひとまずの危機は回避できる

だけどもさ、やっぱりいろいろ危ういので最終的には CloudFront(or ALB) + WAF しかないんだよね。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!