Sponsored Link

WordPressにDos攻撃を受けて対処

いつものように、管理してるブログをチェックしてみると・・お、重い。

いや重いどころの話じゃない・・ 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


Sponsored Link

追記

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が一定間隔で変化してしまう場合の対処法

Sponsored Link

フォローする