httpd invoked oom-killerでページビューが激減

ページビューが激減していたので原因を調べてみたら”httpd invoked oom-killer”のエラーが大量に発生していました。そして、”httpd invoked oom-killer”のエラーが発生した原因を調べていたら、WordPressのxmlrpc.phpに対する大量アクセスを受けている事が分かり、その対策を行いました。その対応を備忘として残します。

発覚から調査、対応の履歴


 
1)ページビュー激減。ページにアクセスできない
 
・WordPressサイトのページビューが通常の1/3程度と激減している事が発覚。
 
・ページにアクセスするとデータベースにアクセスできないといったエラー。
 
2)サーバー(CentOS6.5)にログインしてログ調査
  
①messagesを調査
  
# more /var/log/messages
# tail /var/log/messages
 
すると下記エラーが発生していました。
 
kernel: Out of memory: Kill process 29511 (httpd) score 11 or sacrifice child
kernel: Killed process 29511, UID 48, (httpd) total-vm:422840kB, anon-rss:4320kB, file-rss:80kB
kernel: httpd invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
 
下記コマンドで調べると”httpd invoked oom-killer”が大量に発生していました。
 
# grep “httpd invoked oom-killer” /var/log/messages | more
 
●OOM Killerとは?
 
OOM Killerは、システムのメモリが枯渇すると稼動中のプロセスを強制終了させて空きを確保するLinuxカーネルの仕組み、だそうです。
 
②Webサイトのアクセスログを調査
 
なぜ、”httpd invoked oom-killer”のエラーが発生したかについていろいろ調べているとWebサイトのアクセスログにDOSアタックを受けているかのような大量アクセスの記録がありました。
 
$ more /etc/httpd/logs/xxxx-access_log
 
74.52.xxx.xxx – – [25/Jul/2014:21:27:04 +0900] “POST /xmlrpc.php HTTP/1.0” 200 435
 
●xmlrpc.phpとは?
 
下記サイトに詳しく説明されていました。
http://d.hatena.ne.jp/Kango/20140313/1394673178
 
・WordPressのXMLRPCを使ったリモート投稿の仕組み。
 
・WordPressのpinbackを悪用したDOS攻撃に使われる事がある。
 
3)”POST /xmlrpc.php”大量アクセスに対する対策
 
①XML-RPC機能を無効にするプラグインを導入。
 
XML-RPC機能は、WordPress3.5以降でデフォルトで有効になっているようで、下記プラグインによって無効に出来るようです。ただし、WordPress3.8.1以上に対応しているとのことです。
http://wordpress.org/support/view/plugin-reviews/disable-xml-rpc-pingback
 
②”xmlrpc.php”へのアクセスを制限する
 
①の対応を行っても何故かアクセスが続いていたので、こちらの方法も合わせて行いました。
 
Apacheの設定ファイルに”xmlrpc.php”に対するアクセスを制限するように設定しました。とりあえず必要なIP以外はすべて拒否にしました。

<Files xmlrpc.php>
    Order deny,allow
    Deny from all
    Allow from 自サイトのIP/24
</Files>

するとアクセスログは下記のようにHTTPリターンコードが200から403(Forbidden)に変りました。
“POST /xmlrpc.php HTTP/1.0” 403 275
 
③ファイアウォール(iptables)で拒否
 
②の対応で自サイトが踏み台にされて他サイトに迷惑がかかる事はなくなったかと思います。ただ、403で禁止されたとしてもHTTPレベルで大量のアクセスがある事自体は続いていて(200の場合に比べれば負荷は減っていると思いますが)、アクセスログも大量に記録されているのは望ましくないと思い、大量にアクセスしてくるIPアドレスを特定してファイアウォールで拒否する設定も行いました。
 
# vi /etc/sysconfig/iptables
-A INPUT -s 74.52.●●●.●●●/24 -j DROP

# service iptables restart
 
 
この状態で少し様子を見てみようと思います。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です