WordPressのセキュリティを強化するため具体的な対策をいくつか紹介したいと思います。自分でできることはやっておいて損はないと思います。
はじめに
全世界のサイトの27%はWordPressを利用したサイトとも言われているようなので、攻撃対象になりやすい傾向があるのはしかたがないことだと思います。
最低限自分でできるセキュリティ対策をすることで、多少防げる場合もありますから、何もやらないよりはやったほうがよいと思います。
とはいえやることがあり過ぎると敷居が高くなり、めんどくさくなりやらないことになると思うので、とりあえずやれそうないくつかを書きたいと思います。
ただエックスサーバーを使用していれば会社側でかなりセキュリティ対策をしてくれておりますので、そのままでも案外平気かもしれません。
『WordPress』におけるセキュリティの強化対応について(エックスサーバー)
WordPressセキュリティ設定(エックスサーバー)
国外IPアクセス制限設定
ログイン試行回数制限設定
コメント・トラックバック制限設定
をしてくれています。
WordPressのバージョンは常に最新にする
WordPressのバージョンは常に最新にしておきましょう。
WordPressで不具合や脆弱性などがあった場合、次のバージョンで修正が加えられたりしています。
なので今よりもさらに最新に、常に一番新しいバージョンにすることはとても重要です。
とはいえ、バージョンが変わったことで、動かなくなるプラグインやおかしくなるテーマが出てくる可能性も否定できません。
運用を任されているWeb管理者の方々が、なかなかアップデートに踏み切れない気持ちもよくわかります。
自分自身もサーバーを引っ越しさせるついでに最新のWordPressとプラグインとphp7でいこうとしたらトップが表示されなかった経験があります。
しかしながらウイルスが入るとその処理のほうも結構な手間だったりします。
ウイルス除去のあーだこーだの処理と最新のWordPressとテーマとプラグインの確認と修正の手間と、どちらがよいかといえば後者ではないでしょうか。
WordPressのバージョンをあげる際は必ずテストサーバーで確認したほうがよいと思いますが、その手間を入れても、WordPressを最新にする意味は大きいと思います。
ただし現在最新のバージョンである5.1は仕様に関して大きな変更がありましたので、今回に関してはアップデートは早まらないほうがよいかもしれません。
使っていないテーマとプラグインを削除する
WordPressをインストールするとデフォルトで「twentyfifteen」と「twentyseventeen」と「twentysixteen」が入っていると思います。(4.9.4の場合)
まったく使わない場合も多いと思うので、削除してしまいましょう。
プラグインもいちお入れたけど、使っていないというものがあった場合は、停止にするだけではなく削除しておきましょう。
こういったものが攻撃の入り口になる場合が多々ありますので、必要なものだけにしておきましょう。
「wp-config.php」のパーミッションを「400」にする
「wp-config.php」というファイルは、データベースのアカウント情報も記載されていますので、最もセキュリティレベルを高く設定しなければいけないファイルです。
こちらが丸見えですと、簡単にデータベースを改ざんできてしまいます。
パーミッションは「400」の管理者のみ「読み取り」権限にします。
WinSCPの場合ですと、「wp-config.php」で右クリックし、「プロパティ」を開けば、パーミッションの画面が出てきます。
こちらを400にします。
うまく動作しない場合は404にします。それでもうまくいかない場合は「600」にしてみましょう。
レンタルサーバーによって推奨されるパーミッションが違うようです。
エックスサーバーは、「600」を推奨されているようですが、「400」でも問題なく使えています。
とりあえずエックスサーバーのインストーラーを使うとデフォルトで「600」になるようです。推奨なのでそのままでもよいかもしれませんが、できたら「400」がよいと思います。
ロリポップの場合も「400」で大丈夫でした。
ちなみにエックスサーバーでは「通常は644等のパーミッションでも問題になることはございません」と書いてあります。エックスサーバーすごいですね。
まあでも「600」か「400」にしておきましょう!
ただし「wp-config.php」に何か書き込みをしたい場合は、いったん「400」のパーミッションを書き込みが可能なパーミッションへ変更してからにする必要があります。
「600」とかでよいかと思います。
.htaccessにセキュリティの命令を記載する
「.htaccess」が存在していない場合は、管理画面の[設定]から[パーマリンク設定]を押して、どの設定でもよいので保存すると「.htaccess」が出現すると思います。
こちらに命令を追加することでセキュリティが高められますので、いろいろ入れていきましょう。
htaccess – WordPress Codex 日本語版
あとパーミッションは「604」か「644」にします。エックスサーバーの推奨は「644」のようです。
ロリポップは「604」のようです。
パーミッション(エックスサーバー)
パーミッションについて(ロリポップ)
「604」ですとパーマリンクの設定が出来ないようなので、その場合は「644」か「606」にして変更し、終わったら「604」にする、または「606」なら変更ができますので「606」にしておくのがよいかと思います。
.htaccessファイルに書くもののまとめ
さきに.htaccessに書いておくものを列挙しておきます。こちらをコピペすればよいと思います。
何か不具合などが出てきたら、一つずつ確認をしていけばよいと思います。
ちなみに.htaccessをいじると必ずといってよいほど500エラーを出す人がいると思います。自分も例外ではなく、けっこうやらかします。
だいたいその原因は保存形式のことが多かったりします。
万が一500エラーでまったくページが表示できなくなったという場合は、下記の記事も参考にしつつ、まずは落ち着いて保存形式を確認してみてください。
# wp-config.phpと.htaccessとerror_log、php.iniと.htpasswdをアクセス拒否 <FilesMatch "^.*(error_log|wp-config\.php|php.ini|\.[hH][tT][aApP].*)$"> Order deny,allow Deny from all </FilesMatch> # wp-mail.phpとinstall.phpとxmlrpc.phpをアクセス拒否 <FilesMatch "^(wp-mail\.php|install\.php|xmlrpc\.php)"> Order allow,deny Deny from all </FilesMatch> # 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/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # ディレクトリ一覧の非表示 Options -Indexes # フォームから不正なscriptタグを入力しても実行処理しない Options +FollowSymLinks RewriteEngine On # <script> タグ RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] # PHP グローバルに関連するもの RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR] # _REQUEST を変更しようとするもの RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) #マッチしたURLへのアクセスを禁止("403 Forbidden"のレスポンスを返す) RewriteRule ^(.*)$ index.php [F,L] # BEGIN WordPress
.htaccessファイル自体をアクセス拒否に設定する
まずは、.htaccessに不正アクセスされては困るので、.htaccessファイル自体をアクセスできないようにします。
その際に重要なことは、
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /shiritai/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /shiritai/index.php [L] </IfModule> # END WordPress
のように書いてある部分の中には絶対入れないということです。
「# BEGIN WordPress」と「# END WordPress」の中は場合によっては書き換わることがあるので、中に入れてしまうと上書きされて消えてしまうこともあると思います。
# BEGIN WordPress ・ ・ ・ # END WordPress
部分以外に入れましょう。
いったんわかりやすいように新しい命令を「# BEGIN WordPress」の上に入れます。
# .htaccessファイルをアクセス拒否 <Files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </Files> # BEGIN WordPress ・ ・ ・ # END WordPress
もしも上の方に何か他の命令が記載されている場合があるかもしれません。その場合絶対に消さないようにしてください。
その下に追加しましょう!
「wp-config.php」をアクセス拒否に設定する
つぎに「wp-config.php」にもアクセスできないように設定します。
「.htaccess」ファイルに、下記を追加します。
# wp-configをアクセス拒否 <files wp-config.php> order allow,deny deny from all </files>
wp-configとhtaccessを一緒に、さらに「error_log」、「php.ini」と「.htpasswd」ファイルとまとめてアクセス拒否する命令は下記です。
# wp-config.phpと.htaccessとerror_log、php.iniと.htpasswdをアクセス拒否 <FilesMatch "^.*(error_log|wp-config\.php|php.ini|\.[hH][tT][aApP].*)$"> Order deny,allow Deny from all </FilesMatch>
「wp-mail.php」「install.php」「xmlrpc.php」もアクセス拒否したい場合は下記です。
ごちゃごちゃしてきますので、別にします。何かあった場合に削除しやすいように。
# wp-mail.phpとinstall.phpとxmlrpc.phpをアクセス拒否 <FilesMatch "^(wp-mail\.php|install\.php|xmlrpc\.php)"> Order allow,deny Deny from all </FilesMatch>
「xmlrpc.php」はPingbackに使用しているのでもし拒否にしたくない場合は、外しておきます。
# wp-mail.phpとinstall.phpをアクセス拒否 <FilesMatch "^(wp-mail\.php|install\.php)"> Order allow,deny Deny from all </FilesMatch>
wp-includesをアクセス拒否に設定する
「wp-includes」ディレクトリはWordPressのロジック部分なので、通常ユーザーがアクセスするような用事はないものです。
なのでこちらもアクセス拒否になるようにします。
# 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/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
※ちなみに「SiteGuard WP Plugin」プラグインを入れた状態でログインしようとすると、500エラーになると思いますので、もしこのプラグインをいれているなら上記の設定はコピペせず削除してください。
WordPress内にあるディレクトリ一覧の非表示
WordPress内にあるディレクトリ一覧がブラウザなどで閲覧できてしまうと困るので一覧を表示させないようにします。
# ディレクトリ一覧の非表示 Options -Indexes
ちなみにさくらインターネットでは上記の使用が禁止されている?らしいのでその場合には
# ディレクトリ一覧の非表示 DirectoryIndex index.html index.cgi index.php .ht
とします。
スクリプトインジェクション対策
フォームから不正なscriptタグを入力しても実行処理しないようにします。
# フォームから不正なscriptタグを入力しても実行処理しない Options +FollowSymLinks RewriteEngine On # <script> タグ RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] # PHP グローバルに関連するもの RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR] # _REQUEST を変更しようとするもの RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) #マッチしたURLへのアクセスを禁止("403 Forbidden"のレスポンスを返す) RewriteRule ^(.*)$ index.php [F,L]
uploads配下、画像ディレクトリでのphp実行制限
/wp-content/uploads/はWordPressの画像をアップロードする為に書き込み権限があり、その中でPHP実行をされないよう、/wp-content/uploads/.htaccessを作成し、下記命令を書きます。
「wp-content/uploads」ディレクトリに「.htaccess」を設置します。
今までとは違い、wp-content/uploads/.htaccessというように、「wp-content/uploads/」配下に「.htaccess」を別で作ります。
# 画像ディレクトリでPHPの実行を防ぐ <Files *.php> deny from all </Files>
上記を.htaccess.txtという形で保存して、wp-content/uploads/配下にアップしてから.htaccessに変更すればOKです。
.htaccessはサーバーに一つしか置いてはいけないものではありません。フォルダ内に1つという感じです。
なので、/uploads/に新たに置いても問題ございません。
あまり無いとは思いますが、万が一「wp-content/uploads」内にプラグインを置くような場合があり、ここでphpが実行されるような場合はこちらの対策はしないということで。
IDとパスワードを複雑なものに
新規でWordPressを入れるとデータベースの設定などをすると思います。
そのあとにサイト名やユーザー名を入力すると思いますが、こちらのユーザー名をadminなど単純なものにせず少し複雑なものにしましょう。パスワードもデフォルトで表示されているものはわりと複雑に設定されているのでそれを基本使いましょう。
念のためさらに2,3文字追加してもよいと思います。
もしくは「パスワード生成」と検索すると
http://www.luft.co.jp/cgi/randam.php
http://www.graviness.com/temp/pw_creator/
などのサイトが出てくると思います。
こちらを利用し、自分でも文字を追加などしてなるべく複雑になるように設定しましょう。
すでにWordPressのインストールが終わっていて、adminにしてしまっているという方もいると思います。
その場合は、管理画面のユーザーから新たにユーザーを作成し、単純なユーザー名、testやadminなどにしていた場合はユーザーを削除して、新たなユーザーを設定しましょう。
必ず新規のユーザーを作った場合は、testやadmin等使用しなくなったユーザーを削除することをお忘れなく!
たまにデータベースと画像をバックアップ
ウイルスが仕込まれた場合は、基本はすべて削除対応になってくると思いますので、データベースや画像を別でバックアップしておくことも必要です。
あとなんのプラグインを入れているか、覚えておくとか。
その他やれそうなら
下記のようなこともできたらよいかと思います。
おわりに
少し長くなってしまいましたが、レンタルサーバーによってすでに対策が施されていてかぶっているものもあると思います。気になる方はお使いのレンタルサーバーに確認してください。
なにか不具合が起きた場合、不具合というのは、ようはページが見れない、500エラー表示、メディアがくるくるして表示されない、アップできない、へんなエラー文字がページに表示される等、おかしなことが起きることをいいます。何か変だなと思った場合は、.htaccessとwp-config.phpのパーミッションを見直す、.htaccessに書いたものを消して確認してください。その際に.htaccess自体を消すのは絶対にだめです。# BEGIN WordPressから# END WordPressまで消すと、さらなるエラーになり、何がエラーになっているのかわけがわからなくなると思います。
またセキュリティ系のプラグインと干渉して何か起こることもあるかもしれません。なので何か気になることが発生した場合は、プラグインも疑ってください。
WordPressをインストールして使っている方なら、これくらいのことはあーだこーだ考えながらやったほうが勉強にもなりますし、頑張ることをお勧めします。
WordPressは簡単でおすすめなどと書いてある記事もありますが、テーマのカスタマイズを含め、そんなに簡単ではないと思います。
とはいえWordPressを導入できているならば、それなりにできている人だと思いますので、これらの対策も追加していただけたらと思います。
ただこれらのことをしても安全とはまったくいえないと思います。ただやらないよりはやったほうがまだよいという感じです。
それだけは何卒ご了承ください。
コメントをどうぞ
初歩的な質問失礼します。
以下のコードを記載する際、#からの文字の記載は不必要という認識でよろしいのでしょうか?
# フォームから不正なscriptタグを入力しても実行処理しない
# タグ
# PHP グローバルに関連するもの
#マッチしたURLへのアクセスを禁止(“403 Forbidden”のレスポンスを返す)
#の言葉の部分はコードの説明という事ですよね?
プログラミングWordpress 初心者の為、こんな質問をして申し訳ございません。
# フォームから不正なscriptタグを入力しても実行処理しない
Options +FollowSymLinks
RewriteEngine On
# タグ
RewriteCond %{QUERY_STRING} (|%3E) [NC,OR]
# PHP グローバルに関連するもの
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
# _REQUEST を変更しようとするもの
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
#マッチしたURLへのアクセスを禁止(“403 Forbidden”のレスポンスを返す)
RewriteRule ^(.*)$ index.php [F,L]
マサさん、初めまして
知りたいねっと管理人です。
ご質問の件ですが、
「#」は、なくても問題ないというか、PHPの実行には関係ない、無いものとした表示です。
コメントアウトと考えてください。処理の役割や説明をしたい場合に使用します。
これ以外に「行頭に「//」」、「コメント範囲を「/* */」で囲む」というものもあります。
WordPressやPHPのソースをみていたら、こういったものに遭遇することもあるかと思います。
知りたいねっと管理人様
ご返信ありがとうございます。
度々ご質問失礼致します。
#コメントアウトは.htaccessに記載しても構わないという事でしょうか?
マサさん、こんばんは
知りたいねっと管理人です。
ご質問の件ですが、コメントアウトということで、命令に影響がないため
大丈夫です。
WordPressをいじっていたら、.htaccessに
# BEGIN WordPress
# END WordPress
なものが入っていませんか?
普通に利用されていますので、
#説明文など
.htacessに「#」を入れても問題ありませんよ。