2022年12月現在、「Mod_Securityが検知したIPアドレスネガティブリストに放り込む」は達成しました。

  • これら検知したIPはどこの国からか?
  • 日々、どのぐらいの数、不審なアクセスが来ているのか?

を把握するため、シェルスクリプトを書きました。

やりたいこと

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する
  3. 同じIPアドレスごとに件数を数え、降順で並べ替える
  4. cronで定期実行する

本項でやること

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する

前提と準備

以下の環境です。

  • Ubuntu 20.04とCentOS 7以降で動作を確認しました。

nslookupコマンドが実装されていること

which nslookup
# パスがあれば実装されています。
nslookupがない場合のインストール
sudo apt-get install dnsutils

スクリプト生成

参考

以下のスクリプトをベースにしています。

https://raintrees.net/news/11

本スクリプトの作成者様と、IPアドレスと国の対応を結びつけるサービスの作成者様にこの場を借りて御礼申し上げます。

1. 国コードとアドレスを対応させたCSVを作成します。

以下のようなCSVを作成します。

vi country_list.csv
ファイル内容
AC,アセンション島
AD,アンドラ
AE,アラブ首長国連邦
AF,アフガニスタン
AG,アンティグア・バーブーダ
AI,アンギラ
AL,アルバニア
etc...

作成に当たっての参照先:

https://memorva.jp/memo/website/domain_cctld_country_code.php

スクリプトを作成します。

vi ip_check.sh
スクリプト内容
#!/bin/sh

# error.logのディレクトリを指定する場合は指定して下さい
# error.logからIPアドレスだけを抜き出して同ディレクトリのip.YYYYMMDD.csvに保存します
cat ./error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort > ip.`date +%Y%m%d`.csv

listfile="./ip.`date +%Y%m%d`.csv"
# ip.YYYYMMDD.csvファイルがない場合にエラーを返します
if [ ! -f $listfile ]; then
        echo "ファイル $listfile が存在しないので終了します。"
        exit 1
fi

country_list="./country_list.csv"
# 国コード,国の名前が書かれたcountry_list.csvがない場合にエラーを返します
if [ ! -f $country_list ]; then
        echo "ファイル $country_list が存在しないので終了します。"
        exit 1
fi

# IPアドレスに国名を付与したファイルを定義します。(ip_list.YYYYMMDD.csv)
result_file="./ip_list.`date +%Y%m%d`.csv"
cat /dev/null > $result_file

cat ${listfile} | while read line
do
                # IPアドレスを逆順に並び替えます。(例: 1.2.3.4 → 4.3.2.1
                ip_revers=`echo ${line}|awk -F'.' '{print $4,".",$3,".",$2,".",$1}'|sed -e 's/ //g'`
                # 並び替えたIPアドレスをcc.wariate.jpに並び替えて、国コードを抜き出します。(JP,CH,ESなど
                country_code=`nslookup -type=TXT ${ip_revers}.cc.wariate.jp | grep '"'|awk -F'"' '{print $2}' `
                # 国コードをcountry_list.csvから参照して国名を抜き出します。
                country_name=`cat ${country_list} | grep ${country_code} | cut -d"," -f 2`

                # 次の行は標準出力に返す処理を行います。cron処理する場合は#をつけて作動しないようにします。
                 echo "${line},${country_name}"
                # IPアドレス,国名の形式にして同ディレクトリのip_list.YYYYMMDD.csvに保存します
                echo "${line},${country_name}" >> $result_file
        sleep 1
done

exit

スクリプトに実行権限を付与します。

chmod +x ip_check.sh

動作確認

任意のディレクトリに以下のファイルがあることを確認します。

  • error.log (またはスクリプトにログのパスを記載)
  • ip_check.sh スクリプト
  • country_list.csv

スクリプト実行

./ip_check.sh

スクリプト実行結果

出力先(上記例ではスクリプトを配置したディレクトリ)に以下のファイルが出力されます。

  • ip.YYYYMMDD.csv (エラーログからIPアドレスのみを抜き出したファイル)
  • ip_list.YYYYMMDD.csv (以下の様に、IPアドレスとアクセス元の国を記述したファイル)
AAA.BBB.CCC.DDD,シンガポール
AAA.BBB.CCC.DDD,ベトナム
AAA.BBB.CCC.DDD,中国

次にやること

  1. このスクリプトの実行結果を元に件数ごとにまとめて並べ替えるスクリプトの作成
  2. cronによる定期実行化