概要
- IPアドレスリストによるブロック
- エージェントのブロック
- ModSecurityのブラックリストのブロック
の3段階のフィルタを設けたONE OUTSシステム。その核となる「ModSecurityのブラックリストの自動生成」です。
スクリプト内容
- one_outs.sh
こちらを、変数を自分の環境に合わせた状態で 修正していきます。性質上、root権限で作成します。
#!/bin/bash
#
# ONE OUTS System - IP Blacklist Auto-Generator
#
# このスクリプトは、Tor出口ノードのリストとApacheのエラーログから
# 不審なIPアドレスを抽出し、ModSecurity用のブラックリストを自動生成します。
# cronなどで定期的に実行することを想定しています。
#
# === 変数の定義 ===
# --- 基本設定 ---
# スクリプトのベースディレクトリ。環境に合わせて変更してください。
SCRIPT_BASE_DIR="/usr/local/scripts/security"
# Apacheのログディレクトリ。環境に合わせて変更してください。
APACHE_LOG_DIR="/var/log/apache2"
# ModSecurityのブラックリストファイル。SecRuleで指定したパスに合わせます。
MODSEC_BLACKLIST_FILE="/etc/modsecurity/ip-blacklist.txt"
# --- 除外設定 ---
# ブラックリストから除外したいIPアドレスを記述したファイル
# (例: 自分のIPアドレスや、正常なクローラーのIPなど)
EXCLUDE_IPS_FILE="${SCRIPT_BASE_DIR}/conf/exclude_ips.txt"
# --- 中間ファイル設定 (通常は変更不要) ---
# Tor出口ノードの生データをダウンロードする一時ファイル
TOR_EXIT_LIST_RAW="${SCRIPT_BASE_DIR}/work/tor_exit_nodes_raw.txt"
# Tor出口ノードのIPアドレスのみを抽出したリスト
TOR_EXIT_LIST_IPS="${SCRIPT_BASE_DIR}/work/tor_exit_nodes_ips.txt"
# Apacheのエラーログから抽出した不審なIPリスト (日次)
SUSPICIOUS_IPS_DAILY="${SCRIPT_BASE_DIR}/work/suspicious_ips_daily.txt"
# 過去分も含めた、全ての不審なIPリスト
SUSPICIOUS_IPS_ALL="${SCRIPT_BASE_DIR}/work/suspicious_ips_all.txt"
# スクリプト実行時の日付 (YYYYMMDD形式)
TODAY=$(date +%Y%m%d)
# === 処理の開始 ===
echo "--- IP Blacklist Generation Started at $(date) ---"
# 1. Tor出口ノードリストの取得
echo "[Step 1] Downloading Tor exit node list..."
curl -s -o "${TOR_EXIT_LIST_RAW}" "https://check.torproject.org/exit-addresses"
if [ $? -ne 0 ]; then
echo "Error: Failed to download Tor exit node list."
exit 1
fi
# ExitAddress行からIPアドレスのみを抽出し、ソートして重複を排除
awk '/^ExitAddress/ {print $2}' "${TOR_EXIT_LIST_RAW}" | sort -u > "${TOR_EXIT_LIST_IPS}"
echo " -> Tor IP list created: ${TOR_EXIT_LIST_IPS}"
# 2. Apacheエラーログからの不審IP抽出
echo "[Step 2] Extracting suspicious IPs from Apache error log..."
# エラーログの中からModSecurityが検知したIPアドレスを抽出
# (grepとsedでIPアドレスのパターンのみを抜き出す)
grep "ModSecurity" "${APACHE_LOG_DIR}/error.log" | \
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort -u > "${SUSPICIOUS_IPS_DAILY}"
echo " -> Daily suspicious IP list created: ${SUSPICIOUS_IPS_DAILY}"
# 過去の不審IPリストと今日の日次リストを結合し、最新の完全なリストを作成
# (ファイルが存在しない場合のエラーを避けるため、touchで空ファイルを作成)
touch "${SUSPICIOUS_IPS_ALL}"
cat "${SUSPICIOUS_IPS_ALL}" "${SUSPICIOUS_IPS_DAILY}" | sort -u > "${SUSPICIOUS_IPS_ALL}.tmp" && mv "${SUSPICIOUS_IPS_ALL}.tmp" "${SUSPICIOUS_IPS_ALL}"
echo " -> All suspicious IPs list updated: ${SUSPICIOUS_IPS_ALL}"
# 3. ブラックリストの生成
echo "[Step 3] Generating the final blacklist..."
# TorのIPリストと、これまで蓄積した不審なIPリストを結合
cat "${TOR_EXIT_LIST_IPS}" "${SUSPICIOUS_IPS_ALL}" | sort -u > "${MODSEC_BLACKLIST_FILE}.tmp"
# 4. 除外IPの削除
echo "[Step 4] Removing excluded IPs from the blacklist..."
if [ -f "${EXCLUDE_IPS_FILE}" ]; then
# grep -v -f を使い、除外リストにあるIPを行ごと削除
grep -v -f "${EXCLUDE_IPS_FILE}" "${MODSEC_BLACKLIST_FILE}.tmp" > "${MODSEC_BLACKLIST_FILE}"
else
mv "${MODSEC_BLACKLIST_FILE}.tmp" "${MODSEC_BLACKLIST_FILE}"
fi
rm "${MODSEC_BLACKLIST_FILE}.tmp"
echo " -> Final blacklist created: ${MODSEC_BLACKLIST_FILE}"
# 5. Apacheの再読み込み (設定の反映)
# echo "[Step 5] Reloading Apache to apply changes..."
# systemctl reload apache2.service
# echo " -> Apache reloaded."
# ※ cronで実行する際は、再起動処理が多発しないよう注意が必要です。
# ファイルに差分があった場合のみ再起動する、などの工夫を推奨します。
echo "--- IP Blacklist Generation Finished at $(date) ---"
作成後、
chmod +x oune_outs.sh
で実行権限を付与します。
そもそも、何故このスクリプトに至ったか?
Torという絶好の隠蔽手段のアクセス者を「バッターボックスに立たせない」
Tor (The Onion Router)はインターネット上での通信を匿名化するための技術とネットワークです。
- プライバシー保護
- 検閲回避
- ジャーナリストや活動家の安全確保
が利用目的。
- 入り口ノード(本来のアクセス元からここにアクセス)
- 中継サーバ(タマネギの皮を重ねる/剥くように暗号化と複合化で通信の秘匿性を維持)
- 出口ノード(アクセス先のサーバにはこの出口ノードからのIPアドレスが表示される)
の三段階で高い匿名性を保っています。ですが、
通信元のIPアドレスが隠されるため、誰がアクセスしているか特定しづらい。
という、サイバー攻撃者にとって非常に都合がいい技術となっています。そのため、この隠蔽手段は最初からアクセスを排除します。
また、このTorの出口ネットワークはほぼ日替わりで更新。
https://check.torproject.org/exit-addresses
この、「攻撃者にとって都合のいい情報」を「防御側も利用できる情報」として転用。
上記スクリプトでは、このURLにアクセスし、出口ノードをダウンロード。その後、IPアドレスの形式で出力します。
攻撃を試みた者は「二度目のチャンスを与えない」
Torを失ってでも不審なアクセスを試みた場合は、Mod_Securityが検知。以下のようなログを検出します。(IPやURLはダミーにしています)
固定ページ: 12
コメントを残す