Rocky Linux 9でiLogScannerを導入|Apacheの攻撃ログ解析と日次自動実行

iLogScanner はウェブサーバのアクセスログから攻撃と思われる痕跡を検出するためのツールです。 ウェブサイトのログを解析することで攻撃の痕跡を確認でき、一部の痕跡については攻撃が成功した可能性を確認できます。独立行政法人 情報処理推進機構(IPA)が無償で提供しています。
本記事の環境では Apache を使用しています。日次等のログ解析で攻撃の有無や侵害の有無を事後的に把握・監視します。もし、Apache で WAF(ModSecurity) を使用してリアルタイム防御を行っているのであれば、「WAFがどの攻撃を防御できたか」を iLogScanner のレポート上で可視化も可能です。
環境
- Rocky Linux release 9.6 (Blue Onyx)
- Apache/2.4.62
導入手順
Java 8 パッケージのインストール
Rocky Linux の標準リポジトリから Headless 版の OpenJDK 8 をインストールします。
# dnf install -y java-1.8.0-openjdk-headless
省略
java-1.8.0-openjdk-headless-1:1.8.0.504.b01-1.2.el9_8.x86_64 tzdata-java-2026f-1.el9_8.noarch
完了しました!
# java -version
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)iLogScanner アーカイブの取得と基本設定
IPA 公式サイトから zip ファイルをダウンロードします。https://www.ipa.go.jp/security/vuln/ilogscanner/operation.html
zip ファイルを任意の場所に保存・展開します。
# mkdir -p ./ilogscanner
# unzip iLogScanner.zip -d ./ilogscanner
Archive: iLogScanner.zip
creating: ./ilogscanner/1_bin/
inflating: ./ilogscanner/1_bin/iLogScanner.bat
inflating: ./ilogscanner/1_bin/iLogScanner.conf
inflating: ./ilogscanner/1_bin/iLogScanner.jar
inflating: ./ilogscanner/1_bin/iLogScanner.sh
inflating: ./ilogscanner/1_bin/ini4j-0.5.2.jar
creating: ./ilogscanner/2_Document/
inflating: ./ilogscanner/2_Document/manual.pdf
inflating: ./ilogscanner/2_Document/termsofuse.pdf
inflating: ./ilogscanner/readme.txt起動用シェルスクリプトに権限を付与します。
# cd ./ilogscanner/1_bin
# chmod +x iLogScanner.sh分析レポートの出力先ディレクトリを作成しておきます。
なお、本記事では検証用途で設置しているため、必要に応じて本体とレポート出力パスは適切な設置場所を選定してください。
# mkdir -p /root/iLog-outputApache の ssl_access_log のログフォーマットを iLogScanner.conf に追記します。httpd.conf の ログセクションの記述内容と合わせます。ssl_error_log については制御できませんので、そのままです。
指定可能なフォーマット形式に制限があるので、詳しくは以下を参照してください。https://www.ipa.go.jp/security/vuln/ilogscanner/explainlog.html
「Apacheアクセスログのフォーマット指定」を参照
iLogScanner.conf 修正前:
[AccessLog]
AccessLogFormat =
ScanDateFrom =
ScanDateTo =iLogScanner.conf 修正後:
[AccessLog]
AccessLogFormat = LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
ScanDateFrom =
ScanDateTo =上記と符合する httpd.conf のログ出力設定:
本記事の環境では、httpd.conf で定義した combine という名称を ssl が参照して ssl_access_log に書き出しています。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" combined
</IfModule>もし、Apache で ModSecurity を使用しているのであれば、以下のセクションの修正も行うことにより、攻撃に対して、どのくらい防御できたのかといった結果も知ることができます。本記事の環境では未使用のためスキップします。
[ModSecurityLog]
AccessLogFormat =
ErrorLogFormat =
ScanDateFrom =
ScanDateTo =起動スクリプト iLogScanner.sh の内部でメインクラスが変数 “MAIN_CLASS” として定義されているため、実行環境によっては java が起動できません。そのため、スクリプト内の java 実行コマンドにオプション “-Djava.awt.headless=true” を追記します。
修正前:
java -classpath $CP $MAIN_CLASS $@修正後:
java -Djava.awt.headless=true -classpath $CP $MAIN_CLASS "$@"起動テスト
iLogScanner.sh に必要な引数を渡して実行します。実行と分析・レポート作成が正常に完了した場合、指定した出力パス(引数:outdir=)に、分析レポートが保存されます。
ssl_access_log と ssl_error_log の両方を指定し、分析させます。
何らかのエラーとなった場合、指定した出力パス(引数:outdir=)に、エラーログが保存されるので、内容を確認します。起動スクリプトから標準出力にエラー内容が表示されませんので、正常・異常の判断はつきません。
実行例:
# ./iLogScanner.sh mode=cui logtype=Apache level=Detail accesslog=/var/log/httpd/ssl_access_log errorlog=/var/log/httpd/ssl_error_log errorlogtype=2.4 outdir=/root/iLog-output
# ls -ls /root/iLog-output/
16 -rw-r--r-- 1 root root 14194 11月 8 09:12 iLogScanner_20261108_091237.html ★分析レポート
4 -rw-r--r-- 1 root root 603 11月 7 23:55 iLogScanner_error.log以下、iLogScanner.sh に引き渡し可能な引数を共有します。
■ 引数のパーサー規則
・引数はすべて key=value 形式で指定。
・先頭にハイフン(-)は不要。
・キー名は大文字・小文字を区別せず、小文字で指定可能。
・値に半角スペースが含まれない限り、ダブルクォーテーション等での囲みは不要。
■ パラメータキー一覧
・mode : 必須。動作モード(cui または gui)。CUI実行時は mode=cui を指定します。
・outdir : 必須。レポート出力先ディレクトリ。書き込み権限のある実在ディレクトリを指定します。
・logtype : 任意。解析対象のログ種別(デフォルト: Apache)。
・accesslog : 必須。解析対象のアクセスログファイルパス。複数指定時はカンマ区切り。
・level : 任意。解析レベル(デフォルト: Standard。詳細解析を行う場合は Detail)。
・errorlog : 必須。level=Detail 実行時に必須。解析対象のエラーログファイルパス。
・errorlogtype : 任意。level=Detail 実行時に指定(デフォルト: 2.2)。
・reporttype : 任意。レポートの出力形式(デフォルト: HTML)。
・version : 単体指定。バージョン情報を表示する場合に指定します。異常終了した場合の iLogScanner_error.log の内容例:
# cat /root/iLog-output/iLogScanner_error.log
#エラーメッセージログの見方
#----------------------------------------------------------------
#実行日時
#メッセージ内容
#----------------------------------------------------------------
#※ 最後に発生したエラーメッセージがログ出力されます。
#以下、エラーメッセージログ
2026/11/07 23:14:21
入力されたログフォーマットが不正です。
2026/11/07 23:29:20
入力されたログフォーマットが不正です。
2026/11/07 23:55:03
コマンドライン引数のパラメータが不正です。パラメータ:errorlogtypeレポート例
ここが目的となりますが、攻撃の説明とともにログの分析結果が表示されます。

レポートの下部には該当する攻撃ログが表示されます。
※公開用に一部をマスクしています。
#ModSecurity対応機能 解析結果ログの見方
#----------------------------------------------------------------
#[ログファイル名]
#[行番号] [脆弱性種別] [{ModSecurityで検知・遮断した}{攻撃が成功した可能性が高い}{パターン攻撃回数}] [該当するアクセスログ] [シグネチャ対応コード]
#----------------------------------------------------------------
#※ 各項目はタブ区切りになります
#※ 攻撃が成功した可能性が高い場合、「●」がつきます
#※ ModSecurityで検知したリクエストの場合、「captured」が、遮断したリクエストの場合、「denied」がつきます
#以下、解析結果ログ
ssl_access_log/ssl_error_log
14288 その他 - 45.142.**.191 - - [03/Nov/2026:11:07:31 +0900] "GET /?s=**********+alt*******-f3f3 HTTP/1.1" 200 25143 D818
14289 その他 - 45.129.**.215 - - [03/Nov/2026:11:07:48 +0900] "GET /?s=**********+alt*******-f3f3 HTTP/1.1" 200 25185 D818
35018 ディレクトリトラバーサル - 43.108.120.121 - - [07/Nov/2026:11:26:40 +0900] "GET /index.php?lang=******&+config-create+/&/<?echo(md5(\"hi\"));?>+/tmp/index1.php HTTP/1.1" 301 - C446以上となります。
定常的な自動実行
Rocky Linux の logrotate の httpd ログのデフォルトローテーションは、毎週日曜日の 00:00 頃にローテーションが実行されます。その場合、iLogscanner の実行タイミングにより変わりますが、分析範囲は最大で一週間分となります。
日次範囲で分析を実行したい場合、logrotate の修正と、iLogScanner.sh を実行する別のラッパースクリプトの準備が必要となります。設定例を記載しておきます。スクリプトの設置パス、実行権限、分析レポートの出力先などは適時修正ください。
1./etc/logrotate.d/httpd の修正
・daily の追加(毎日ローテーション)
・rotate 30 の追加(過去 30世代(30日分) のログファイルを保持する)
・dateext の追加(ローテーション後のファイル名末尾に -%Y%m%d の日付サフィックス を付与する)
■修正前
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
■修正後
# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
daily
rotate 30
dateext
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}2.分析スクリプト起動用の「ラッパースクリプト」の作成
“OUT_DIR=”など、実行環境に合わせて修正してください。対象ファイルの存在確認と解析を実行します。
#!/bin/sh
set -e
LOG_DIR="/var/log/httpd"
TARGET_DATE=$(date +%Y%m%d)
ACCESS_LOG="${LOG_DIR}/ssl_access_log-${TARGET_DATE}"
ERROR_LOG="${LOG_DIR}/ssl_error_log-${TARGET_DATE}"
OUT_DIR="レポート出力先パスを記述 例:/var/log/ils-report"
# 1. ローテーション済みログファイルの存在確認
if [ ! -f "${ACCESS_LOG}" ] || [ ! -f "${ERROR_LOG}" ]; then
echo "エラー: 対象ログが見つかりません (${ACCESS_LOG} / ${ERROR_LOG})" >&2
exit 1
fi
# 2. iLogScanner による詳細解析実行
cd /root/ilogscanner/1_bin || exit 1
./iLogScanner.sh mode=cui \
logtype=Apache \
level=Detail \
accesslog="${ACCESS_LOG}" \
errorlog="${ERROR_LOG}" \
errorlogtype=2.4 \
outdir="${OUT_DIR}"
# 3. 30日以上前のHTMLレポートを削除
find "${OUT_DIR}" -maxdepth 1 -name "iLogScanner_*.html" -mtime +30 -delete 2>/dev/null || true
3. ラッパースクリプトへの実行権限付与
chmod +x /root/ilogscanner/1_bin/daily_scan.sh4. cron スケジュールの登録
ラッパースクリプトを毎日 0:05 に実行するように cron に登録します。0:00 開始の logrotate の httpd ログのローテーションが完了した頃を狙って起動させます。
# 分析スクリプトが毎日 0:05 に起動するよう cron に設定を投入
# (crontab -l 2>/dev/null | grep -v "daily_scan.sh"; echo "5 0 * * * /root/ilogscanner/1_bin/daily_scan.sh > /var/log/ils-report/cron_daily.log 2>&1") | crontab -
# 確認
# crontab -l
5 0 * * * /root/ilogscanner/1_bin/daily_scan.sh > /var/log/ils-report/cron_daily.log 2>&15.テスト
logrotate と cron キックによる分析の定期実行を待たずに、特定の過去ログに対して手動分析を実施する場合の一行コマンドです。
/root/ilogscanner/1_bin/iLogScanner.sh mode=cui logtype=Apache level=Detail accesslog=/var/log/httpd/ssl_access_log-$(date +%Y%m%d) errorlog=/var/log/httpd/ssl_error_log-$(date +%Y%m%d) errorlogtype=2.4 outdir=/var/log/ils-report以上となります。
まとめ
今回は、Rocky Linux 9 上の Apache 環境において、IPA の「iLogScanner」を用いたログ解析環境の構築から、cron による日次自動実行までの手順を共有しました。
ウェブサイトを公開している以上、ボットやスキャナーによる攻撃リクエストを完全に避けることは困難です。しかし、iLogScanner を導入してログローテーションと組み合わせることで、以下のようなメリットが得られます。
- 潜在リスクの可視化: 単なる 404/500 エラーの羅列ではなく、SQL インジェクションやディレクトリトラバーサルといった具体的な攻撃手法・成否の可能性が HTML レポートで把握できる。
- 事後対応の初動迅速化: 攻撃の集中や兆候を早い段階で察知し、Apache のアクセス制限や WAF(ModSecurity)の導入といった次の防御策へ素早くつなげられる。
GUI を持たない Headless な Linux サーバーであっても、軽量かつ実用的なセキュリティ監視体制を構築できます。Apache のアクセスログが肥大化して確認が追いついていない環境や、現状の被攻撃状況をまず把握したい場合の参考になれば幸いです。