SiteGuardの防御ログをAbuseIPDBへ自動報告し、攻撃情報を世界と共有する(Bash + API連携)

はじめに

サーバーを運用していると、WAF(Web Application Firewall)が日々多くの攻撃をブロックしてくれます。しかし、ブロックして終わりではもったいないと感じることはありませんか?

今回は、国産WAFとして広く使われている SiteGuard Lite の検知ログをリアルタイムに監視し、悪質なIPアドレスを AbuseIPDB に自動でレポートする仕組みを構築しました。これにより、自分のサーバーを守るだけでなく、世界中の管理者と脅威情報を共有し、インターネット全体の安全に貢献できます。


全体構成

  1. SiteGuard Lite: 不正アクセスを検知・遮断し、detect.logに記録。
  2. Bashスクリプト: tail -fでログを監視し、攻撃元IPとルール名を抽出。
  3. AbuseIPDB API: 抽出した情報をAPI経由で報告。
  4. systemd: スクリプトをデーモン化して24時間常駐稼働。

1. AbuseIPDBのAPIキー取得

まず AbuseIPDB でアカウントを作成し、API Keyを発行します。名前は SiteGuard-Auto-Reporter などにしておくと管理しやすいです。


2. ログ解析と自動報告スクリプト

SiteGuardのログは情報量が多く、ルール名(シグネチャID)の後に続く文字列の形式が様々です。これらを柔軟に解析し、さらに「人間が見てわかりやすい攻撃名」に変換するロジックを組み込みました。

/usr/local/bin/siteguard_to_abuseipdb.sh として保存します。

Bash

#!/bin/bash

# --- 設定項目 ---
LOG_FILE="/opt/jp-secure/siteguardlite/logs/http/detect.log"
API_KEY="YOUR_API_KEY_HERE"
CATEGORY="21" # 21: Web Spam (Web App Attackに最適)
LOG_OUT="/var/log/abuseipdb_reporter.log"

# ログをリアルタイム監視
tail -fn 0 "$LOG_FILE" | while read -r LINE
do
    # BLOCKされたログのみを対象にする
    if echo "$LINE" | grep -q "ACTION:BLOCK:"; then
        
        # 3列目からIPアドレスを抽出
        IP=$(echo "$LINE" | awk '{print $3}')
        
        # 正規表現でルール名を抽出 (OFFICIAL/またはCUSTOM/の後ろを取得)
        RULE=$(echo "$LINE" | grep -oP '(OFFICIAL|CUSTOM)/[0-9]+/[^:/ ]+' | awk -F'/' '{print $3}')
        [ -z "$RULE" ] && RULE="unknown-rule"
        
        # ルール名から一般的な攻撃名にマッピング
        case "${RULE,,}" in
            *xss*)    TYPE="Cross-Site Scripting (XSS)" ;;
            *sqli*)   TYPE="SQL Injection" ;;
            *oscmd*)  TYPE="OS Command Injection" ;;
            *dir*)    TYPE="Directory Traversal" ;;
            *lfi*|*rfi*) TYPE="File Inclusion" ;;
            *brute*)  TYPE="Brute Force" ;;
            *)        TYPE="Web App Attack" ;;
        esac

        # AbuseIPDBへのコメントを作成
        COMMENT="SiteGuard Lite: [$TYPE] blocked. Rule: $RULE"

        # 非同期でAPIにPOST
        (
            curl -s --fail 'https://api.abuseipdb.com/api/v2/report' \
                -H 'Accept: application/json' \
                -H "Key: $API_KEY" \
                --data-urlencode "comment=$COMMENT" \
                --data-urlencode "ip=$IP" \
                --data "categories=$CATEGORY" > /dev/null
            
            if [ $? -eq 0 ]; then
                echo "$(date '+%Y-%m-%d %H:%M:%S') [SUCCESS] Reported: $IP ($TYPE)" >> $LOG_OUT
            else
                echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] Failed: $IP" >> $LOG_OUT
            fi
        ) &
    fi
done

3. systemdによるデーモン化

スクリプトを常時稼働させるため、systemdユニットファイル /etc/systemd/system/abuseipdb-reporter.service を作成します。

Ini, TOML

[Unit]
Description=SiteGuard Lite to AbuseIPDB Auto Reporter
After=network.target

[Service]
ExecStart=/bin/bash /usr/local/bin/siteguard_to_abuseipdb.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target

設定を反映して起動します。

Bash

sudo systemctl daemon-reload
sudo systemctl enable abuseipdb-reporter
sudo systemctl start abuseipdb-reporter

4. 運用のポイントと結果

導入後、/var/log/abuseipdb_reporter.log を確認すると、以下のようなログが流れるようになります。

2025-12-22 08:52:42 [SUCCESS] Reported: 91.208.184.93 (OS Command Injection)

AbuseIPDBのダッシュボードを確認すると、自分のサーバーが検知したIPが正しくレポートされているはずです。

工夫した点

  • ルール名の可読性: oscmd-try-2 などの無機質なIDに、[OS Command Injection] という注釈を付けることで、他者がデータを見た時の有用性を高めました。
  • 非同期処理: APIのレスポンスを待たずに次のログ監視へ移るよう、curlをバックグラウンド実行にしています。

おわりに

SiteGuard Liteのログを活用すれば、簡単に「攻撃情報の自動共有」が実現できます。自分のサイトを守る「盾」を、世界中の管理者と繋がる「センサー」に変えてみてはいかがでしょうか。