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で定期監視します。

お気軽にご相談ください

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