Apache Webサーバのエラーログから日別、ホスト名・IPアドレス毎にエラー数を集計するシェルスクリプト(バッチ処理プログラム) ~サーバーやミドルウェアの脆弱性を狙ったサイバー攻撃、Dos攻撃、WordPress等のソフトウェアへの攻撃検知にも使えるエラー集計~

2月 24, 2017AWS,EC2,Programming,Shell Script

前回、下記の記事でApacheのアクセスログを集計するシェルスクリプト(バッチ処理プログラム)を紹介しました。

参考記事:Apache Webサーバのアクセスログから日別、ホスト名・IPアドレス毎にアクセス数を集計するシェルスクリプト(バッチ処理プログラム) ~JavaScriptが動作しないクローラー、コマンドでのアクセスにも対応したログファイルを用いた集計方法~

アクセスログに加えて、Webサーバを運用する上でどのようなIPからのアクセスでエラーが出ているかを知っておくことも重要な事です。

最近ではGoogleアナリティクスなど高性能なツールでウェブブラウザからのアクセス分析をすることが可能になりましたが、Webサーバで発生したエラーログを分析する機能を持ち合わせているパッケージは少ないでしょう。

特にJavaScriptが動作しないクローラーやCurl、Wgetなどのコマンドでのアクセスで発生したエラーはWebサーバのエラーログを直接参照する必要があります。

さらにエラーログを定期的に監視することはサーバーやミドルウェアの脆弱性を狙ったサイバー攻撃、Dos攻撃、Wordpress等のソフトウェアへの攻撃に気づくことにも繋がります。

今回はクローラーやコマンドなどのウェブブラウザ以外からのアクセスも含んだWebサーバのエラーログから日別、ホスト名・IPアドレス毎にエラー数を集計するシェルスクリプト(バッチ処理プログラム)を備忘録として記載します。

Apache Webサーバのエラーログから日別、ホスト名・IPアドレス毎にエラー数を集計するシェルスクリプト(バッチ処理プログラム) ~サーバーやミドルウェアの脆弱性を狙ったサイバー攻撃、Dos攻撃、Wordpress等のソフトウェアへの攻撃検知にも使えるエラー集計~

基本方針としてはエラーログファイルのパスに「*」を付けてログローテーションしたファイルも含めて日付指定で集計します。

Apache Webサーバのエラーログから日別、ホスト名・IPアドレス毎にエラー数を集計するシェルスクリプト(バッチ処理プログラム)

引数に整数を入力することで当日から数えて引数の日数前のアクセス数を集計できるようにしています。

また、「all」を引数にすると全ての日付に対して集計をかけることができます。

集計した結果はアクセス数が少ない順にソーティングして表示しています。

vim check_error_log_count_each_ip.sh
#!/bin/bash

#エラーログファイルのパス
LOG_PATH=/var/log/httpd/error_log

#引数取得
target=${1}

if [ "${target}" = "all" ]; then
  #引数がallであれば全ての日付を指定
  target=all
elif [ "${target}" = "" ]; then
  #引数がなければ当日を指定
  target=0
elif [[ ! "${target}" =~ ^[0-9]*$ ]]; then
  #引数があり、整数であれば引数の日数前を指定
  target=0
fi

export LANG=en_US.UTF-8

#macOSはgdateコマンドで日付を出力
if [ "$(uname)" == 'Darwin' ]; then
  DATECMD=gdate
else
  DATECMD=date
fi

if [ "${target}" = "all" ]; then
  #全日指定であれば日付指定無し
  APACHE_DATE=""
else
  #集計対象の日付文字列を作成
  APACHE_DATE=`${DATECMD} "+%a %b %d" --utc --date "${target} day ago"`
fi

#改行への変換を行うための改行コードを指定。
LF=$'\\\x0A'

#エラーログの日別、ホスト名・IPアドレス毎の集計処理
cat ${LOG_PATH}* | egrep "\[${APACHE_DATE} " | grep client | sed 's/[^0-9.]/'"$LF"'/g' | grep '^[0-9]' | sed 's/^\.//g' | sed 's/\.$//g' | grep '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | sort -n | uniq -c | sort -n

Apache Webサーバのエラーログから日別、ホスト名・IPアドレス毎にエラー数を集計するシェルスクリプト(バッチ処理プログラム)

引数にallを指定して存在するエラーログ全ての日付に対してエラーログのホスト名・IPアドレス毎の集計を計算している例です。

実行結果の内容はあくまでサンプルです。

この例であれば「123.456.789.016」「123.456.789.015」などエラー数が多いIPアドレスは何らかの攻撃を仕掛けている可能性もあるので、再度エラーログを検索して不正アクセスがないか確認する必要があるでしょう。

[magtranetwork@localhost ~]# chmod 755 check_error_log_count_each_ip.sh
[magtranetwork@localhost ~]# ./check_error_log_count_each_ip.sh 1
      1 123.456.789.001
      1 123.456.789.002
      1 123.456.789.003
      1 123.456.789.004
      1 123.456.789.005
      2 123.456.789.006
      2 123.456.789.007
~省略~
      3 123.456.789.008
      3 123.456.789.009
      3 123.456.789.010
      3 123.456.789.011
      3 123.456.789.012
      6 123.456.789.013
      6 123.456.789.014
     11 123.456.789.015
     24 123.456.789.016
Reference: Tech Blog citing related sources