【緊急事体発生】ITかあさんブログがDOSアタック攻撃発生!!
ITかあさんの運営するサーバーが突如CPU70%越えて、MySQLに繋がらない問題発生!
ITかあさんのブログはWindowsAzureというクラウドサーバーで運用されています。ちなみにITかあさんの運営されているサーバーのスペックは以下の通り。
2 コア、3.5 GB メモリ CentOS6
まあ、一端のエンジニアごとき戯れ言のブログですから、これくらいあれば十分ですね。
夜間〜朝方にかけて猛烈なDOS攻撃!落ちるMySQL、繋がらないApacheサーバー
ざっけんなー!こらー!
こちらのグラフが明け方から落ち着きを取り始めた現在のWindowsAzureのCPU使用率なのですが、グラフの山が盛り上がっていますね。
あまりの重たさに一時的に
3 コア、7 GB メモリ
までメモリを増しましにした状態で、CPU60%越えに振り切れているっちゅーことで半端じゃないCPUの使用率ということがお分かり頂けると思います。
まずは冷静に状況の分析
サーバーが落ちる時点でもう顔面蒼白なのですが、メモリを一時的に増大させて何とかサイトを復旧させてここで一旦冷静に状況の分析から。なんとなーく原因はDOSくらっているんだろうなあと過去の経験から分かっているのですが。。
まずは冷静に状況の分析
明らかにCPUが高過ぎるので、「何がCPUを大量に消費しているのか」を調べます。
# ps au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1997 0.0 0.0 4060 584 tty1 Ss+ Feb17 0:00 /sbin/mingetty
root 1979 0.0 0.0 4060 584 tty5 Ss+ 00:56 0:00 /sbin/mingetty
root 1981 0.0 0.0 4060 584 tty6 Ss+ 00:56 0:00 /sbin/mingetty
apache 2056 3.1 0.5 480216 38728 ? S 00:56 1:06 /usr/sbin/httpd
apache 2258 3.2 0.5 479168 39076 ? S 00:56 1:07 /usr/sbin/httpd
apache 2272 3.3 0.5 478932 38792 ? S 00:56 1:10 /usr/sbin/httpd
apache 2509 3.3 0.5 476300 36152 ? S 01:00 1:01 /usr/sbin/httpd
apache 2615 3.4 0.5 480420 40356 ? S 01:02 1:00 /usr/sbin/httpd
。。。。。。。。
apacheが多いなあ。。
# ps aux | grep httpd
すると
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
apache 2056 3.1 0.5 480216 38728 ? S 00:56 1:06 /usr/sbin/httpd
apache 2258 3.2 0.5 479168 39076 ? S 00:56 1:07 /usr/sbin/httpd
以下100行ほどapacheのプロセスが大量に渡って来ます。
試しにGoogleアナリティクスでリアルタイムのアクセス状況拾ってもその時間にサイトにアクセスしているのは朝方っていうこともあって数人しかおりません。
(っつーか1回のapacheプロセスに対して、CPU3%超えるようなアクセスってなんだよ!という話であってですね。もうこれはDOSアタックしかないですね)
DOSアタックの対処。国外アクセスの禁止
いつ落ちてもおかしく無いので一時的に国外からのアクセスを禁止します。(この手のDOSは中国系のDOSアタックが多いのは経験済みなので)
こちらのサイトから国外からのアクセスを禁止できる.htaccessを入手できますので、一先ずこれをWordPressの閲覧可能ディレクトリの直下の.htaccessにコピペします。
ただしこれをそのままにしておくことは出来ません。なぜならこのままだとfacebookからサイトにアクセスすることができないのでogpの取得ができなくなるのでソーシャルに一切対応していないサイトになってしまうからです。なので対処としては一時的に。
mod_evasiveモジュールの追加
Apacheのmod_evasiveモジュールでDOSアタックに対処します。1秒間に●●回アクセスしてくるIPアドレスを●●秒アクセス禁止にする
という設定が可能な有名なモジュールですね。
epelリポジトリが追加されているサーバーであればyumコマンドでインストール出来ます。
#yum install mod_evasive
#mkdir /var/lock/mod_evasive ログディレクトリ
#chown apache:apache /var/lock/mod_evasive ログディレクトリへのアクセス権
mod_evasive.confの設定を変更します。
# vi /etc/httpd/conf.d/mod_evasive.conf
テストコマンドは以下。バージョンによって変わるので、/usr/share/docをlsコマンドで中身確認してtestスクリプトを実行してください。
perl /usr/share/doc/mod_evasive-1.10.1/test.pl
ちなみに私はテストすら出来ませんでした。
何度やってもテストがぜーんぶ200 OKでレスポンスが返ってくるんですね。最初なんでだろう!って辛くなったんですが、冷静に考えてみればこのテストの最中もアホか!ってほどDOS喰らっていたので、テストのシェルスクリプト1行ごとの実行に1秒より多くかかっていたためにまともにテストできなかったんですよ。あるんだねー、テストすらできなくなるほどのDOSアタック。
そんなわけでまとめ
CPUが突然爆発的に消費をはじめたらpsコマンドで原因を突き止めて、サイトのアクセス数に対してhttpdに対するCPUが爆発的に消費されていたらDOSアタック対策を行うこと。
以上!
追記
mod_evasiveは正しく設定できていたはずなのに、海外からのアクセスをもう一度許可をすると再びCPUが激しく増加しました。自分のサイトへの攻撃はDOSではなくDDOS(ディードス)だったもようで、mod_evasiveだけでは防ぐことが出来ませんでした。
ゆえに自分は海外からのアクセスは完全に拒否する対策を取って、facebookでOGPキャッシュを作る時だけ海外アクセスを許可する方法を取りたいと思います。出来れば国内だけに限定させるのは自分としてはあまりいい対処だとは思ってはいないので今後もDDOSへの対策を考えたいと思います。