bokumin

bokumin's net

Fail2banした不正アクセスIPを分析する

Analyze with Fail2ban

 

はじめに

 

最近、不正アクセスをしようとしてきているハッカーが多いです。以前にも増して勢いがあるような・・わたしのように趣味でサーバーを構築している場合でも、その標的みたいです。

 

SSHアクセスだけでも、SSHデーモンはそれぞれの接続試行に対して認証処理を行うので、特にパスワード認証の場合は暗号化処理のためCPUリソースが消費されます。電気代を少なからず気にしている私にとって、これらの不正アクセスはリソースの無駄遣いであり、セキュリティリスクでもあります・・

そこで今回は、ハッカーがどの国のIPを使って攻撃をしてきているのか、自分のサーバーのログから調べてみましたので共有します。
去年の12月中旬から現在(4月)までの、Fail2banのSSHによってBANされたIPアドレスをまとめてみました。

 

※不正アクセスに使われるIPアドレスはVPN・踏み台サーバ・プロキシ等を経由しているケースが多いため、「攻撃者の実際の所在地が◯◯」というより、「◯◯にあるネットワークリソースが多用されている」という可能性があることも考慮してください

 

検証結果

 

国別不正アクセス数

 

 

ロシア(RU) からのアクセスが 9144 件と突出して多くトップ10の全体の半分を締めています。これは組織的な攻撃か、ロシア国内のボットネットを利用した攻撃の可能性が考えられます。

中国 (CN) が 3237 件、アメリカ(US) が 2517 件、インド (IN) が 1003 件と続いています。

 

時間別不正アクセス数

 

 

平均してロシアからのアクセスが多いですが、1時のピーク時には、中国からのアクセス(藍色部分)がロシアを抜いていました。中国と日本との時差は1時間なので、0時ちょうどに自動でスクリプトなどを回しているような感じなのでしょうか?アメリカも1時に増加傾向があるのがわかります。

 

ヒートマップ

 

 

ロシアは24時間常に不正アクセスを試みており、特定の時間帯に集中することなく継続的に攻撃が行われています。
続いて中国ですが、1時と13時(中国にとっての0時と12時)に不正アクセスを試みているのがみられました。アメリカからの不正アクセスも同様のパターンを示していることから、同一の攻撃者が異なる国の踏み台を使用している可能性があります。

 

月別不正アクセス数

 

 

ロシアは常に高く、中国は1月から3月にかけて減っている傾向がみられました。その他の国は、月によって変動があるものの、一定数の攻撃が継続している形です。

 

この傾向から、ロシアからの攻撃は組織的で継続的であるのに対し、他の国からの攻撃はイベントや季節性の影響を受けている可能性があります。引き続き観察が必要です。

 

同一性・関連性分析

 

同一のハッカーによる攻撃だと思われるものを以下の条件からグループ分けしました。
・IPアドレスの、攻撃があった時刻に近い攻撃のもの(5分以内)
・同じサブネットにあるもの(/24)
・IPアドレスの数値が近いもの

かなり多いので開閉に注意してください

 

 


 

まとめ

 

正規の民間企業に帰属するIP

 

  • ロシアやアメリカのIPの中には、正規の企業に割り当てられたものが含まれています
  • これらは企業のインフラが侵害されてボットネットの一部になっている可能性があります

 

国営通信事業者のIP

 

  • 中国やインドでは国営通信事業者のIPが多用されています
  • これらの事業者は規模が大きく、不正アクセスの報告に対する対応が遅い傾向があります

 

ホスティングプロバイダーのIP

 

  • インドネシアやベトナムなどではクラウドホスティングプロバイダーのIPが多い
  • これらのプロバイダーは利用規約違反に敏感で、報告すれば対応が早い場合が多いです

 

PPPoE動的アドレスプール

 

これらはボットネットの一部になっている可能性が高いです

 

一般家庭のコンピュータが侵害されたケースと思われるものがアメリカやロシアで見られました

 

おわりに

 

fail2banなどのセキュリティツールを使えば、不正アクセスをしようとした人物のIPがわかります。Linuxならwhoisやdigコマンドなどで攻撃者の情報の特定ができますので、一度サーバーをお持ちでしたら、チェックしてみるといいかもしれません。
その攻撃者のIP情報についてはAbuselIPなどを使用して確認・場合によっては報告するようにしましょう。

 

$ whois IP-ADRESS
# もしくは
$ dig IP-ADRESS

 

今回の作業のために使用したコマンドなどを以下にまとめましたので、参考にしてみてください。
グラフやグループ抽出部分はPythonで作成してあります。

 

作成手順

 

ホームディレクトリ以下にディレクトリを作成し、/var/logのfail2banログをすべてコピーしました。必要に応じて圧縮ファイル(*.xz)の解凍も行っています。

 

# 作業用フォルダ作成
$ mkdir ~/log; cd ~/log
$ sudo cp /var/log/fail2ban.log* .

# 今回作業するユーザー・グループのものに権限を変更
$ sudo chown USER:GROUP fail2ban.log*
$ xz -d *.xz

 

次に、grepコマンドを用いて「Ban」という文字列を含む行を抽出し、Ban.logというファイルに出力しました。この処理により、どのIPアドレスがどのタイミングでブロックされたかが一覧できるようになります。

 

$ grep "Ban " /var/log/fail2ban.log* > Ban.log

 

tailコマンドなどで確認して、問題なく取得ができていれば大丈夫です

 

$ tail Ban.log
fail2ban.log-newest:2025-04-07 10:30:20,336 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 118.36.34.88
fail2ban.log-newest:2025-04-07 10:30:54,554 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 146.190.129.112
fail2ban.log-newest:2025-04-07 10:32:47,790 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 58.211.191.14
fail2ban.log-newest:2025-04-07 10:40:26,330 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 64.23.185.5
fail2ban.log-newest:2025-04-07 10:44:37,491 fail2ban.actions        [1724]: NOTICE  [apache-fakegooglebot] Ban 66.249.66.88
fail2ban.log-newest:2025-04-07 10:49:03,875 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 92.255.85.107
fail2ban.log-newest:2025-04-07 10:51:29,131 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 43.156.246.95
fail2ban.log-newest:2025-04-07 10:52:59,972 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 92.255.85.37
fail2ban.log-newest:2025-04-07 10:58:06,057 fail2ban.actions        [1724]: NOTICE  [sshd] Ban 188.81.58.46
fail2ban.log-newest:

 

その後、日付とIPアドレスだけにしたCSVを作成するために、sedコマンドと正規表現を使って整形を行いました。

 

$ cat Ban.log | grep "NOTICE" | sed -E 's/.*([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*Ban ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1,\2/' > banned.csv

# 抜けがないかチェック
$ wc -l banned.csv Ban.log
  26010 banned.csv
  26010 Ban.log
  52020 total
  
# 日付とIPだけになっていればOK
$ tail banned.csv 
2025-04-07 10:30:20,118.36.34.88
2025-04-07 10:30:54,146.190.129.112
2025-04-07 10:32:47,58.211.191.14
2025-04-07 10:40:26,64.23.185.5
2025-04-07 10:44:37,66.249.66.88
2025-04-07 10:49:03,92.255.85.107
2025-04-07 10:51:29,43.156.246.95
2025-04-07 10:52:59,92.255.85.37
2025-04-07 10:58:06,188.81.58.46
2025-04-07 11:00:45,103.132.16.142

# ログファイルの関係上、同一行があったり、時系列がおかしい方向け
sort banned.csv | uniq > sort_banned.csv

 

IPだけではどこの国からアクセスをしてきたかなどわかりづらいので、今回はIP2Location-Liteの国別データベースを使用することにしました。以下のURLをダウンロードし、解凍していきます。

 

wget -q https://download.ip2location.com/lite/IP2LOCATION-LITE-DB1.CSV.ZIP
unzip -q IP2LOCATION-LITE-DB1.CSV.ZIP

 

次に、既存のbanned.csv(日時とIPアドレスのみが記録されたファイル)に対して、IPアドレスを数値に変換し、IP2LocationのCSVファイル内から該当する国情報を検索するシェルスクリプトmake.shを作成しました。

 

#!/bin/bash

input_file="banned.csv" # sortした場合はこちらも修正
output_file="banned_with_country.csv"
ip_db_file="IP2LOCATION-LITE-DB1.CSV"

cleanup() {
    rm -f tmp_input.csv tmp_db.csv
}
trap cleanup EXIT

# 前処理:特殊文字除去とCSV正規化
awk '{ gsub(/["\r]/,""); print }' "$input_file" > tmp_input.csv
awk '{ gsub(/["\r]/,""); print }' "$ip_db_file" > tmp_db.csv

ip_to_num() {
    local ip=$1
    local -n num=$2
    num=0
    for ((i=0; i<4; i++)); do
        ((num += ${ip%%.*} * (256 ** (3 - i))))
        ip=${ip#*.}
    done
}

while IFS=, read -r timestamp ip; do
    ip_to_num "$ip" ip_num 2>/dev/null || continue

    country=$(awk -F, -v t="$ip_num" '
        $1 <= t && t <= $2 && $3 != "-" { print $3; exit }' tmp_db.csv)

    echo "$timestamp,$ip,$country" >> "$output_file"
    echo -n "."
done < tmp_input.csv

echo

 

以下のように出力されれば完成です。※いくつかのIPを直接AbuseIPDBなどでチェックして、正しく出力されているかなども同時に行ってください

 

$ tail banned_with_country.csv 
2025-04-07 10:30:20,118.36.34.88,KR
2025-04-07 10:30:54,146.190.129.112,US
2025-04-07 10:32:47,58.211.191.14,CN
2025-04-07 10:40:26,64.23.185.5,US
2025-04-07 10:44:37,66.249.66.88,US
2025-04-07 10:49:03,92.255.85.107,RU
2025-04-07 10:51:29,43.156.246.95,SG
2025-04-07 10:52:59,92.255.85.37,RU
2025-04-07 10:58:06,188.81.58.46,PT
2025-04-07 11:00:45,103.132.16.142,IN