【WordPress】【セキュリティ対策】公開不要なページ・ファイルを制御しよう
こんにちは、webエンジニアのゾノ( @ozonosho )です。
前回の記事に続いて、今回もWordPressデフォルト設定のままだとセキュリティ上宜しくないポイントについて書きます。
今回は公開不要なページ・ファイルの制御についてです。
WordPressインストール時に設置されるファイルの中には、公開不要なページを生成するものやアクセスするとサーバーエラーやデータベースエラーを表示してしまうものがあります。
たとえば、WordPressインストールディレクトリ直下に設置される、
・readme.html
・license.txt
・wp-config-sample.php
などです。
ダメな例として、僕の運営するサイト『ココトモ』に繋いでみましょうw
https://kokotomo.com/readme.html
https://kokotomo.com/license.txt
https://kokotomo.com/wp-config-sample.php
最後の1つなんてデータベース接続エラーまで出していて、そんなページに自由にアクセスできるだけでもだいぶ危ういです。また、このサイトがWordPressで作られていることもすぐに特定できてしまいます。
そのため、これらのファイルは削除するほうがベターです。
上記についてはファイルを削除するだけで解決しますが、ファイル削除では解決できない下記のような問題もあります。
- 問題①
-
https://ドメイン/wp-json/wp/v2/
に繋ぐことでバージョン情報や著者情報が見えてしまう。
- 問題②
-
https://ドメイン/feed
に繋ぐことでもバージョン情報や著者情報が見えてしまう。
- 問題③
-
重要ファイルである、
https://ドメイン/wp-config.php
https://ドメイン/wp-mail.php
https://ドメイン/wp-includes/vars.php
などにアクセスできたり、サーバーエラーが表示されたりしてしまう。
問題①の対策
下記記事でご紹介した、WP REST APIのアクセス回避対応をすることで解決します。
問題②の対策
下記記事でご紹介した、RSSフィード配信機能の無効化対応をすることで解決します。
問題③の対策
外部から重要ファイルにアクセス自体できなくするため「.htaccess」に下記のようなコードを加えます。
(例) # wp-config.phpと.htaccessとerror_log、php.iniと.htpasswdをアクセス拒否 <FilesMatch "^.*(error_log|wp-config\.php|php.ini|\.[hH][tT][aApP].*)$"> Require all denied </FilesMatch> # wp-mail.phpとinstall.phpとxmlrpc.phpをアクセス拒否 <FilesMatch "^(wp-mail\.php|install\.php|xmlrpc\.php)"> Require all denied </FilesMatch>
さらに、wp-includesやwp-contentへのアクセスを制限するために下記のようなコードも加えると万全です。
# wp-includesをアクセス拒否 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/[^/]+\.php/$ - [F,L] RewriteRule ^wp-includes/[^/]+\.php/.*$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # wp-content内のファイルアクセスを一部拒否 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # プラグインで通したいファイルがある場合はここで除外条件 #RewriteCond %{REQUEST_URI} !^/wp-content/plugins/file/to/exclude\.php #RewriteCond %{REQUEST_URI} !^/wp-content/plugins/directory/to/exclude/ RewriteRule wp-content/plugins/(.*\.php)$ - [R=404,L] RewriteRule wp-content/plugins/(.*)/$ - [R=404,L] # その他wp-content内で通したいファイルがある場合はここで除外条件 #RewriteCond %{REQUEST_URI} !^/wp-content/themes/file/to/exclude\.php #RewriteCond %{REQUEST_URI} !^/wp-content/themes/directory/to/exclude/ RewriteRule wp-content/themes/(.*)/$ - [R=404,L] RewriteRule wp-content/uploads/(.*\.php)$ - [R=404,L] </IfModule>
この対策をおこなうと外部から該当ファイルにアクセスした際に適切なエラーページを表示するようになるので安全です。
おわりに
以上、今回の記事ではWordPressの公開不要なページ・ファイルの制御について紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。