2026年5月20日
2026年5月20日
WordPressのファイルパーミッションを正しく設定する方法
はじめに
ファイルパーミッション(アクセス権限)の設定ミスはWordPressサイトへの不正アクセスを招く重大なセキュリティリスクです。特に wp-config.php が誰でも読める状態になっていると、データベース接続情報が漏洩します。正しいパーミッション設定を解説します。
症状・原因
- wp-config.phpのパーミッションが644(全ユーザーが読み取り可能)になっている
- uploadsディレクトリのPHPファイルが実行されてしまう
- WordPressの自動更新がパーミッションエラーで失敗する
- FTPアップロード後にファイルが実行されない
解決手順
ステップ1:推奨パーミッション値を確認する
WordPressの推奨パーミッション:
ファイル: 644 (rw-r--r--)
- オーナー: 読み書き可
- グループ/その他: 読み取りのみ
ディレクトリ: 755 (rwxr-xr-x)
- オーナー: 読み書き実行可
- グループ/その他: 読み取り・実行のみ
特別な設定が必要なファイル:
wp-config.php: 600 または 640(オーナーのみ読み書き)
.htaccess: 644(Apacheが読み取れる必要がある)
uploads/: 755(WordPress がファイルを書き込める必要がある)
ステップ2:パーミッションを一括修正する
# WordPressディレクトリに移動
cd /var/www/html
# すべてのディレクトリを755に設定
find . -type d -exec chmod 755 {} \;
# すべてのファイルを644に設定
find . -type f -exec chmod 644 {} \;
# wp-config.php を600(オーナーのみ)に設定
chmod 600 wp-config.php
# .htaccessは644のまま(Apacheが読む必要がある)
chmod 644 .htaccess
# uploadsディレクトリ(書き込み可能にする)
chmod 755 wp-content/uploads
find wp-content/uploads -type d -exec chmod 755 {} \;
find wp-content/uploads -type f -exec chmod 644 {} \;
# オーナーをWebサーバーユーザーに変更(通常 www-data または nginx)
chown -R www-data:www-data /var/www/html
ステップ3:wp-config.phpを保護する
# .htaccess: wp-config.php へのWebアクセスを完全ブロック
<Files wp-config.php>
Order Deny,Allow
Deny from all
</Files>
# .htaccess 自体への直接アクセスもブロック
<Files .htaccess>
Order Deny,Allow
Deny from all
</Files>
# wp-config.phpを1つ上のディレクトリに移動する方法もある
# WordPressは自動的に親ディレクトリのwp-config.phpを探す
ステップ4:uploadsディレクトリのPHP実行を禁止する
# wp-content/uploads/.htaccess を作成
# アップロードディレクトリでのPHPスクリプト実行を禁止
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
# phpファイルへのアクセスを拒否(Apache 2.4以降)
<Files "*.php">
Require all denied
</Files>
# nginx.conf: uploadsディレクトリのPHP実行禁止
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
// functions.php: アップロード時にPHPファイルを拒否
add_filter('wp_check_filetype_and_ext', function (array $data, string $file, string $filename): array {
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$php_extensions = ['php', 'php3', 'php4', 'php5', 'phtml', 'phar'];
if (in_array($ext, $php_extensions, true)) {
$data['ext'] = false;
$data['type'] = false;
}
return $data;
}, 10, 3);
ステップ5:パーミッションを定期確認する
// functions.php: 重要ファイルのパーミッション異常を検知して管理者に通知
add_action('admin_notices', function (): void {
if (!current_user_can('manage_options')) {
return;
}
$wp_config = ABSPATH . 'wp-config.php';
$perms = fileperms($wp_config) & 0777;
// 644以上の権限(グループ/その他書き込み可)は危険
if ($perms > 0640) {
printf(
'<div class="notice notice-error"><p><strong>セキュリティ警告:</strong> wp-config.php のパーミッションが <code>%s</code> です。<code>600</code> または <code>640</code> に変更してください。</p></div>',
decoct($perms)
);
}
});
# cronで定期的にパーミッションを確認するスクリプト
#!/bin/bash
WP_ROOT="/var/www/html"
CONFIG_PERMS=$(stat -c "%a" "$WP_ROOT/wp-config.php")
if [ "$CONFIG_PERMS" -gt "640" ]; then
echo "WARNING: wp-config.php permissions are $CONFIG_PERMS" | \
mail -s "WordPress Security Alert" admin@example.com
chmod 640 "$WP_ROOT/wp-config.php"
fi
注意事項
- パーミッションを777(全員書き込み可能)にすると、サーバー上の他のユーザーからファイルを書き換えられる危険があります。共有ホスティング環境では特に注意が必要です
- WordPressの自動更新が失敗する場合、webサーバーユーザー(www-data等)がWordPressファイルのオーナーになっているか確認してください
chmod 600に設定したwp-config.phpはFTPクライアントから読み取れなくなる場合があります。SSH/SFTPでの作業を推奨します
まとめ
ディレクトリは755・ファイルは644を基本とし、wp-config.php は600または640に設定します。.htaccess でwp-config.phpへのWebアクセスをブロックし、uploadsディレクトリのPHP実行を禁止します。admin_notices フックで管理画面にパーミッション異常を警告表示し、cronで定期監視します。