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.php200 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 Deny from allを追記、③Nginxはlocation = /wp-config.php { deny all; }を設定、④より確実な対策として/var/www/wp-config.phpにドキュメントルート外へ移動、⑤Fail2banでwp-config.phpへのプローブを検知・自動BANします。

お気軽にご相談ください

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