2026年11月7日

2026年11月7日

WordPressのコアファイル改ざん検知・整合性チェック方法

はじめに

WordPressサイトへの不正アクセスでは、攻撃者がコアファイルやプラグインファイルにバックドアコードを埋め込むケースが多く報告されています。定期的なファイル整合性チェックを実施することで、改ざんを早期に発見し被害を最小限に抑えることができます。この記事では、WP-CLIを使った公式チェックサム検証から、カスタムハッシュベースライン・リアルタイム監視まで実践的な方法を解説します。

症状・原因

  • サイトに不審なリダイレクトが発生したり見知らぬファイルが追加されている
  • セキュリティスキャナーがマルウェアを検出しているが場所が特定できない
  • サイトがブラックリストに登録されGoogleの警告が表示されるようになった

解決手順

ステップ1:wp core verify-checksumsによるコア検証

WP-CLIはWordPress.orgの公式チェックサムと比較してコアファイルの整合性を検証します。

# WordPressコアファイルのチェックサム検証
# WordPress.orgの公式ハッシュと比較し、変更されたファイルを一覧表示
wp core verify-checksums --path=/var/www/html

# 出力例(改ざんがある場合):
# Warning: File doesn't verify against checksum: wp-includes/functions.php
# Warning: File doesn't verify against checksum: wp-login.php

# バージョンと言語を明示的に指定
wp core verify-checksums --version=6.5 --locale=ja --path=/var/www/html

# 問題のあるファイルを修復(コアファイルを公式版で上書き)
wp core download --force --path=/var/www/html

# 検証結果をファイルに保存(定期実行用)
wp core verify-checksums --path=/var/www/html 2>&1 | \
    tee /var/log/wp-integrity/core-check-$(date +%Y%m%d).log

ステップ2:プラグインのチェックサム検証

# 全プラグインのチェックサムを一括検証
wp plugin verify-checksums --all --path=/var/www/html

# 特定のプラグインのみ検証
wp plugin verify-checksums woocommerce --path=/var/www/html

# 全テーマのチェックサムを検証
wp theme verify-checksums --all --path=/var/www/html

# 問題のあるプラグインを再インストール(改ざん修復)
wp plugin install woocommerce --force --path=/var/www/html

# 結果をSlack/メールに通知するスクリプト
# /usr/local/bin/wp-integrity-check.sh
#!/bin/bash
RESULT=$(wp plugin verify-checksums --all --path=/var/www/html 2>&1)
if echo "$RESULT" | grep -q "Warning"; then
    # 改ざん検知時にメール送信
    echo "$RESULT" | mail -s "【警告】WordPressプラグイン改ざん検知" admin@example.com
fi

ステップ3:sha256sumによるカスタムハッシュベースライン

WP.orgにないカスタムファイルは自前でハッシュを管理します。

#!/bin/bash
# /usr/local/bin/wp-baseline-check.sh

WORDPRESS_PATH="/var/www/html"
BASELINE_FILE="/var/lib/wp-integrity/baseline.sha256"
REPORT_FILE="/var/log/wp-integrity/changes-$(date +%Y%m%d-%H%M%S).log"

# ベースラインの初回作成(正常状態で一度だけ実行)
create_baseline() {
    # wp-content/themes・plugins のカスタムファイルのハッシュを記録
    find "$WORDPRESS_PATH/wp-content/themes" \
         "$WORDPRESS_PATH/wp-content/plugins" \
         "$WORDPRESS_PATH/wp-content/mu-plugins" \
         -type f \( -name "*.php" -o -name "*.js" \) \
        | sort \
        | xargs sha256sum > "$BASELINE_FILE"
    
    echo "ベースライン作成完了: $BASELINE_FILE"
}

# ベースラインとの差分チェック
check_integrity() {
    local CURRENT_FILE="/tmp/wp-current-hashes.sha256"
    
    # 現在のファイルハッシュを計算
    find "$WORDPRESS_PATH/wp-content/themes" \
         "$WORDPRESS_PATH/wp-content/plugins" \
         "$WORDPRESS_PATH/wp-content/mu-plugins" \
         -type f \( -name "*.php" -o -name "*.js" \) \
        | sort \
        | xargs sha256sum > "$CURRENT_FILE"
    
    # ベースラインと比較(差分を検出)
    DIFF=$(diff "$BASELINE_FILE" "$CURRENT_FILE")
    
    if [ -n "$DIFF" ]; then
        echo "=== 変更されたファイルを検出 ===" | tee "$REPORT_FILE"
        echo "$DIFF" | tee -a "$REPORT_FILE"
        
        # 管理者に通知
        mail -s "【WordPress整合性警告】ファイル変更を検出" \
             admin@example.com < "$REPORT_FILE"
    else
        echo "整合性チェック正常: $(date)"
    fi
}

# 引数で処理を切り替え
case "$1" in
    "baseline") create_baseline ;;
    "check")    check_integrity ;;
    *) echo "使用方法: $0 {baseline|check}" ;;
esac
# crontabに登録(毎日午前2時に実行)
0 2 * * * /usr/local/bin/wp-baseline-check.sh check

ステップ4:inotifywaitによるリアルタイム監視

# inotify-toolsのインストール
sudo apt install -y inotify-tools

# リアルタイム監視スクリプト
# /usr/local/bin/wp-file-monitor.sh
#!/bin/bash

WATCH_DIR="/var/www/html"
LOG_FILE="/var/log/wp-integrity/realtime-$(date +%Y%m).log"

echo "WordPressファイル監視開始: $WATCH_DIR" | tee -a "$LOG_FILE"

# inotifywaitでファイル変更をリアルタイム監視
inotifywait -m -r \
    --event create,modify,delete,moved_to \
    --format '%T %e %w%f' \
    --timefmt '%Y-%m-%d %H:%M:%S' \
    --include '\.(php|js|htaccess)$' \
    "$WATCH_DIR" 2>/dev/null | while read LINE; do
    
    echo "$LINE" | tee -a "$LOG_FILE"
    
    # 管理画面・プラグイン更新以外のPHP変更は即座に通知
    if echo "$LINE" | grep -v "wp-admin/upgrade.php" | grep -q "\.php"; then
        echo "【リアルタイム警告】$LINE" | \
            mail -s "WordPressファイル変更検知" admin@example.com
    fi
done
# systemdサービスとして常駐させる
# /etc/systemd/system/wp-file-monitor.service
[Unit]
Description=WordPress File Integrity Monitor
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/wp-file-monitor.sh
Restart=always

[Install]
WantedBy=multi-user.target

# サービスの有効化
sudo systemctl enable wp-file-monitor
sudo systemctl start wp-file-monitor

ステップ5:TripwireとAIDEによるエンタープライズ級監視

# AIDE (Advanced Intrusion Detection Environment) のインストール
sudo apt install -y aide

# AIDE設定ファイルの編集
sudo nano /etc/aide/aide.conf
# /etc/aide/aide.conf の設定例
# ルールの定義(チェックする属性)
WPFILES = p+i+n+u+g+s+md5+sha256

# WordPressのチェック対象ディレクトリ
/var/www/html/wp-includes WPFILES
/var/www/html/wp-admin WPFILES
/var/www/html/wp-content/themes WPFILES
/var/www/html/wp-content/plugins WPFILES

# wp-content/uploads は変更が多いため除外
!/var/www/html/wp-content/uploads
!/var/www/html/wp-content/cache
# AIDEデータベースの初期化(ベースライン作成)
sudo aide --init
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 整合性チェックの実行
sudo aide --check

# crontabで定期実行
0 3 * * * /usr/sbin/aide --check 2>&1 | mail -s "AIDE Report: $(hostname)" admin@example.com

注意事項

  • ベースラインの更新タイミング: プラグイン・テーマのアップデート後は必ずベースラインを再作成する。更新後のベースライン更新を忘れると誤検知が続く。
  • 除外ディレクトリの設定: wp-content/uploadsやwp-content/cacheは頻繁に変更されるため監視から除外し、PHPファイルだけは別途監視する。
  • アラートの過剰送信防止: リアルタイム監視は誤検知が多い場合にアラートが大量発生する。最初はログ記録のみにして、パターンを把握してからアラートを設定する。

まとめ

WordPressのファイル整合性チェックは、セキュリティインシデントの早期発見に不可欠な施策です。WP-CLIによる定期的なコア・プラグイン検証と、カスタムファイルのsha256sum管理を組み合わせ、inotifywaitでリアルタイム監視を加えることで多層防御が実現できます。関連記事:WordPressに二要素認証(2FA)を実装する方法

お気軽にご相談ください

お見積りへ お問い合わせへ
▲