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 Deny from allを追加、③可能であれば/var/www/wp-config.phpにドキュメントルート外に移動、④FORCE_SSL_ADMINDISALLOW_FILE_EDITWP_DEBUG falseのセキュリティ定数を設定、⑤wp config shuffle-saltsで認証キーを定期更新します。

お気軽にご相談ください

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