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

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

を把握するため、シェルスクリプトを書きました。(前回はこちらです)

やりたいこと

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

本項でやること

  1. 同じIPアドレスごとに件数を数え、降順で並べ替える

前提と準備

以下の環境です。

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

前回の「エラーログからIPアドレスのみを抽出し、アクセス元の国を付与する」スクリプトが導入されていることが条件です。

スクリプト生成

参考

chatGPTの力を借りました。何度か質問を変え、動作確認しつつコマンドを足しています。

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

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

# ip_list.csv.YYYYMMDDを読み込んで、IPアドレスをキー、国を値とする連想配列を作成します
declare -A countries
while read -r line; do
  # CSVの1列目をIPアドレス、2列目を国とします
  ip=$(echo $line | cut -d',' -f1)
  country=$(echo $line | cut -d',' -f2)
  # 連想配列に格納します
  countries[$ip]=$country
done < ip_list.`date +%Y%m%d`.csv

# 結果を格納するための変数を定義します
result=""

# 連想配列を反復処理します
for ip in "${!countries[@]}"; do
  # 各IPアドレスの件数を数えます
  count=$(grep -c $ip ip_list.`date +%Y%m%d`.csv)
  # 件数、IPアドレス、国をカンマ区切りで結合します
  line="$count,$ip,${countries[$ip]}"
  # 結果に追加します
  result="$result\n$line"
done

# カウントした結果をcounted_ip.YYYYMMDD.csvに出力します
echo -e $result > counted_ip.`date +%Y%m%d`.csv

### ↑ここまでchatGPTが作成したスクリプト↑ ###

# 最終結果をsorted_ip.`date +%Y%m%d`.csvに出力します
# LC_ALL=Cを設定しないと日本語で書かれた国名の並べ替えがうまくいきませんでした
cat counted_ip.`date +%Y%m%d`.csv |LC_ALL=C sort -n -r > sorted_ip.`date +%Y%m%d`.csv

# 最終結果以外のログファイルを削除します
# 必要に応じて無効化してください
rm ip.`date +%Y%m%d`.csv
rm ip_list.`date +%Y%m%d`.csv
rm counted_ip.`date +%Y%m%d`.csv

exit 

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

chmod +x ip_count.sh

動作確認

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

  • ip_check.sh スクリプトが生成したログip_list.YYYYMMDD.csv
  • ip_count.sh スクリプト

スクリプト実行

./ip_count.sh

スクリプト実行結果

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

  • sorted_ip.YYYYMMDD.csv (以下の様に、アクセスごとの件数とIPアドレスとアクセス元の国を記述し、アクセス数の降順で並べ替えたファイル)
100, AAA.BBB.CCC.DDD,シンガポール
30, AAA.BBB.CCC.DDD,ベトナム
20,AAA.BBB.CCC.DDD,中国
  • 同時に、以下のファイルが消去されます。
  • ip.YYYYMMDD.csv (エラーログからIPアドレスのみを抜き出したファイル)
  • ip_list.YYYYMMDD.csv (IPアドレスにアクセス元を追記したファイル)
  • counted_ip.YYYYMMDD.csv (IPアドレスごとのカウントを行ったファイル)

合間に余計なファイルが含まれるので、ここはもっとスマートに書きたいです。

次にやること

  1. cronによる定期実行化
  2. redmineのプラグインredmine_logsで閲覧できるように設定