2026年5月20日
2026年5月20日
WordPressのWAF(Webアプリケーションファイアウォール)を設定する方法
はじめに
WAF(Webアプリケーションファイアウォール)は、SQLインジェクション・XSS・ディレクトリトラバーサル等の攻撃パターンをHTTPレベルで検出・ブロックします。WordPressサイトは多くの既知の攻撃ターゲットになるため、WAFは多層防御の重要な一要素です。
症状・原因
- セキュリティスキャンで「WAFが設定されていません」と指摘された
- ログに大量の攻撃パターン(
../../../・・UNION SELECT等)が記録されている - プラグインの脆弱性を突いた攻撃が成功してしまった
- 既知の攻撃パターンをサーバー到達前にブロックしたい
解決手順
ステップ1:現在の攻撃状況を把握する
# アクセスログで攻撃パターンを確認
grep -E "union.*select|base64_decode|eval\(|\.\.\/|<script|passwd|etc/shadow" \
/var/log/nginx/access.log | tail -30
# SQLインジェクション試行を検出
grep -iE "union.*select|insert.*into|drop.*table|1=1|or 1=1" \
/var/log/apache2/access.log | awk '{print $1, $7}' | sort | uniq -c | sort -rn | head -20
# パストラバーサル試行を検出
grep -E "\.\./|\.\.%2F|%2e%2e" /var/log/nginx/access.log | head -20
# 攻撃元IPをリスト
grep -E "union|select|base64|eval\(" /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
ステップ2:ModSecurity を Apache に設定する
# ModSecurity のインストール
sudo apt install -y libapache2-mod-security2
sudo a2enmod security2
# OWASP コアルールセット(CRS)をインストール
sudo apt install -y modsecurity-crs
# 設定ファイルを編集
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
# 設定を確認
sudo apache2ctl configtest
# Apache を再起動
sudo systemctl restart apache2
# ModSecurity のログを確認
sudo tail -f /var/log/apache2/modsec_audit.log
# /etc/apache2/conf-available/security.conf
# WordPress に特有のルールを追加
<IfModule security2_module>
# WordPress ログインページへのブルートフォースを制限
SecRule REQUEST_URI "@contains /wp-login.php" \
"id:1001,phase:1,pass,nolog,setvar:ip.login_count=+1,expirevar:ip.login_count=60"
SecRule IP:LOGIN_COUNT "@gt 10" \
"id:1002,phase:1,deny,status:429,msg:'Too many login attempts'"
# wp-config.php へのアクセスをブロック
SecRule REQUEST_URI "@contains wp-config.php" \
"id:1003,phase:1,deny,status:403,msg:'Access to wp-config.php denied'"
</IfModule>
ステップ3:Nginx + ModSecurity を設定する
# Nginx 用 ModSecurity のインストール
sudo apt install -y nginx-extras
# または nginx を ModSecurity 対応版でビルド
# ModSecurity for Nginx の設定
sudo cat > /etc/nginx/modsec/main.conf << 'EOF'
Include /etc/nginx/modsec/modsecurity.conf
Include /usr/share/modsecurity-crs/crs-setup.conf
Include /usr/share/modsecurity-crs/rules/*.conf
EOF
# /etc/nginx/sites-available/example.com
server {
# ModSecurity を有効化
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
# WordPress 専用のカスタムルール
location = /wp-login.php {
modsecurity on;
# ... PHP 処理 ...
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
ステップ4:Wordfence プラグインのWAFを有効化する
# Wordfence をインストール・有効化
wp plugin install wordfence --activate
# Wordfence の初期設定(WP-CLI経由)
wp option update wordfence_lf_version 3
wp option update wf_scanEnabled 1
wp option update wordfenceActivated 1
// functions.php: Wordfence WAF の動作をカスタマイズ
// ① Wordfence がブロックしたリクエストをログに記録
add_action('wordfence_block_ip', function(string $ip, string $reason): void {
error_log("Wordfence blocked IP: {$ip} - Reason: {$reason}");
}, 10, 2);
// ② カスタムホワイトリスト(誤検知を防ぐ)
add_filter('wordfence_ls_require_captcha', function(bool $require): bool {
// 特定のIPは CAPTCHA 不要
$whitelisted_ips = ['203.0.113.1', '198.51.100.0/24'];
$client_ip = $_SERVER['REMOTE_ADDR'] ?? '';
foreach ($whitelisted_ips as $ip) {
if ($client_ip === $ip) return false;
}
return $require;
});
ステップ5:カスタム WAF ルールを.htaccessで実装する
# .htaccess: 軽量なWAFルール(ModSecurity なしで使用可能)
<IfModule mod_rewrite.c>
RewriteEngine On
# ① SQL インジェクション パターンをブロック
RewriteCond %{QUERY_STRING} (union.*select|select.*from|insert.*into|drop.*table) [NC]
RewriteRule .* - [F,L]
# ② XSS パターンをブロック
RewriteCond %{QUERY_STRING} (<script|javascript:|on\w+=) [NC]
RewriteRule .* - [F,L]
# ③ パストラバーサルをブロック
RewriteCond %{REQUEST_URI} (\.\./|\.\.%2F) [NC]
RewriteRule .* - [F,L]
# ④ 悪意のある User-Agent をブロック
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|python-requests|Go-http-client|curl) [NC]
RewriteCond %{HTTP_USER_AGENT} !Googlebot [NC]
RewriteRule .* - [F,L]
# ⑤ 大量のクエリ文字列をブロック
RewriteCond %{QUERY_STRING} .{1000,} [NC]
RewriteRule .* - [F,L]
</IfModule>
注意事項
- ModSecurity の OWASP CRS を最初から
SecRuleEngine Onで有効化すると正常なリクエストがブロックされる場合があります。まずDetectionOnlyモードでログを収集し、誤検知ルールをホワイトリストに追加してからOnに切り替えてください .htaccessベースのWAFルールはModSecurityより軽量ですが検出精度が低く、エンコードされた攻撃を見逃す場合があります。本格的な保護にはModSecurityまたはCloudflare WAFを使用してください- Wordfenceの無料版WAFは「拡張保護モード」(Nginxモード)を手動で設定する必要があります。プラグインの指示に従って
auto_prepend_fileを設定するとパフォーマンスが向上します
まとめ
WAF設定は①ログで攻撃パターン(UNION SELECT・・../)を確認、②Apacheはlibapache2-mod-security2+OWASP CRSをインストールしてSecRuleEngine On、③Nginxはnginx-extrasで ModSecurity を有効化、④wp plugin install wordfenceでプラグインWAFを追加、⑤.htaccessでSQLi・XSS・トラバーサルの軽量ルールを設置します。