/var/log/httpd/error_log に記録される「client denied by server configuration」のエラーログについて、
エラーの原因となっているアクセス元IPを一括で抽出する方法を紹介します。
エラーログについて
/var/log/httpd/error_log に下記のログが記録されます。
[client 142.4.218.114:60575] AH01630: client denied by server configuration:
エラーの内容は対象ディレクトリへのアクセス失敗です。
意図しないIPからのアクセスであればApacheの設定で正常にブロックできているので問題ないのですが、
DoS攻撃を受けてたりするとログの件数が大量になるので、アクセス元IPを確認したい時があります。
IPアドレス抽出方法
抽出方法はシンプルに grep です。
$ sudo grep 'client denied by server configuration' /var/log/httpd/error_log | egrep -o '[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}' | sort -n | uniq -c | sort -nr | head -5
104 20.111.16.183
72 95.214.235.216
44 193.32.162.159
29 35.212.148.28
20 179.43.177.243
$
解説
1.grep 'client denied by server configuration' /var/log/httpd/error_log
/var/log/httpd/error_log から「client denied by server configuration」のログのみを抽出
2. egrep -o '[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}'
拡張正規表現を使うので egrep (grep -E でも可)
IPアドレスは 192.168.0.1 など、XXX.XXX.XXX.XXX の形式なので、0~9 の数字が 1~3回出現 × 4回 という表現で指定
オプションで -o を指定しているので、行全体ではなく、一致したIPアドレスの部分のみが抽出されます。
3. sort -n | uniq -c | sort -nr | head -5
2 で抽出したIPアドレスを sort で整列させた後、uniq -c で件数カウント。件数を降順で再度 sort して上位 5件のみ表示。
uniq -c は隣接していないと同一の値としてカウントされないので sort を挟む必要があります。sort → uniq → sort はよく使いますね。
まとめ
100件以上検知していたIPアドレス 20.111.16.183 を whois で調べると、US(アメリカ) からのアクセスでした。
正常にブロックされてますね。
今回は grep だけで抽出しましたが、awk と合わせると時間帯ごとのアクセスも取れそうです。
参考:
Apacheのエラーログについて
気に入ったらぜひ共有してください。