2026年5月31日
2026年5月31日
WordPressのwp-config.phpをセキュアに設定する方法
はじめに
「wp-config.phpの設定を見直してセキュリティを強化したい」「本番環境でWP_DEBUGがtrueになっていた」「wp-config.phpをドキュメントルート外に移動したい」——wp-config.phpはWordPressで最も重要な設定ファイルであり、適切な保護が必要です。
症状・原因
wp-config.phpにはデータベースパスワードや秘密鍵が含まれており、アクセス権が不適切だとサーバー侵害時に深刻な被害につながります。本番環境でWP_DEBUG=trueが設定されていると、エラーメッセージにデータベース情報やファイルパスが露出する場合があります。
解決手順
ステップ1:セキュリティキーと認証キーを更新する
// wp-config.php: WordPress秘密鍵(必ず一意のランダム値を設定)
// 新しい秘密鍵はこちらで生成: https://api.wordpress.org/secret-key/1.1/salt/
define( 'AUTH_KEY', 'ランダムな文字列(64文字以上推奨)' );
define( 'SECURE_AUTH_KEY', 'ランダムな文字列(64文字以上推奨)' );
define( 'LOGGED_IN_KEY', 'ランダムな文字列(64文字以上推奨)' );
define( 'NONCE_KEY', 'ランダムな文字列(64文字以上推奨)' );
define( 'AUTH_SALT', 'ランダムな文字列(64文字以上推奨)' );
define( 'SECURE_AUTH_SALT', 'ランダムな文字列(64文字以上推奨)' );
define( 'LOGGED_IN_SALT', 'ランダムな文字列(64文字以上推奨)' );
define( 'NONCE_SALT', 'ランダムな文字列(64文字以上推奨)' );
// 秘密鍵を変更すると既存のセッションがすべて無効になる(全ユーザーが強制ログアウト)
// 不正アクセス発覚後は直ちに更新すること
ステップ2:デバッグ設定を本番環境向けに調整する
// wp-config.php: 本番環境の推奨設定
// デバッグを完全に無効化(本番環境では必ずfalse)
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', false );
define( 'WP_DEBUG_DISPLAY', false );
define( 'SCRIPT_DEBUG', false );
// ========================
// 開発環境での設定例(本番環境では使わない)
// ========================
// define( 'WP_DEBUG', true );
// define( 'WP_DEBUG_LOG', true ); // /wp-content/debug.logに出力
// define( 'WP_DEBUG_DISPLAY', false ); // 画面には表示しない(ログにのみ記録)
// @ini_set( 'display_errors', 0 );
// エラーログをWordPress外のパスに変更(本番環境)
// @ini_set( 'error_log', '/var/log/php_errors.log' );
ステップ3:セキュリティ強化のための定数を設定する
// wp-config.php: セキュリティ強化定数
// 管理画面のテーマ・プラグインエディターを無効化
define( 'DISALLOW_FILE_EDIT', true );
// プラグイン・テーマのインストール・更新を管理画面から無効化
// (コアの自動更新は別設定で制御可能)
define( 'DISALLOW_FILE_MODS', true );
// WordPress管理画面からのコアの自動更新を制御
define( 'WP_AUTO_UPDATE_CORE', 'minor' ); // マイナーアップデートのみ自動(推奨)
// define( 'WP_AUTO_UPDATE_CORE', true ); // すべての更新を自動
// define( 'WP_AUTO_UPDATE_CORE', false ); // 自動更新を無効
// データベーステーブルプレフィックスをデフォルト以外に設定
// (新規インストール時に変更。既存サイトでの変更はDB直接変更が必要)
// $table_prefix = 'wp_'; ← これをユニークな値に変更
// $table_prefix = 'mysite_abc_';
// SSL/HTTPSを強制(管理画面とログインページ)
define( 'FORCE_SSL_ADMIN', true );
// 投稿リビジョンの保存数を制限(DBの肥大化防止)
define( 'WP_POST_REVISIONS', 5 );
// ゴミ箱を無効化(0)または日数を短縮
define( 'EMPTY_TRASH_DAYS', 7 ); // 7日でゴミ箱を自動削除
// メモリ制限の設定
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' ); // 管理画面用
// Cronを無効化してサーバーcronを使う場合
// define( 'DISABLE_WP_CRON', true );
// cookieドメインを明示的に設定
define( 'COOKIE_DOMAIN', 'example.com' );
ステップ4:wp-config.phpをドキュメントルート外に移動する
# wp-config.phpをWebからアクセスできない場所に移動する
# WordPressは自動的に1階層上のディレクトリを検索する
# 現在の構成:
# /var/www/html/wp-config.php ← Webからアクセス可能(危険)
# /var/www/html/index.php
# 推奨構成:
# /var/www/wp-config.php ← Webからアクセス不可(安全)
# /var/www/html/index.php
# 移動コマンド
mv /var/www/html/wp-config.php /var/www/wp-config.php
# WordPressは /var/www/html/ の1階層上 /var/www/ を自動検索する
# ただしシンボリックリンクやサーバー設定によっては動作しない場合がある
# .htaccessでwp-config.phpへのWebアクセスを明示的にブロック(移動しない場合)
# .htaccess: wp-config.phpへのHTTPアクセスを完全にブロック
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
# .htaccess自体へのアクセスもブロック
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>
# wp-includes ディレクトリ内のPHPファイルへの直接アクセスをブロック
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
ステップ5:ファイルパーミッションを正しく設定する
# wp-config.phpのパーミッションを400または440に設定
chmod 400 /var/www/html/wp-config.php
# 400: オーナーのみ読み取り可(最も安全)
# 440: オーナーとグループが読み取り可(PHPがグループ実行の場合)
# 644: 全員読み取り可(危険 - デフォルトから変更すること)
# .htaccessのパーミッション
chmod 444 /var/www/html/.htaccess
# WordPressのコアファイル・ディレクトリのパーミッション
find /var/www/html -type d -exec chmod 755 {} \; # ディレクトリ: 755
find /var/www/html -type f -exec chmod 644 {} \; # ファイル: 644
# wp-content/uploads のみ書き込み可能に
chmod -R 755 /var/www/html/wp-content/uploads/
# オーナーをWebサーバーユーザーに設定
chown -R www-data:www-data /var/www/html/
chown root:www-data /var/www/html/wp-config.php # オーナーをrootに
注意事項
DISALLOW_FILE_MODS=trueを設定するとプラグイン・テーマの自動更新も無効になります。セキュリティアップデートを手動で適用するか、WP-CLIを使った自動更新スクリプトを別途用意してください。- 秘密鍵を変更するとすべてのユーザーが強制ログアウトされます。ECサイトなど常時ログインが必要なサイトでは、メンテナンス時間帯に変更してください。
$table_prefixをwp_以外に変更するのは新規インストール時に行うのが最も安全です。既存サイトで変更するにはDBのテーブル名とオプション値を手動で変更する必要があります。
まとめ
wp-config.phpのセキュリティ強化は「秘密鍵をWordPressのジェネレーターで更新→本番環境ではWP_DEBUG=false→DISALLOW_FILE_EDITとFORCE_SSL_ADMINを有効化→wp-config.phpを1階層上に移動または.htaccessで保護→ファイルパーミッションを400に設定」の流れで整備します。関連記事:WordPressの不正ログインを防ぐ方法、WordPressのファイルパーミッションを正しく設定する方法。