2026年5月20日
2026年5月20日
WordPressのwp-config.phpへの外部アクセスをブロックする方法
はじめに
wp-config.phpはWordPressの設定ファイルで、データベース接続情報や認証キーが含まれます。通常PHPとして実行されるためブラウザから内容は見えませんが、設定ミスや将来の脆弱性に備えてHTTPアクセス自体をブロックすることが推奨されます。
症状・原因
- セキュリティスキャンで「wp-config.phpへのアクセスが許可されています」と指摘された
curl https://example.com/wp-config.phpが200 OKを返している.htaccessの設定が適切でなく、機密ファイルへのアクセス制限がない- アクセスログに
wp-config.phpへの不審なアクセスが記録されている
解決手順
ステップ1:現在のアクセス状況を確認する
# wp-config.php への HTTP アクセスを確認
curl -I https://example.com/wp-config.php
# 200 OK → ブロックが必要
# 403 Forbidden → 既にブロック済み(ただし内容確認も重要)
# 301/302 → リダイレクトされているため実態を追う
# アクセスログで過去のアクセスを確認
grep "wp-config.php" /var/log/apache2/access.log | tail -20
grep "wp-config.php" /var/log/nginx/access.log | tail -20
# 危険なファイルへのアクセスを一括確認
for file in wp-config.php readme.html license.txt xmlrpc.php; do
code=$(curl -o /dev/null -s -w "%{http_code}" "https://example.com/${file}")
echo "${file}: ${code}"
done
ステップ2:Apacheで wp-config.php へのアクセスをブロックする
# WordPress ルートの .htaccess(# BEGIN WordPress の前に追記)
# ① wp-config.php への全アクセスを拒否
<Files wp-config.php>
Order Deny,Allow
Deny from all
</Files>
# ② 関連する機密ファイルも一括ブロック
<FilesMatch "^(wp-config\.php|wp-config-sample\.php|readme\.html|license\.txt|readme\.txt|\.htaccess|\.htpasswd|php\.ini)$">
Order Deny,Allow
Deny from all
</FilesMatch>
# ③ .git ディレクトリへのアクセスもブロック(バージョン管理情報の漏洩防止)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^\.git - [F,L]
</IfModule>
# .htaccess を編集後に構文チェック
sudo apache2ctl configtest
# アクセスブロックの確認
curl -I https://example.com/wp-config.php
# HTTP/2 403 が返れば成功
ステップ3:Nginx で wp-config.php へのアクセスをブロックする
# /etc/nginx/sites-available/example.com
server {
# ... 既存の設定 ...
# ① wp-config.php へのアクセスを完全に拒否
location = /wp-config.php {
deny all;
access_log off;
log_not_found off;
}
# ② 機密ファイルをまとめてブロック
location ~* ^/(wp-config\.php|readme\.html|license\.txt|readme\.txt)$ {
deny all;
access_log off;
log_not_found off;
}
# ③ .git などの隠しディレクトリをブロック
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
# Nginx 設定テストと反映
sudo nginx -t && sudo systemctl reload nginx
# 確認
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-config.php
# 403 が返れば成功
ステップ4:wp-config.php をドキュメントルート外に移動してさらに安全にする
# WordPress は wp-config.php を1つ上のディレクトリで自動検索する
# ドキュメントルート外に移動することで HTTP アクセスを根本から不可能にする
# ① バックアップ
cp /var/www/html/wp-config.php /var/www/html/wp-config.php.bak
# ② ドキュメントルート外に移動
mv /var/www/html/wp-config.php /var/www/wp-config.php
chmod 600 /var/www/wp-config.php
# ③ WordPress が自動検出するか確認(wp-config.php が /var/www/ にある場合)
curl -I https://example.com/
# HTTP/2 200 が返ること(サイトが正常動作)
# ④ ドキュメントルート上のバックアップファイルを削除
rm /var/www/html/wp-config.php.bak
# ⑤ HTTP でアクセスできないことを確認
curl -I https://example.com/wp-config.php
# 404 が返れば完全にブロック済み
ステップ5:アクセスログを監視する
# wp-config.php へのアクセスをリアルタイム監視
tail -f /var/log/apache2/access.log | grep --line-buffered "wp-config"
# 過去24時間のアクセスを集計
awk '/wp-config\.php/ {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
# fail2ban で wp-config.php へのアクセスを試みるIPをBAN
cat > /etc/fail2ban/filter.d/wp-config-probe.conf << 'EOF'
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD) /wp-config\.php
ignoreregex =
EOF
# /etc/fail2ban/jail.local に追記
# [wp-config-probe]
# enabled = true
# filter = wp-config-probe
# logpath = /var/log/apache2/access.log
# maxretry = 1
# bantime = 86400
注意事項
ディレクティブは.htaccessが有効(AllowOverride All)な場合のみ機能します。AllowOverride None環境ではhttpd.confに設定が必要です- wp-config.phpをドキュメントルート外に移動した後も、WordPressが正常に動作しているか必ず確認してください。一部のホスティング環境では1つ上のディレクトリが別の仮想ホストの場合があります
wp-config-sample.phpも同様にブロックしてください。バージョン情報が含まれているためです
まとめ
wp-config.phpのアクセスブロックは①curl -I example.com/wp-config.phpで現状確認、②Apacheは.htaccessにを追記、③Nginxはlocation = /wp-config.php { deny all; }を設定、④より確実な対策として/var/www/wp-config.phpにドキュメントルート外へ移動、⑤Fail2banでwp-config.phpへのプローブを検知・自動BANします。