- 実践 WordPress ホーム
- セキュリティ強化
.htaccess
だけでできる WordPress セキュリティ強化策
WordPress サイトのセキュリティ対策は WordPress を利用する上で欠かせません。
WordPress のセキュリティ対策といえば WordPress には強力なセキュリティ系プラグインがありますが、それらは多くの場合多機能で大規模です。 インストールするとサイトのパフォーマンスが低下したり他のプラグインとの相性問題で思わぬ不具合が発生したりすることもあります。
実は WordPress サイトで考慮すべきセキュリティリスクの多くは、セキュリティプラグインを使わずともある程度は .htaccess
だけで低減することが可能です。
ここでは、プラグインを使わずにできる、 .htaccess
を使ったセキュリティ強化策を紹介します。
.htaccess
とは?
.htaccess
は Apache と呼ばれるウェブサーバー用の設定ファイルの名前です。
サーバーのディレクトリに .htaccess
ファイルを設置することで、サイトにアクセスがあったときのサーバーのふるまいを制御することができます。
WordPress サイトは Apache 以外のサーバーでも動かすことができますが、 Apache サーバーで動かす形が主流です。
Apache サーバーを使った WordPress サイトであれば多くの場合 .htaccess
が利用できます(レンタルサーバーの仕様によってはできないこともあります)。
対象バージョン
ウェブサーバー Apache のバージョn 2.4 系を対象としています。 バージョンが異なると同じ記述でも構文エラーになることがあるため注意してください。
.htaccess
編集時の注意点
以下注意点です。
.htaccess
ファイルを編集する前に必ずバックアップを作成してください。- 記述は 1 文字でも間違うと期待したとおりに動作しません。設定がまずいとサイトにアクセスできなくなる可能性もあるため、本番環境以外の環境で事前に試してから本番環境に反映させてください。
.htaccess
でできるセキュリティ強化策
1. .
始まりのファイルやディレクトリへのアクセスを拒否する
ファイル名が .
で始まる隠しファイルや隠しディレクトリへのアクセスを拒否します。
これには .htaccess
ファイルと後述の Basic 認証用のファイル .htpasswd
ファイルが含まれます。
ただし、ドメインルートの .well-known/
には外部からアクセスができる必要のあるファイルを設置することがあるので対象から除外します。
2. WordPress インストールディレクトリの公開不要なファイルへのアクセスを拒否する
インストールディレクトリ直下の公開不要なファイルへのアクセスを拒否します。
<FilesMatch "^(license.txt|readme.html|wp-config.php|wp-config-sample.php)$">
Order allow,deny
Deny from all
</FilesMatch>
この中で最も重要なのは wp-config.php
です。
wp-config.php
はシークレットキーやソルト、データベース接続情報などを含んでおり、万が一外部から閲覧された場合は重大なセキュリティリスクに繋がります。
3. WordPress インストールディレクトリの利用しないファイルへのアクセスを拒否する
利用しないファイルへのアクセスを拒否します。
例えば、 WordPress サイトのインストールが実行済みの場合は install.php
は必要ありません。
外部からのユーザー登録が不要な場合は wp-signup.php
は必要ありません。
XML-RPC の機能を使わない場合は xmlrpc.php
は必要ありません。
4. include PHP へのアクセスを拒否する
他の PHP ファイルから読み込まれて使われることが想定されている、いわゆる include PHP ファイルへの直接のアクセスを拒否します。
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
※このコードはマルチサイトでは正しく動きません
5. アップロードファイルのアクセスを拡張子を制限して許可する
アップロードファイルへのアクセスを allowlist 方式で拡張子を制限して許可します。
この .htaccess
ファイルは WordPress インストールディレクトリ下の wp-content/uploads/
ディレクトリに配置する必要があります。
# すべてのファイルへのアクセスをデフォルトで拒否
<FilesMatch ".*">
Order allow,deny
Deny from all
</FilesMatch>
# 特定の拡張子のファイルへのアクセスを許可
<FilesMatch "\.(jpg|jpeg|png|gif|webp|avif|pdf|docx|xlsx|pptx)$">
Order allow,deny
Allow from all
</FilesMatch>
この設定を行う場合の注意点があります。
- アップロードする可能性のあるファイル拡張子をすべて記述しておく必要がある
- 新たにアップロードするファイル拡張子が増えた場合は設定を更新する必要がある
allowlist 方式を採用するのが難しい場合は、アップロードされた PHP ファイルの実行を実行を防ぐだけでもセキュリティが改善できます。
この .htaccess
ファイルも wp-content/uploads/
ディレクトリに配置する必要があります。
この設定をしておくと、プラグインの脆弱性が悪用されるなどして万が一 PHP ファイルがアップロードされたときのリスクが軽減できます。
6. ディレクトリの表示を行わない
ディレクトリにアクセスされたときにファイル一覧表示を行わないようにします。
7. 特定の IP アドレスからのアクセスを拒否します
特定の IP アドレスからのサイトへのアクセスを拒否します。
サイトの利用のほとんどが国内からのものであれば、海外からのアクセスを拒否してしまうのも有効な手段の一つです。
例えばロシアや中国のようにサイバー攻撃を国家として積極的に行っている国もあるため、それらの国の IP アドレスを丸ごと拒否するのも効果的です。 実際、攻撃をよく行う国からのアクセスをブロックすると厄介なブルートフォース攻撃や不審なアクセスは大幅に減らせます。
8. 特定のユーザーエージェントによるアクセスを拒否する
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(bot|spider|crawler).* [NC]
RewriteRule .* - [F,L]
このコードではユーザーエージェント名に bot
spider
crawler
を含むリクエストを拒否します。
9. ログイン画面に Basic 認証をかける
ログイン画面に Basic 認証をかけることで、 WordPress の認証処理を行う前にサーバーレイヤーでアクセス制御を行うことができます。
# ログイン画面に Basic 認証をかける:
<Files "wp-login.php">
AuthType Basic
AuthName "Secret name"
AuthUserFile /path/to/.htpasswd
Require valid-user
</Files>
関連ページ: WordPress で .htaccess を使って Basic 認証をかける方法
10. セキュリティ関連ヘッダーを追加する
セキュリティ関連ヘッダーを追加します。
<IfModule mod_headers.c>
# content sniffing を無効にする:
Header always set X-Content-Type-Options nosniff
# Proxy ヘッダーを無効にする:
RequestHeader unset Proxy
</IfModule>
11. HTTP トラフィックを HTTPS にリダイレクトする
http://
のリクエストを https://
にリダイレクトします。
さらに HSTS (HTTP Strict Transport Security) ヘッダーを追加します。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
こうすることで利用者との間の通信が平文でやりとりされることを防げます。
ただし、前提として HTTPS がサーバーでサポートされている必要があります。 また、 SSL/TLS 証明書の更新の都合などで HTTP リクエストをリダイレクトするとまずい場合もあるため、この設定をしても問題がないかを事前に検証するようにしてください。
結び
このように .htaccess
ファイルを適切に使えば、プラグインを使わなくても WordPress サイトのセキュリティを大幅に強化できます。
本来なら WordPress に同梱の .htaccess
に記述されていてもよいぐらい基本的な設定もありますが、おそらく後方互換性維持の観点から WordPress に同梱の .htaccess
はシンプルな記述にとどまっています。
WordPresss サイトのセキュリティ強化にぜひ .htaccess
を活用してください。