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

7

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-output

Apache の 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.sh

4. 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>&1

5.テスト
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 のアクセスログが肥大化して確認が追いついていない環境や、現状の被攻撃状況をまず把握したい場合の参考になれば幸いです。

Post Views:12
makorin
  • makorin
  • AI を使用して情報を得ることが普通の時代になりました。その AI もウェブ上に公開されている情報を元にして動作しています。その情報の一つになればいいなという、極々ささやかな思いで気ままに更新しています。

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。