いつものように、管理してるブログをチェックしてみると・・お、重い。
いや重いどころの話じゃない・・ sshすらままならない。
VPSのコントロールパネルから現在の負荷を見ると・・
DiskIO 150MB/sec、CPU使用率 1000msec、トラフィック 75kbps。負荷高い。特にDiskIOやばい。
こんなのずーっと続いたらサーバーのSSD逝っちゃうんじゃないか。
何が起こった・・
なんとかログインして、topコマンドで調査してみると
top - 09:55:03 up 2:46, 2 users, load average: 32.72, 8.29, 6.68 Tasks: 153 total, 1 running, 152 sleeping, 0 stopped, 0 zombie Cpu(s): 11.7%us, 28.0%sy, 0.0%ni, 0.0%id, 35.5%wa, 0.0%hi, 0.6%si, 24.3%st Mem: 1020184k total, 970664k used, 49520k free, 740k buffers Swap: 2097148k total, 2097128k used, 20k free, 10868k cached 7214 apache 20 0 341m 15m 784 D 3.4 1.5 0:00.57 httpd 7160 apache 20 0 350m 10m 108 D 3.2 1.1 0:00.92 httpd 7237 apache 20 0 309m 8916 1296 D 3.2 0.9 0:00.12 httpd 7215 apache 20 0 345m 21m 988 D 2.9 2.1 0:00.58 httpd 6791 mysql 20 0 1154m 5648 1256 S 2.6 0.6 0:05.24 mysqld 7220 apache 20 0 336m 13m 1020 D 2.6 1.4 0:00.52 httpd 7228 apache 20 0 337m 28m 992 D 2.6 2.9 0:00.36 httpd 7229 apache 20 0 337m 28m 1184 D 2.6 2.9 0:00.35 httpd 7129 apache 20 0 350m 8876 44 D 2.4 0.9 0:00.88 httpd 7167 apache 20 0 350m 11m 384 D 2.4 1.2 0:00.81 httpd 7224 apache 20 0 337m 29m 1344 D 2.4 3.0 0:00.37 httpd 7235 apache 20 0 309m 8820 1292 D 2.4 0.9 0:00.12 httpd 7236 apache 20 0 309m 8912 1296 D 2.4 0.9 0:00.10 httpd 7139 apache 20 0 350m 7792 44 D 1.9 0.8 0:00.85 httpd 7143 apache 20 0 350m 8432 36 D 1.9 0.8 0:00.87 httpd 7145 apache 20 0 350m 8812 44 D 1.9 0.9 0:00.85 httpd 7162 apache 20 0 346m 8580 720 D 1.9 0.8 0:00.79 httpd 7171 apache 20 0 350m 12m 44 D 1.9 1.2 0:00.80 httpd 7173 apache 20 0 350m 11m 44 D 1.9 1.1 0:00.77 httpd 7177 apache 20 0 348m 10m 1148 D 1.9 1.0 0:00.77 httpd 7179 apache 20 0 346m 7804 644 D 1.9 0.8 0:00.74 httpd 7216 apache 20 0 336m 12m 716 D 1.9 1.3 0:00.44 httpd 7221 apache 20 0 333m 18m 1156 D 1.9 1.8 0:00.40 httpd
oh…、apacheのプロセスが立ち上がりすぎぃぃ、メモリ無さすぎぃぃ、Swapしすぎぃぃ。
アカン。
Webの知識の薄い自分は、apacheバグった?wordpress変な事した?
とバグを疑いました。
ひとまず、原因らしいapacheをみたいけど終了してみる。
service httpd stop
うむ、軽くなった。
service httpd start
うむ、重くなった。orz
重い原因をみたいけど、コマンドすらままならない重さ。
とにかくapacheが立ち上がりまくってswapしまくってるせいなことはわかる。
apacheが重いときの対処を調べて、以下の対処を入れてみる。
httpd.confの以下の部分を
StartServers 8 MinSpareServers 5 MaxSpareServers 20 **ServerLimit 256 MaxClients 256 MaxRequestsPerChild 1000**
↓こんなかんじに変えてみる。
StartServers 8 MinSpareServers 5 MaxSpareServers 20 **ServerLimit 32 MaxClients 32 MaxRequestsPerChild 0**
これでひとまず、apacheのプロセスが最大32個までしか立ち上がらなくなって、Swapまで使い果たすことはなくなった。
まだ重いが、なんとかコマンドなどの通常操作はできるレベルになった。
これでやっと調査が始められる段階。根本の問題はなんなんや・・。
と冷静に考えてみて、apacheのログがあったことに気づく。
accessログを見てみると・・
21844 191.96.249.54 - - [20/Feb/2017:12:07:39 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21845 191.96.249.54 - - [20/Feb/2017:12:07:54 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21846 191.96.249.54 - - [20/Feb/2017:12:07:47 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21847 191.96.249.54 - - [20/Feb/2017:12:08:03 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21848 191.96.249.54 - - [20/Feb/2017:12:07:51 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21849 191.96.249.54 - - [20/Feb/2017:12:07:50 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21850 191.96.249.54 - - [20/Feb/2017:12:08:11 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21851 191.96.249.54 - - [20/Feb/2017:12:08:04 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370 21852 191.96.249.54 - - [20/Feb/2017:12:08:24 +0900] "POST /xmlrpc.php HTTP/1.0" 200 370
おお・・なんかすごい頻度でアクセス来てる・・
うーむ、これってもしかしていわゆるDOS攻撃ってやつなんだろうか・・
調べると、XML-RPCPingbackDDoS攻撃 などというものらしい。
ログから分かる通り、xmlrpc.phpがらみのDos攻撃。IPもググるとヒットする。
有名なDos攻撃らしい。
これへの代表的な対処方法は2つ
- xmlrpc.phpにアクセスしてきたら、0.0.0.0などの無効IPへリダイレクトしてしまう
- 特定のIPからのアクセスを限定する(または特定のIPからのアクセスのみに限定する)
調べていると、最善手はリダイレクトってよくでてくる。そっちのほうが負荷が軽くなりえるとか。
ただ、手元で試す分には、両手法ともapacheの起動は抑制できてメモリCPU負荷は下がったが、トラフィックは減っていない。負荷の高さも差はないように見えた。
いまいちリダイレクトのほうがいいという根拠は不明(ちゃんと調べてない)。正式な対処としては、IPフィルタのほうがっぽいとは思うんだけれど。
そして、xmlrpc.phpを使わないならいいのだけれど(ふつう使ってないでしょなんてかかれているところも多いけれど)、自分の環境ではvimからWordpressへ投稿するためのvimrepressプラグインさんが、見事xmlrpc.phpを使っている。
というわけで、.htaccessに以下を記述してDOS攻撃元のIPアクセスを制限。
# 特定ホストのアクセス制限 order allow,deny allow from all deny from 191.96.249.54
ホントに安全なのは、自分のIPだけ許可。でも、グローバルIPはプロバイダの都合でどういつ変わるかわからないもの。
プロバイダが提供してるIPサブネットレベルで許可する方法もあるみたいだけど。とにかく、まずこの攻撃をブロックしたい。ので手っ取り早くこれ。
というわけで、ブログ書けるようになりました。
ちなみに、.htaccessはwordpressインストールディレクトリのものを使用。
大元のapacheのコンフィグhttpd.confは
AllowOverride None
で基本的に.htaccessは参照されない設定のまま。
別に作ったvhos.confの中で設定して、hoge以下の.htaccessのみが有効になっている。
AllowOverride All
追記
xmlrpc.phpはそれから2日経っても続く。でも、IPフィルタで404になってるから特に問題は起こってない。ただ、トラフィック負荷は一定量かかってるので、できればそれもなんとかしたいところだが。
そして、そのときログを確認してみると、新たに以下のアクセスが。
62.210.146.49 - - [23/Feb/2017:07:37:54 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:37:56 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:37:57 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:00 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:01 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:04 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:05 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:06 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:07 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:10 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.210.146.49 - - [23/Feb/2017:07:38:12 +0900] "POST /wp-login.php HTTP/1.1" 200 3309
おう・・今度はwp-login側ですか。
ブルートフォースアタックってやつらしい。
wp-login.phpへのアクセスの場合は、apacheプロセスが乱立するわけではないようなので、負荷的にはあまりあがらない。ので負荷だけみてると気づけない。
うーむ、やはりIPフィルタは除外式ではなく、許可式にするか・・。
というわけで、自分のIP情報調べて、サブネットフィルタ式にしようと思う。
さらに追記
さらに後日、アクセスログを見てみると
62.210.146.49 - - [23/Feb/2017:08:51:05 +0900] "POST /wp-login.php HTTP/1.1" 403 214 62.210.146.49 - - [23/Feb/2017:08:51:08 +0900] "POST /wp-login.php HTTP/1.1" 403 214 62.210.146.49 - - [23/Feb/2017:08:51:08 +0900] "POST /wp-login.php HTTP/1.1" 403 214 62.210.146.49 - - [23/Feb/2017:08:51:09 +0900] "POST /wp-login.php HTTP/1.1" 403 214 103.19.180.109 - - [23/Feb/2017:09:08:56 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 177.234.147.202 - - [23/Feb/2017:09:10:18 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 62.109.22.144 - - [23/Feb/2017:09:23:10 +0900] "POST /wp-login.php HTTP/1.1" 200 3373 185.30.144.125 - - [23/Feb/2017:10:41:46 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 85.121.182.27 - - [23/Feb/2017:13:01:15 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 37.187.111.145 - - [23/Feb/2017:13:26:56 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 150.145.80.132 - - [23/Feb/2017:13:49:16 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 42.145.49.50 - - [23/Feb/2017:14:07:48 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 64.69.86.199 - - [23/Feb/2017:16:42:17 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 203.219.92.242 - - [23/Feb/2017:16:51:55 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 185.119.81.50 - - [23/Feb/2017:16:55:54 +0900] "GET /wp-login.php HTTP/1.1" 200 2324 185.119.81.50 - - [23/Feb/2017:16:55:56 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 5.77.44.183 - - [23/Feb/2017:17:28:00 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 37.187.112.198 - - [23/Feb/2017:19:03:08 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 182.254.233.191 - - [23/Feb/2017:19:07:57 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 195.81.69.230 - - [23/Feb/2017:21:16:26 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 209.55.1.105 - - [23/Feb/2017:21:51:04 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 5.39.219.24 - - [23/Feb/2017:21:51:16 +0900] "GET /wp-login.php HTTP/1.1" 200 2324 5.39.219.24 - - [23/Feb/2017:21:51:17 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 91.228.199.104 - - [23/Feb/2017:22:35:30 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 51.254.219.9 - - [23/Feb/2017:22:44:57 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 37.187.71.95 - - [23/Feb/2017:22:53:27 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 31.184.194.91 - - [23/Feb/2017:23:27:54 +0900] "POST /wp-login.php HTTP/1.1" 200 2671 31.184.194.91 - - [23/Feb/2017:23:27:56 +0900] "POST /wp-login.php HTTP/1.1" 200 2671 62.109.18.151 - - [24/Feb/2017:01:52:34 +0900] "POST /wp-login.php HTTP/1.1" 200 3373 52.88.92.101 - - [24/Feb/2017:02:17:46 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 188.165.180.27 - - [24/Feb/2017:02:48:35 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 78.220.114.32 - - [24/Feb/2017:03:12:50 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 64.90.48.104 - - [24/Feb/2017:03:14:11 +0900] "POST /wp-login.php HTTP/1.1" 200 3309 198.1.94.95 - - [24/Feb/2017:05:43:53 +0900] "POST /wp-login.php HTTP/1.1" 200 3309
62.210.146.49
だけは個別にブロック設定していたので403(アクセス拒否)になっている。
しばらくはそれでいけると思っていたのが甘かった・・。
頻度は高くないけど、様々なIPからWordpressログインは試行されている模様。
これは完全に、IPフィルタは許可型にしなければならない。
ってことで、以下のように変更。
変更前
#特定ホストのアクセス制限 order allow,deny allow from all deny from 191.96.249.54 deny from 62.210.146.49
変更後
#特定ホストからのみアクセス可能 order deny,allow deny from all allow from 126.0.0.0/8
これで、同様に変なIPからは403へブロックされながら、自分のログインは問題ないのを確認できた。
いや、待てよ・・
これって、サイトコンテンツすべてへのアクセスが一部のIPに限定されているんじゃ・・
手元だと、携帯含めておなじサブネットないだから確認できない・・。確認してから直そう・・。
参考:
WordPressに対しての最近のDDosアタックへの対処法
自分のPCのみアクセス許可したいが、プロバイダによってグローバルIPが一定間隔で変化してしまう場合の対処法
コメント