404が増えてたり、突発的なアクセスがあったり、攻撃が行われているような気がしたときにやることをまとめました。
今回は「404の急増」を例にあげてますが、他の場合にも応用が効くとおもいます。
「他にもこんな方法があるよ!」などあれば教えていただきたいです。
今回は「2015/10/6の15:10-15:20に404が増えている」という状況を仮定してみます
1. 異常値が検出されたときのログを見る
2015/10/6の15:10-15:20のアクセスだけを抽出する
grep "06/Oct/2015:15:1[0-9]:" access.log
2. 404のリクエストの情報だけを抜き出す。
1のうち、404のリクエストとそれに付随する情報だけ抜き出す。
※ ログの形式によって、"$数字"の数字が違います。combinedだとこのまま使えるはず。。。
1: IP
7: リクエストパス
9: httpステータス
12,13: ユーザーエージェントの一部
grep "06/Oct/2015:15:1[0-9]:" access.log | awk '$9=="404"{print $1, $9, $7, $12$13}'
3. アクセスが多いIPを見つける
sort
とuniq -c
を使って、IPごとのアクセス数を昇順で出す
(昇順だと、一番多いのが見える範囲に出力されるから)
grep "06/Oct/2015:15:1[0-9]:" access.log | awk '$9=="404"{print $1, $9, $7, $12$13}' | sort | uniq -c | sort
4. アクセスIPから、情報を割り出す
おなじIPが多く検出されたら、そのIPの情報を持ってくる
whois [IP]
ちゃんと登録されていれば、Organizationなどがあるはずなので
whois 133.242.231.207 | grep Organization
#=> Organization: Asia Pacific Network Information Centre (APNIC)
などで確認する
5. その後の対応
だいたい、海外サーバーを経由したcrawlerのアクセスでしょう。自分達の設定ミスによるものでない限りは、無視するか、特定のIPを弾きます。
crawlerのアクセスがサイトパフォーマンスに影響を与えるくらい深刻な場合は、あくまで一例ですが
・fail2banなどでエラーを出しまくるIPをbanする
・落ちてもすぐ復旧できるようにmonitを設定しとく
・異常通知が来るように、awsのアラート設定しておく
などの対応を行います。