2週間ほど前から当ブログのmysqlが頻繁に落ちるようになり、またAWSでWordPressやってて頻繁にmysqlがデータベース接続確立エラーでダウンする現象の回避策かなーと思いつつ、対処療法でプロセス再起動とか、インスタンス再起動で凌いでいたんですが、ここ数日はどうもサーバ自体が異常に重くなってしまう現象が起きていたのでちゃんと調べてみました。
毎秒数回のPOSTリクエスト
調べた結果、インスタンスが立ち上がった瞬間、あっという間にロードアベレージが300とかまでぐんぐん上がっていくことが確認できました。そりゃー重くもなります。プロセスを見てみるとどうもapacheが大半を占めています。
とりあえず、ここまで負荷が高まるとサーバが重すぎてログインすらおぼつかない感じだったので、awsから自宅IP以外からの80ポートをシャットダウンしてみたところ、(自宅からのみ)快適にアクセスできるようになりました。
一瞬、バズったのかと思いましたが、そんなこともなくログを見てみると
$ less /var/log/httpd/access_log 185.130.4.197 - - [01/May/2016:03:15:09 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" 185.130.4.197 - - [01/May/2016:03:15:19 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" 185.130.4.197 - - [01/May/2016:03:15:18 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
「xmlrpc.php」ファイルに対して毎秒数回のPOSTリクエストが送信されていました。 これはDoS攻撃の踏み台にするためのPOSTリクエストらしいです。オランダから送信されていました。恐ろしやー、大量のアタックを受けてapacheのプロセスが膨れ上がりサーバの負荷も上がり、mysqlも同時接続数を超えて落ちていた、というような感じみたいです。
対策
xmlrpc.phpは、メールやアプリなどで更新していると必要になるみたいですが、基本ブラウザからしか更新しないので対策として、.htaccessに設定を入れて、このファイルにアクセスがあったときはhttp://0.0.0.0/にリダイレクトすることにしました。
$ vim .htaccessRewriteEngine On RewriteBase / RewriteRule ^xmlrpc\.php$ "http\:\/\/0\.0\.0\.0\/" [R=301,L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
この結果、相変わらずアタックは受けていますが、リダイレクトされるようになりサーバに負荷はかからなくなりました。
$ less /var/log/httpd/access_log 5.10.73.4 - - [02/May/2016:13:15:22 +0900] "POST /xmlrpc.php HTTP/1.0" 301 223 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" 5.10.73.4 - - [02/May/2016:13:15:24 +0900] "POST /xmlrpc.php HTTP/1.0" 301 223 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" 5.10.73.4 - - [02/May/2016:13:15:25 +0900] "POST /xmlrpc.php HTTP/1.0" 301 223 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
SSHに対するブルートフォース攻撃
ちなみに/var/log/secureをみてみると中華人民共和国のIPからSSHに対するブルートフォース攻撃も受けていました。
May 2 13:14:59 ip-172-31-19-188 sshd[4443]: Failed password for root from 183.3.202.114 port 43174 ssh2 May 2 13:15:00 ip-172-31-19-188 sshd[4443]: Failed password for root from 183.3.202.114 port 43174 ssh2 May 2 13:15:00 ip-172-31-19-188 sshd[4443]: Failed password for root from 183.3.202.114 port 43174 ssh2 May 2 13:15:00 ip-172-31-19-188 sshd[4443]: Received disconnect from 183.3.202.114: 11: [preauth]
いかん、いかんぜよ。 とりあえず、fail2banをインストール。
$ sudo yum install --enablerepo=epel fail2ban $ sudo service fail2ban start $ sudo service fail2ban status $ sudo chkconfig --add fail2ban $ sudo chkconfig fail2ban on $ chkconfig --list fail2ban $ sudo mkdir /var/log/fail2ban $ vim /etc/fail2ban/fail2ban.conf ## /etc/fail2ban/fail2ban.conf # logtarget = SYSLOG # コメントアウト logtarget = /var/log/fail2ban/fail2ban.log # 追加 $ sudo service restart
これでSSH不正攻撃がBANされます。 あとは利便性のために22ポートを広く開けてたけど、やっぱりよくないよなということで自宅からのみ許可に変えました。
めでたく通常状態に戻り、迷惑だったわけですが、何か問題が起きると調べて勉強になるので、ありがた迷惑ならぬ、迷惑ありがた、でもありました。