2026年5月20日

2026年5月20日

WordPressのファイルパーミッションを正しく設定する方法(セキュリティ観点)

はじめに

WordPressのファイルパーミッションが不適切だと、攻撃者がファイルを読み取ったり書き込んだりできる状態になります。適切なパーミッションを設定することで、マルウェアの設置やファイル改ざんを大幅に難しくできます。

症状・原因

  • セキュリティスキャンで「ファイルパーミッションが777になっています」と指摘された
  • ホスティング会社から「書き込み可能なPHPファイルが存在します」と通知が届いた
  • マルウェアが設置されており、削除してもすぐに復活する
  • wp core verify-checksums は通るがファイルが改ざんされている

解決手順

ステップ1:現在のパーミッションを確認する

# WordPress ルートのファイルパーミッションを確認
ls -la /var/www/html/

# 危険なパーミッション(777)のファイルを検索
find /var/www/html -type f -perm 0777 | head -20

# 世界書き込み可能(o+w)なファイルを検索
find /var/www/html -type f -perm /o+w | head -20

# 世界書き込み可能なディレクトリを検索
find /var/www/html -type d -perm /o+w | head -20

# wp-config.php のパーミッションを確認
ls -la /var/www/html/wp-config.php
# 理想: -rw------- (600)

# .htaccess のパーミッションを確認
ls -la /var/www/html/.htaccess
# 理想: -rw-r--r-- (644)

ステップ2:推奨パーミッションを一括適用する

# WordPress 推奨パーミッション:
# ディレクトリ: 755 (rwxr-xr-x)
# ファイル:     644 (rw-r--r--)
# wp-config.php: 600 (rw-------)
# .htaccess:    644 (rw-r--r--)

# ① 全ディレクトリを 755 に設定
find /var/www/html -type d -exec chmod 755 {} \;

# ② 全ファイルを 644 に設定
find /var/www/html -type f -exec chmod 644 {} \;

# ③ wp-config.php を 600 に設定(最重要)
chmod 600 /var/www/html/wp-config.php

# ④ アップロードディレクトリは書き込み可能に(Webサーバーが書き込む必要がある)
chmod 755 /var/www/html/wp-content/uploads
chmod 755 /var/www/html/wp-content/cache

# ⑤ 設定を確認
ls -la /var/www/html/wp-config.php
stat -c "%a %n" /var/www/html/wp-config.php
# 600 /var/www/html/wp-config.php

ステップ3:所有者・グループを正しく設定する

# Webサーバーの実行ユーザーを確認
ps aux | grep -E "apache|nginx|php-fpm" | head -3
# Apache: www-data
# Nginx + PHP-FPM: www-data または nginx

# WordPress ファイルの所有者を設定
# パターン1: Webサーバーが所有者(共有ホスティングで一般的)
sudo chown -R www-data:www-data /var/www/html/

# パターン2: 管理ユーザーが所有者、Webサーバーがグループ(VPS推奨)
sudo chown -R your_user:www-data /var/www/html/
# → ファイルはあなたが書き込める、Webサーバーは読み取りのみ

# パターン2の場合のパーミッション設定
find /var/www/html -type d -exec chmod 750 {} \;
find /var/www/html -type f -exec chmod 640 {} \;
chmod 600 /var/www/html/wp-config.php
# wp-content/uploads は Webサーバーが書き込めるよう調整
chmod 770 /var/www/html/wp-content/uploads

ステップ4:PHPファイルの実行を制限する

# .htaccess: wp-content/uploads での PHP 実行を禁止
# /var/www/html/wp-content/uploads/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|phar)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

# wp-content/uploads 全体での PHP を禁止
<IfModule mod_php.c>
    php_flag engine off
</IfModule>
# Nginx: uploads ディレクトリでの PHP 実行を禁止
location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}

ステップ5:定期的なパーミッションチェックを自動化する

# 危険なパーミッションを検出してメール通知するスクリプト
cat > /usr/local/bin/wp-perm-check.sh << 'EOF'
#!/bin/bash
WP_ROOT="/var/www/html"
ADMIN_EMAIL="admin@example.com"
ISSUES=""

# 777 のファイルを検索
WORLD_WRITABLE=$(find "$WP_ROOT" -type f -perm 0777 2>/dev/null)
if [ -n "$WORLD_WRITABLE" ]; then
    ISSUES="$ISSUES\n[危険] 777のファイル:\n$WORLD_WRITABLE\n"
fi

# wp-config.php のパーミッションを確認
CONFIG_PERM=$(stat -c "%a" "$WP_ROOT/wp-config.php")
if [ "$CONFIG_PERM" != "600" ] && [ "$CONFIG_PERM" != "400" ]; then
    ISSUES="$ISSUES\n[警告] wp-config.php のパーミッションが $CONFIG_PERM です\n"
fi

# 問題があればメール送信
if [ -n "$ISSUES" ]; then
    echo -e "WordPressパーミッション警告:\n$ISSUES" | \
        mail -s "[警告] WordPressファイルパーミッション異常" "$ADMIN_EMAIL"
fi
EOF
chmod +x /usr/local/bin/wp-perm-check.sh

# 毎日実行
echo "0 2 * * * root /usr/local/bin/wp-perm-check.sh" > /etc/cron.d/wp-perm-check
// functions.php: 管理画面でパーミッション警告を表示
add_action('admin_notices', function(): void {
    if (!current_user_can('manage_options')) return;

    $wp_root = ABSPATH;
    $config_perm = substr(sprintf('%o', fileperms($wp_root . 'wp-config.php')), -3);

    if (!in_array($config_perm, ['600', '400'], true)) {
        echo '<div class="notice notice-error"><p>';
        printf(
            '<strong>セキュリティ警告:</strong> wp-config.php のパーミッションが <code>%s</code> です。' .
            '<code>600</code> に変更することを推奨します。',
            esc_html($config_perm)
        );
        echo '</p></div>';
    }
});

注意事項

  • chmod 600wp-config.phpに適用すると、Webサーバー(www-data)がファイルを読めなくなることがあります。所有者がwww-dataの場合は600で問題ありませんが、所有者が別ユーザーの場合は640(グループも読み取り可)が必要な場合があります
  • chmod 777は「全員に全権限」を与える最も危険な設定です。一時的なデバッグでも使用しないでください
  • パーミッション変更後は必ずWordPressの動作確認(画像アップロード・プラグイン更新・キャッシュ生成)を行ってください

まとめ

ファイルパーミッション設定は①find -perm 0777で危険なファイルを検出、②find -type d -exec chmod 755find -type f -exec chmod 644で一括修正、③chmod 600 wp-config.phpで最重要ファイルを保護、④uploadsとcacheは755でWebサーバーが書き込めるよう設定、⑤/etc/cron.d/の日次cronスクリプトで自動監視します。

お気軽にご相談ください

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