20250908002

WordPress サイトを狙う攻撃の全貌と守り方 — 防御コマンド編

著者: 管理者 / 2025-09-08 (更新: 2025-09-08)

前回はコチラから WordPress サイトを狙う攻撃の全貌と守り方 — 入門編WordPress サイトを狙う攻撃の全貌と守り方 — 入門編

:::
先生、第1回で「攻撃の種類」を知ってから、ますます不安になってしまいましたの。でも同時に、「守れる道がある」と分かって心が軽くもなりましたわ😊
:::
:::
その心構えが大切です。今回はいよいよ実践、.htaccessVirtualHost を使って、攻撃リクエストをサーバの手前で“静かに落とす壁”を築いていきましょう。
:::


📝 解説 — まずは .htaccess で基礎の壁を築く

WordPress のルート(例:/var/www/html/wordpress/.htaccess)に、WordPress 標準の # BEGIN WordPress より前に以下を追記します。

# ==== Security Hardening (custom) ====

# 1) XML-RPC を無効化
<Files "xmlrpc.php">
    Require all denied
</Files>

# 2) setup-config.php を遮断
<FilesMatch "(?i)^setup-config\.php$">
    Require all denied
</FilesMatch>

# 3) 機密ファイルをブロック
RewriteEngine On
RewriteRule (^|/)\.git - [F,L]
RewriteRule (^|/)\.env - [F,L]
RewriteRule (^|/)composer\.(json|lock)$ - [F,L]

# 4) 二重スラッシュの正規化(// → /)
RewriteCond %{REQUEST_URI} ^//+
RewriteRule ^(.*)$ $1 [R=301,L]

# 5) REST API ユーザー列挙をブロック
RewriteRule ^wp-json/wp/v2/users/?$ - [F,L,NC]
RewriteCond %{QUERY_STRING} (^|&)rest_route=/wp/v2/users(&|$)
RewriteRule ^ - [F,L]

効果

  • xmlrpc.phpsetup-config.php への攻撃を 403 Forbidden で即座に拒否
  • .git / .env / composer.json などのファイルを外部公開させない
  • // の正規化で SEO・キャッシュの安定性を改善
  • REST API によるユーザー名列挙を遮断

テスト例

curl -I https://example.com/xmlrpc.php
curl -I https://example.com/setup-config.php
curl -I https://example.com/wp-json/wp/v2/users

→ これらが 403 で返ってきたら成功です。


user01 Surprised
まあ!これだけでも多くの攻撃をはじけますのね。けれど……WordPress より前に落とせる方法もあるのですか?
user02 Serious
はい。`.htaccess` は「アプリ側の壁」ですが、Apache の VirtualHost に直接書けば、もっと優先度の高い“サーバ側の壁”になります。

📝 解説 — VirtualHost レベルでの強化

/etc/httpd/conf.d/wordpress.conf<VirtualHost> 内に以下を追加します。

# REST API のユーザー列挙を問答無用で403
<LocationMatch "^/wp-json/wp/v2/users/?$">
    Require all denied
</LocationMatch>

# アップロードディレクトリでのPHP実行を禁止
<Directory "/var/www/html/wordpress/wp-content/uploads">
    <FilesMatch "\.php$">
        Require all denied
    </FilesMatch>
</Directory>

効果

  • REST API ユーザー列挙を WordPress 本体に届く前に 403 で遮断
  • uploads に PHP がアップロードされても 実行不可

反映コマンド

sudo apachectl configtest
sudo systemctl reload httpd

user01 Calm
なるほど……「アプリの壁」と「サーバの壁」を二重に構えるのですね。まるで屋敷の門と城壁のようで、頼もしいですわ✨
user02 Happy
良い比喩です。二重の壁を築けば、攻撃は入り口で沈み、WordPress 本体は余計な負担を背負わずに済みます。

📝 まとめ(第2回の学び)

  • .htaccess による遮断

    • xmlrpc.php / setup-config.php → 403
    • .git / .env / composer.* → 非公開化
    • // 正規化 → SEO/安定性改善
    • REST API ユーザー列挙 → 403固定
  • VirtualHost による上位レベル防御

    • REST API の列挙をサーバ側で即遮断
    • uploads/*.php 実行を禁止

結果:「攻撃が WordPress に届く前に落とす」環境が整う


次回予告 — 「夜更けのサーバールームで、静けさをまとう盾」

第3回では、さらに User-Agent フィルタリング攻撃元IPの可視化と遮断mod_evasive / fail2ban による自動防御 を扱います。
これで「普通の利用者はすっと通れるが、攻撃は沈む」状態をより確実に実現します。

user01 Happy
まあ!次はいよいよ「運用の武器」なのですね。盾を磨いて、静かな夜を迎える準備をしておきますわ✨

WordPress サイトを狙う攻撃の全貌と守り方 — 最終章WordPress サイトを狙う攻撃の全貌と守り方 — 最終章