2026年5月20日
2026年5月20日
WordPressのwp-config.phpを安全に設置する方法
はじめに
wp-config.phpはWordPressで最も重要なファイルで、データベース接続情報・認証キー・テーブルプレフィックスが含まれます。このファイルが漏洩するとサイト全体が危険にさらされます。適切な保護措置を講じることが必須です。
症状・原因
wp-config.phpのパーミッションが644や666になっている- セキュリティスキャンで「wp-config.phpが外部からアクセス可能です」と指摘された
- wp-config.phpにデバッグ設定がオンのままになっている
- 認証キー(SALT)がデフォルトのままになっている
解決手順
ステップ1:現在の状態を確認する
# wp-config.php のパーミッションを確認
ls -la /var/www/html/wp-config.php
stat -c "%a %U:%G %n" /var/www/html/wp-config.php
# 理想: 600 www-data:www-data
# 外部からアクセスできないか確認
curl -I https://example.com/wp-config.php
# 403 または サーバーエラーが返ること(200は危険)
# wp-config.php に危険な設定がないか確認
grep -E "WP_DEBUG|DB_PASSWORD|SALT" /var/www/html/wp-config.php | head -10
ステップ2:パーミッションを修正する
# ① パーミッションを 600 に設定
chmod 600 /var/www/html/wp-config.php
# ② 所有者が正しいか確認
# Webサーバーが www-data の場合
sudo chown www-data:www-data /var/www/html/wp-config.php
# ③ 設定を確認
stat -c "%a %U:%G %n" /var/www/html/wp-config.php
# 600 www-data:www-data
# 別のユーザーが WordPress を管理している場合(VPS等)
# あなたのユーザーが所有者で、www-data がグループ読み取り
sudo chown your_user:www-data /var/www/html/wp-config.php
chmod 640 /var/www/html/wp-config.php
# .htaccess: wp-config.php への HTTP アクセスをブロック
<Files wp-config.php>
Order Deny,Allow
Deny from all
</Files>
ステップ3:wp-config.phpをドキュメントルート外に移動する
# WordPress は wp-config.php を1つ上のディレクトリで自動検索する
# /var/www/html/wp-config.php → /var/www/wp-config.php に移動
# ① ドキュメントルートの1つ上に移動
mv /var/www/html/wp-config.php /var/www/wp-config.php
# ② パーミッションを設定
chmod 600 /var/www/wp-config.php
# ③ WordPress が自動検出するか確認
# /var/www/html/ に wp-config.php がない場合、
# WordPress は /var/www/wp-config.php を自動的に探す
# ④ 動作確認
curl -I https://example.com/
# HTTP/2 200 が返ること
ステップ4:必須のセキュリティ設定を追加する
<?php
// wp-config.php: セキュリティ設定の全体像
// ① データベース接続情報(変更済みであること)
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_database_user');
define('DB_PASSWORD', 'your_strong_password_here');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
// ② 認証キーとソルト(必ず個別に生成すること)
// https://api.wordpress.org/secret-key/1.1/salt/ で生成
define('AUTH_KEY', 'ここに生成した値を入れる');
define('SECURE_AUTH_KEY', 'ここに生成した値を入れる');
define('LOGGED_IN_KEY', 'ここに生成した値を入れる');
define('NONCE_KEY', 'ここに生成した値を入れる');
define('AUTH_SALT', 'ここに生成した値を入れる');
define('SECURE_AUTH_SALT', 'ここに生成した値を入れる');
define('LOGGED_IN_SALT', 'ここに生成した値を入れる');
define('NONCE_SALT', 'ここに生成した値を入れる');
// ③ テーブルプレフィックス(デフォルトの wp_ から変更)
$table_prefix = 'site1_';
// ④ デバッグ設定(本番は全て false)
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', false);
// ⑤ 管理画面の SSL 強制
define('FORCE_SSL_ADMIN', true);
// ⑥ テーマ・プラグインのファイル編集を無効化
define('DISALLOW_FILE_EDIT', true);
// ⑦ プラグイン・テーマのインストールを無効化(任意)
// define('DISALLOW_FILE_MODS', true);
// ⑧ 自動更新の設定
define('WP_AUTO_UPDATE_CORE', 'minor'); // マイナー版のみ自動更新
// ⑨ リビジョン数を制限
define('WP_POST_REVISIONS', 5);
// ⑩ ゴミ箱の保持期間(日数)
define('EMPTY_TRASH_DAYS', 7);
ステップ5:認証キーを定期的に更新する
# WP-CLI で認証キーを更新(全セッションが無効化される)
wp config shuffle-salts
# 更新後に確認
wp config get AUTH_KEY --format=table
# 手動で更新する場合
# https://api.wordpress.org/secret-key/1.1/salt/ にアクセスして
# 生成された値を wp-config.php に貼り付ける
# インシデント発生時(不正アクセス等)は即座に実行
wp config shuffle-salts
wp eval "
global \$wpdb;
\$wpdb->query(\"DELETE FROM {\$wpdb->usermeta} WHERE meta_key = 'session_tokens'\");
echo 'All sessions invalidated' . PHP_EOL;
"
注意事項
- wp-config.phpをドキュメントルート外に移動した後、nginxの設定でドキュメントルートが
/var/www/htmlに固定されている場合は正常に動作します。ただしApacheでDocumentRootが変わる設定の場合は注意が必要です DISALLOW_FILE_MODS = trueを設定すると、WordPress管理画面からプラグイン・テーマのインストール・更新・削除が完全にできなくなります。更新はWP-CLI経由のみになります$table_prefixはインストール後に変更するとデータベースにアクセスできなくなります。変更する場合はデータベース内の全テーブル名とusermeta/optionsのメタキーも同時に変更が必要です
まとめ
wp-config.phpの保護は①chmod 600 wp-config.phpでパーミッションを設定、②.htaccessにを追加、③可能であれば/var/www/wp-config.phpにドキュメントルート外に移動、④FORCE_SSL_ADMIN・DISALLOW_FILE_EDIT・WP_DEBUG falseのセキュリティ定数を設定、⑤wp config shuffle-saltsで認証キーを定期更新します。