はじめに
WordPressは世界で最も使われているCMSで、その分だけ狙われる総量も最大です。侵入の多くはゼロデイのような高度な攻撃ではなく、「更新されていない古いプラグイン」「弱い管理者パスワード」「公開されたままの情報」といった基本の抜けを突いてきます。
この記事は、自社サイトやお客様のサイトをWordPressで運用・制作している方が、今日コピペで終えられる最低限の10項目をまとめたチェックリストです。各項目に nginx / Apache(.htaccess)/ wp-config.php / functions.php の設定例と、やると壊れやすい箇所まで添えました。完璧を目指す前に、まずここから埋めてください。
設定例は環境(サーバ構成・テーマ・プラグイン)により副作用が出ることがあります。本番反映前に必ず検証環境で確認し、可能ならバックアップを取ってから作業してください。
まず全体像:今日やる10項目
| # | 項目 | 主な効果 | 難易度 |
|---|---|---|---|
| 1 | コア・プラグイン・テーマを最新に保つ/不要なものは削除 | 侵入経路の大半を塞ぐ | 低 |
| 2 | ログインの保護(強パスワード・2FA・試行回数制限) | 総当たり・乗っ取り対策 | 低〜中 |
| 3 | ダッシュボードからのファイル編集を無効化 | 侵入後の被害拡大を防ぐ | 低 |
| 4 |
wp-config.php保護・ディレクトリ一覧停止・uploadsのPHP実行禁止 |
情報漏えい・Webシェル対策 | 中 |
| 5 | HTTPS強制+セキュリティヘッダ/Cookie属性 | 盗聴・XSS・CSRF対策 | 中 |
| 6 | XML-RPC・REST APIの露出を絞る | 総当たり増幅・列挙対策 | 中 |
| 7 | バージョン情報・ユーザー名の露出を止める | 偵察を困難にする | 低 |
| 8 | ユーザーと権限の最小化 | 事故・乗っ取りの影響を限定 | 低 |
| 9 | バックアップの自動化と外部保管 | 最後の保険 | 中 |
| 10 | 監視・外形チェック | 異常の早期発見 | 低〜中 |
共通の小技: 後述の
functions.php用コードは、テーマを変えると消えます。長く使うものは子テーマか、wp-content/mu-plugins/に置く小さな専用プラグイン(mu-plugin)にまとめると、更新やテーマ変更で消えません。
1. コア・プラグイン・テーマを最新に保つ/不要なものは削除
侵入の入口で最も多いのが古いプラグインの既知脆弱性です。ここを締めるだけで体感的に大半のリスクが下がります。
- WordPressコアのマイナー更新は既定で自動です。プラグイン/テーマも自動更新を有効化できます(管理画面の各一覧から個別にON、またはコードで一括)。
// wp-content/mu-plugins/ などに。プラグイン/テーマの自動更新を有効化
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');
- 注意: 自動更新はまれに表示崩れや不具合を招きます。重要サイトはステージング環境での確認や、最低限コアのマイナー自動更新+定期的な手動更新の運用にとどめる判断もあります。
- **使っていないプラグイン・テーマは「停止」ではなく「削除」**してください。停止中でもファイルが残っていれば脆弱性の的になります。デフォルトテーマを1つだけ残し、他は消すのが基本です。
2. ログインの保護
総当たり(ブルートフォース)とパスワード使い回しによる乗っ取りを防ぎます。
-
管理者ユーザー名を
adminにしない。 既にある場合は、新しい管理者を作って旧adminを削除(投稿は新ユーザーに引き継ぎ)。 - 強いパスワード+可能なら2要素認証(2FA)。2FAは専用プラグインで追加できます。
- ログイン試行回数の制限(ログイン保護系プラグイン)で総当たりを鈍らせる。
- 必要なら
wp-login.php/wp-adminをIP制限(固定IPで運用している場合):
# nginx:管理画面を特定IPのみ許可
location ~ ^/(wp-admin|wp-login\.php) {
allow 203.0.113.10; # 許可するIP
deny all;
# 既存のPHP処理(fastcgi_pass等)はこの中にも引き続き必要
}
# Apache(.htaccess):wp-login.php を特定IPのみ許可
<Files wp-login.php>
Require ip 203.0.113.10
</Files>
- 注意: IP制限は固定IP環境向けです。動的IPやリモートワークが多い場合は自分が締め出されます。その場合は2FA+試行回数制限を主軸に。
- 補足:総当たり対策やログイン後の挙動は、外部からのスキャンでは見えない領域です。プラグインの管理画面やサーバのアクセスログで実際に効いているかを確認してください。
3. ダッシュボードからのファイル編集を無効化
WordPressは管理画面からテーマ/プラグインのコードを直接編集できますが、これは管理者が乗っ取られた瞬間にWebシェルを仕込む踏み台になります。使っていないなら無効化が安全です。
// wp-config.php に追記
define('DISALLOW_FILE_EDIT', true);
- さらに強くするなら、管理画面からのプラグイン/テーマのインストール・更新自体を禁止する
DISALLOW_FILE_MODSもありますが、更新UIが使えなくなるため運用方法を決めてから(自動更新やWP-CLI運用とセット)にしてください。
4. wp-config.php保護・ディレクトリ一覧停止・uploadsのPHP実行禁止
外から見えてはいけないものを隠し、アップロード経由のWebシェル実行を止めます。
wp-config.php の保護とディレクトリ一覧の停止:
# Apache(.htaccess)
Options -Indexes
<Files wp-config.php>
Require all denied
</Files>
# nginx
autoindex off; # ディレクトリ一覧の停止(既定でoff)
location = /wp-config.php { deny all; }
location ~ /\.(?!well-known) { deny all; } # .git等のドットファイルを拒否
アップロードディレクトリでのPHP実行を禁止(重要):
# nginx
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
# Apache:wp-content/uploads/.htaccess として設置
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
- 注意: ごく一部のプラグインがuploads配下にPHPを置く前提のことがあります(まれ)。適用後に主要機能が動くか確認してください。
- 併せて、
wp-config.phpのセキュリティキー(SALT)が初期値のままなら、WordPress公式のシークレットキー生成で再生成して差し替えると、漏えい時のセッション無効化に役立ちます。
5. HTTPS強制+セキュリティヘッダ/Cookie属性
通信の盗聴・XSS・CSRFといった土台のリスクは、WordPress固有の対策ではなくWeb共通の作法で塞ぎます。
// wp-config.php:管理画面をHTTPS必須に
define('FORCE_SSL_ADMIN', true);
- HTTPセキュリティヘッダ(HSTS / CSP / X-Frame-Options など)の具体的な設定は、別記事で環境別にまとめています。WordPressにも当てはまるので、あわせて適用してください。
- 関連記事:Webサイトに最低限入れるべきHTTPセキュリティヘッダ7種と設定例(※公開済み記事のURLに差し替え)
- ログイン/セッションCookieに
Secure/HttpOnly/SameSiteを付ける手順も別記事にまとめています。WordPressの認証Cookieは既定でHttpOnly、Secureは上記HTTPS化で付きます。- 関連記事:CookieのSameSite / Secure / HttpOnly の正しい付け方(※同上)
6. XML-RPC・REST APIの露出を絞る
xmlrpc.php は総当たりの増幅(1リクエストで多数のパスワードを試行)やDDoSの踏み台に悪用されることがあります。使っていないなら塞ぎます。
# nginx:xmlrpc.php を拒否
location = /xmlrpc.php { deny all; }
# Apache(.htaccess)
<Files xmlrpc.php>
Require all denied
</Files>
-
注意: Jetpack、WordPressモバイルアプリ、ピンバックなどはXML-RPCを使います。これらを使う場合は完全拒否せず、ログイン保護側で対処してください。
add_filter('xmlrpc_enabled', '__return_false');はAPIメソッドを無効化しますが、ファイルへのアクセス自体は残るため、サーバ側の拒否のほうが確実です。
REST APIのユーザー一覧は、未ログインの第三者にユーザー名(ログインID候補)を渡してしまうことがあります。未ログインには返さないようにします。
// 未ログインユーザーには users エンドポイントを返さない
add_filter('rest_endpoints', function ($endpoints) {
if (!is_user_logged_in()) {
unset($endpoints['/wp/v2/users']);
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
- 注意: ブロックエディタや一部プラグインはログイン状態でこのエンドポイントを使います。上のコードはログイン済みには影響しませんが、外部連携が users エンドポイントに依存している場合は影響を確認してください。
7. バージョン情報・ユーザー名の露出を止める
攻撃者の「偵察(どのバージョンか・誰が管理者か)」を難しくします。
// WordPressのバージョン表記を出力しない
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');
// ?author=1 などによるユーザー名の列挙をトップへリダイレクト
add_action('template_redirect', function () {
if (!is_admin() && isset($_GET['author'])) {
wp_redirect(home_url(), 301);
exit;
}
});
-
readme.htmlやlicense.txtはバージョン推測に使われます。アクセスを拒否するか削除しておくと無難です(更新で復活することがあるため、サーバ側で拒否すると確実)。 - Webサーバ自体のバージョン表記(
Server/X-Powered-By)を隠す方法は、ヘッダ記事の関連トピックとして扱えます。
8. ユーザーと権限の最小化
- 投稿しかしない人を「管理者」にしない。役割は必要最小限(編集者・投稿者など)に。
- 退職者・委託先の不要アカウントは削除。
- 管理者は人数を絞り、各自に2FA。
事故やフィッシングで1アカウントが乗っ取られても、権限が小さければ被害を限定できます。
9. バックアップの自動化と外部保管
どれだけ守っても侵入や障害の可能性はゼロにできません。復旧できることが最後の保険です。
- DBとファイルを定期的に自動バックアップ(バックアップ系プラグイン、またはサーバ/ホスティングの機能)。
- 保管先はサイトとは別の場所(外部ストレージ等)に。同じサーバ上だけだと、サーバごとやられたときに復旧できません。
- 復元テストを一度はやっておく。「取れていたが戻せなかった」を防ぎます。
10. 監視・外形チェック
設定したつもりが効いていない、いつの間にか改ざんされていた、を早く気づける状態にします。
- セキュリティ系プラグイン(Wordfence、SiteGuard WP Plugin など):ファイル改ざん検知、ログイン保護、通知。1つ入れておくと多くの項目を底上げできます。
-
外形のチェック(以下は無料・評価軸が異なるので併用が有効):
- securityheaders.com / Mozilla Observatory:HTTPヘッダやCookie属性の採点。
- Google Lighthouse:Best Practicesにセキュリティ関連の指摘。
- OWASP ZAP:ローカルで動かせるOSSスキャナ。受動的な検査。
- サイトドック(sitedock.jp):URLを入れると登録不要で、ヘッダ・Cookie属性・バージョン表示・SPF/DMARCなどをパッシブに健診してスコア化する無料サービス。外から見える抜け漏れをまとめて確認したいときの手段の一つとして。
外形チェックで分かるのは外から見える範囲です。ログインの試行回数制限やファイル改ざん検知など内部の対策が効いているかは、プラグインの管理画面やサーバのログで別途確認してください。
まとめ(今日のチェックリスト)
- コア・プラグイン・テーマを更新し、不要なものは削除した
-
管理者ユーザー名は
adminではなく、強パスワード+2FA、試行回数制限を入れた -
DISALLOW_FILE_EDITを有効にした -
wp-config.phpを保護し、ディレクトリ一覧を止め、uploadsのPHP実行を禁止した - HTTPSを強制し、セキュリティヘッダ・Cookie属性を整えた(関連記事参照)
- 使わない XML-RPCを塞ぎ、REST APIのユーザー列挙を未ログインに返さないようにした
- バージョン表記とユーザー名の列挙を止めた
- ユーザーの権限を最小化し、不要アカウントを削除した
- 自動バックアップを外部保管し、復元できることを確認した
- 監視を入れ、外形チェックで抜け漏れを確認した
完璧主義より「まず全項目を1周」が効きます。1項目ずつでも着実に埋めていきましょう。
想定タグ: WordPress Security PHP nginx Apache
想定読了時間: 約10〜12分
難易度: 初〜中級
関連記事
- Webサイトに最低限入れるべきHTTPセキュリティヘッダ7種と設定例
- CookieのSameSite / Secure / HttpOnly の正しい付け方
- WordPressのメールが届かない・迷惑メールに入る原因と直し方
- 兵庫県の企業サイト307件を外形調査したら…(2026年実態調査)
お知らせ — バーチャルセキュリティコンシェルジュ「一ノ瀬あかり」がデビューしました🎉
JIISセキュリティラボから、セキュリティ用語をやさしく動画で解説する案内役「一ノ瀬あかり」が登場しました。よければデビューのご挨拶もご覧ください。