コンテンツにスキップ

.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. . 始まりのファイルやディレクトリへのアクセスを拒否する

ファイル名が . で始まる隠しファイルや隠しディレクトリへのアクセスを拒否します。

RewriteEngine on
RewriteRule "/\.|^\.(?!well-known/)" - [F]

これには .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 は必要ありません。

<Files "install.php">
  Order allow,deny
  Deny from all
</Files>

外部からのユーザー登録が不要な場合は wp-signup.php は必要ありません。

<Files "wp-signup.php">
  Order allow,deny
  Deny from all
</Files>

XML-RPC の機能を使わない場合は xmlrpc.php は必要ありません。

<Files "xmlrpc.php">
  Order allow,deny
  Deny from all
</Files>

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 へのアクセスを許可
<FilesMatch "\.php$">
  Order allow,deny
  Deny from all
</FilesMatch>

この設定をしておくと、プラグインの脆弱性が悪用されるなどして万が一 PHP ファイルがアップロードされたときのリスクが軽減できます。

6. ディレクトリの表示を行わない

ディレクトリにアクセスされたときにファイル一覧表示を行わないようにします。

Options -Indexes

7. 特定の IP アドレスからのアクセスを拒否します

特定の IP アドレスからのサイトへのアクセスを拒否します。

deny from 123.456.789.10

サイトの利用のほとんどが国内からのものであれば、海外からのアクセスを拒否してしまうのも有効な手段の一つです。

例えばロシアや中国のようにサイバー攻撃を国家として積極的に行っている国もあるため、それらの国の 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 を活用してください。

公式ドキュメンテーション