今回は、WordPress(ワードプレス)の脆弱性対策(セキュリティ対策)について、思いつくものを全てまとめてみました。
お使いのWordPressのセキュリティを強化したい方は、ぜひ参考にしてください。
こちらの記事は、プログラミング・WEB制作歴15年以上、ブログ歴10年以上のプログラマーが書いています。
プライベートでも仕事でも多くのレンタルサーバーを利用してきた経験から、サーバーに関する豊富な知識をもとに書いています。
>> プロフィール
コンテンツ
- 1 WordPressの脆弱性について
- 2 WordPressインストール時に行う対応
- 3 WordPressインストール後、初期の段階で行っておくべき対応
- 3.1 【任意】wp-config.phpへのアクセスを制限する
- 3.2 【任意】xmlrpc.phpとwp-cron.phpへのアクセスを制限する
- 3.3 【任意】重要なファイル、ディレクトリのパーミッション(権限)を変更する
- 3.4 【任意】管理画面へのアクセス元を制限する(特定の場所でのみ作業許可)
- 3.5 【任意】管理画面の認証方法を複雑にする
- 3.6 【任意】WordPressのバージョン情報を見えないようにする
- 3.7 【任意】ログイン画面へのログイン履歴を残す
- 3.8 【任意】プラグインを使ってユーザー名を隠す
- 3.9 【任意】readme.html、license.txt、wp-config-sample.phpは削除
- 3.10 【任意(人によっては必須)】スパム対策のプラグインをインストール
- 3.11 【任意】wp-config.phpの保存場所を隠す
- 3.12 【任意】メディアの保存ディレクトリを変更する
- 3.13 【任意】高度なセキュリティ対策プラグインをインストール
- 4 WordPressの運用開始後に行うべき対応
- 5 その他の対応
- 6 最後に
WordPressの脆弱性について
WordPressには、脆弱性が多いとよく言われています。
これは、実際には、WordPressだけが特別脆弱性が多いわけではないです。
他のCMSや、CMS以外のシステムでも、世の中に存在するほとんどのプログラムに多くの脆弱性が存在しています。
WordPressは人気ツールであるために脆弱性が見つかりやすい
ただ、WordPressは人気のツールであるが故に世界中に利用者が多く、脆弱性が見つかる機会が多いです。
また、悪意のある人間からの攻撃の対象にもされやすいです。
その為に、WordPressだけが脆弱性が多いように認識されてしまっているだけです。
とは言え、もちろんWordPressにも脆弱性は存在しています。
多くの報告がなされているので、必ず対策を取っておく必要はあります。
しっかりと対策さえ取っておけば、本来はほぼ被害を受けることは無いと思います。
WordPressインストール時に行う対応
まずは、WordPressのインストール時に行う対応をまとめていきます。
【必須】管理画面の「パスワード」は複雑にする
管理画面へログインするためのパスワードは、必ず複雑な文字列にしてください。
私がおすすめするパスワードの設定ルールは以下になります。
- 数字を必ず含める
- 大文字アルファベットと小文字アルファベットを混在させる
- 記号を含める
- 最低12文字以上にする
因みに、WEB制作の仕事をしていると、
稀に、"パスワードが覚えにくいからもっと簡単なものに変更して!"と、お客さんから言われることがあります。
その場合は、危険性を説明して、お客さんにも理解してもらうようにしましょう。
【既存サイトで簡単なパスワードを設定してしまっている場合】
既に運用中のWEBサイトがあり、そちらで簡単なパスワードを設定してしまっている場合には、必ず変更してください。
WordPressには自動でパスワードを生成してくれる機能があるので、
そこで作り出されたパスワードをそのまま利用するのもおすすめです。
↓
【任意】管理画面の「ユーザー名」には「admin」以外を使用する
古いバージョンのWordPressだと、管理者のユーザー名が強制的に「admin」になっていました。
その名残りで、今でもユーザー名に「admin」を設定される方が結構多いです。
ユーザー名は、パスワードほど複雑にする必要はないですが、「admin」以外を使用するようにしましょう。
パスワードを複雑にしておけば、「admin」でも突破される可能性はかなり低くなります。
ですが、念には念を入れて、「admin」以外を使用されることをおすすめします。
【既存サイトでadminを設定してしまっている場合】
もし、「admin」を使い続けている場合には、データベースに直接アクセスして、書き換えてください。
データベースに関する知識が無くても、ユーザー名を書き換える程度であればそれほど難しくはないと思います。
※方法は、検索すると直ぐに出てきます。
phpMyAdminを利用できる場合には、そちらを使うと簡単に変更を行えます。
「xxx_user」テーブルがあるので、「user_login」の項目を修正するだけです。
【任意】データベースのテーブルプレフィクスをデフォルト値以外にする
WordPressでは、インストール時、データベース内に自動で複数のテーブルが作成されます。
そのテーブル名にはプレフィクスというモノが付けられます。
このプレフィクスは、設定ファイル「wp-config.php」で設定する事ができます。
この記述です↓
$table_prefix = 'wp_';
デフォルトの「wp_」のままにしておかず、変更するようにしましょう。
【任意】認証用ユニークキーの設定
WordPressの設定ファイル「wp-config.php」には、認証用ユニークキーを設定する箇所があります。
この認証用ユニークキーをデフォルトのままにされている方も多いです。
こちらもきっちりと設定するようにしてください。
設定方法は簡単です。
レンタルサーバーのインストール機能を利用される場合には、多くの場合、自動で設定されます。
その為、設定不要な場合が多いです。
もし、手動でWordPressのインストールを行う場合には、以下のように設定してください。
↓
■まず、ブラウザ上から以下のURLにアクセスしてください。
https://api.wordpress.org/secret-key/1.1/salt/
↓
■自動で以下のようなユニークな文字列を作成してくれるので、それらをすべてコピペしてください。
define('AUTH_KEY', ']rOf*6TY+?CrvIP6pV*`]3;A~Y[@;JvN3GWeI_^nd^f3)9-1hw)xU&*[3#]#H(x');
define('SECURE_AUTH_KEY', '?Ag;:w<[%w Rum-$8e+)S)_0<w.}_?rq<+rad5[fg!>%$@{iAo=E/::J[jJO,4)r');
define('LOGGED_IN_KEY', 'p$.u|S`43aH}/(na+p%l[GoNuoE-M1V2M-8F-|ykM@}-!KIw*&~C$G2PQ|lD[$I5');
define('NONCE_KEY', 'xVFKc-jC@&2R,9BVEj4?[AbU;dwJ })[ll/tY3-S+|]mA<esqd}?!;mc8m{mm7v`'); define('auth_salt',="" ')o1=".Wr,Krl]3C.e,RD&f[FtFFP,bqSEM1]OZUr%TJAxf)+=UCukCs8H:ga/RQ4l');" define('secure_auth_salt',="" '2f7wk|jj]@qey+aw|abph9#|h]rw}cg#x="">,`1-maSpc}ATMpw-h7jt;E2txS-wkK');
define('LOGGED_IN_SALT', '`r. txj7@xxSA=1O]fy2[ZR-$:fz>WYtaaMgiixp8(t!?fO4L6%rq1ss}eBk/Ujr');
define('NONCE_SALT', 'J}EV>-7s]6UnBQ:gOM}qT gv;z|2HvDS PT|xI:|,rMAk,5( QM0+_%uV#aCQ=|L');</esqd}?!;mc8m{mm7v`');></w.}_?rq<+rad5[fg!>
↓
■wp-config.phpに以下の記述があるので、それらを全て削除して、上記コードに貼り替えてください。
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
これでOKです。
WordPressインストール後、初期の段階で行っておくべき対応
次は、WordPressをインストール後に行う対応をまとめていきます。
【任意】wp-config.phpへのアクセスを制限する
WordPressには、wp-config.phpという設定ファイルがあります。
こちらにはデータベースの情報など重要な情報が記述されています。
その為、外部からアクセスできないように制限を掛けておきましょう。
設定方法は以下を参照してください。
[ WordPressのアクセス制限を掛けておくべきファイル ]
【任意】xmlrpc.phpとwp-cron.phpへのアクセスを制限する
「xmlrpc.php」はピンバック機能などで、
「wp-cron.php」は予約投稿やアップデート通知などで利用されるプログラムファイルです。
これらのプログラムは不正アクセスに利用されてしまうことがあるので、
もし不要であればアクセスできないように制限を掛けておきましょう。
詳細は以下を参照してください。
[ WordPressのアクセス制限を掛けておくべきファイル ]
【任意】重要なファイル、ディレクトリのパーミッション(権限)を変更する
重要なファイルやディレクトリの場合には、そのパーミッションも適切に設定することをおすすめします。
wp-config.php
wp-config.phpのおすすめのパーミッションは「400」か「404」です。
「400」に設定しておくのが最も安全で、ファイルの所有者のみがwp-config.phpの読み込みを行えるようになります。
.htaccess
「.htaccess」のおすすめのパーミッションは「404」です。
ただ、もし「404」で動作しない場合には、「604」を設定してみてください。
また、パーマリンクの設定時には、システム上からの「.htaccess」への書き込み権限が必要になります。
その場合には、一時的に「606」に変更してください。
ディレクトリ
各ディレクトリのおすすめのパーミッションは「705」です。
ただし、「uploads」ディレクトリへは書き込み権限を設定しないといけない場合もでてきます。
その場合には、「707」にしてください。
※「777」にはしないようにしてください。
【任意】管理画面へのアクセス元を制限する(特定の場所でのみ作業許可)
WordPress管理画面へアクセスできる場所を、IPアドレスで固定すこともおすすめです。
それにより、特定の場所(例えば、社内、事務所内)でしか記事の編集や設定変更などを行えなくすることができます。
注意点としては、作業を出来る場所が限られてしまうというところです。
例えば、自宅からは記事の更新が行えないといった不便さは発生します。
設定方法は以下を参照してください。
[ WordPressのアクセス制限を掛けておくべきファイル ]
こちらの設定は、IPアドレスが固定されている場合のみ行えます。固定IPアドレスを取得されていない場合には、IPアドレスが変わってしまうこともあるので注意してください。
【任意】管理画面の認証方法を複雑にする
管理画面からログインする際の認証機能を強化することも重要です。
強力なのは「二段階認証」ですが、「画像認証」でもOKだと思います。
認証機能の強化はプラグインを使って行います。
「二段階認証」のおすすめプラグイン => 「Google Authenticator」 か 「Duo Two-Factor Authentication」
「画像認証」のおすすめプラグイン => 「Advanced noCaptcha & invisible Captcha」
※プラグインは他にもあるので、上記プラグインが正常に動作しない場合には、検索して探してみてください。
【任意】WordPressのバージョン情報を見えないようにする
デフォルトのままだと、ユーザー公開側ページのヘッダー部分に、
以下のようなバージョン情報を記載したメタタグが追加されます。
<meta name="generator" content=”WordPress 4.9.x">
ブラウザ上からソースコードを見られると使用しているWordPressのバージョンがばれてしまうので、
隠してしまいましょう。
方法は、functions.phpに以下のコードを追加するだけです
【任意】ログイン画面へのログイン履歴を残す
WordPress管理画面へのログイン履歴を残しておくことも重要です。
管理画面へは、通常は運営者や制作者以外はアクセスしません。
にもかかわらず、それ以外のIPアドレスからのログイン履歴が残っている場合、不正アクセスを疑う必要もあります。
明らかに不正なアクセスがあれば「ブルートフォース(総当たり攻撃)」の可能性もあるので、そのIPアドレスからのアクセスに制限を掛けてしまうことも可能です。
管理画面のログイン履歴を残す場合には、「User Login History」というプラグインが便利です。
【任意】プラグインを使ってユーザー名を隠す
WordPressを使っていると、ユーザー名(ログインID)を簡単に取得することが出来ます。
以下のURLにアクセスしてみてください。
https://example.com/blog/?author=1
以下のURLに自動でリダイレクトされてしまいます。
↓
https://example.com/blog/author/ユーザー名/
これは仕様なのでしかないのですが、「Edit Author Slug」というプラグインを使って、このユーザー名を隠すことが出来ます。
詳細な設定方法は、以下を参照してください。
設定は簡単なので、ぜひ試してみてください!
【任意】readme.html、license.txt、wp-config-sample.phpは削除
WordPressをインストールしたディレクトリ直下には、readme.htmlというファイルが保存されています。
このファイルには、WordPressのバージョン情報などが記載されているので、削除してしまいましょう。
また、license.txtやwp-config-sample.phpも不要なので、削除してしまってください。
面倒ですが、更新の都度、これらのファイルの削除も行ってください。
【任意(人によっては必須)】スパム対策のプラグインをインストール
コメント機能を有効にされている方は、スパム対策のプラグインは必須です。
毎日、大量のスパムがコメントが送られてくると、うっとうしいですからね!
スパム対策プラグインとしては、「Akismet Anti-Spam」が一番有名です。
ただ、「Akismet Anti-Spam」は設定が面倒なのと、ライセンスの関連がよく分からないプラグインです。
私は、「Antispam Bee 」や「Throws SPAM Away」あたがりが使いやすいので、おすすめしています。
【任意】wp-config.phpの保存場所を隠す
wp-config.phpは、データベース(MySQL)への接続情報などが記載されている最も重要なファイルになります。
デフォルトではインストールディレクトリの直下に入っていますが、一つ上の階層に移動させることが可能です。
特別な設定は不要で、wp-config.phpを一つ上の階層に移すだけで認識してくれます。
※元の場所に置かれているwp-config.phpは、忘れずに削除してください。
こちらの設定が有効なのは、WordPressをドキュメントルートにインストールしている場合です。
例えば、
https://example.com/blog/
のように、サブディレクトリにインストールしている場合には、
ブラウザ上から
https://example.com/wp-config.php
というURLにアクセス出来てしまうので、意味が無くなります。
また、階層を移動させることで、動作しなくなるプラグインや予期しなエラーが発生する場合もあるので、注意してください。
【任意】メディアの保存ディレクトリを変更する
WordPressのメディア(画像など)の保存先ディレクトリは、
wp-content/uploads/
の直下と決まっています。
その為、メディアのURLは、
https://example.com/wp-content/uploads/~
となります。
URLに「wp-content」が入ってしまっているので、
これだとWordPressを使ってWEBサイトを運営していることが直ぐにばれてしまいます。
その対策として、メディアのアップロード先を変更することが可能です。
メディアのURL以外からでもWordPressを使っているかどうかを見抜く方法はあるので、これは気休め程度の対策です。
なので、時間に余裕のある方は、対応してみましょう!
変更する方法は2パターンありますが、どちらも簡単です。
【パターン①】
wp-config.phpを開いて、ファイルの一番下辺りに、以下を追記してください。
こうすることで、
メディアのアップロード先が「ドキュメントルート/photo/」に変更され、
URLもhttps://example.com/photo/~になります。
【パターン②】
ブラウザ上から、
https://example.com/wp-admin/options.php
というURLにアクセスしてください。
※ドメイン部分は、各自の環境に変更してください。
「すべての設定」という画面が表示されるので、upload_pathとupload_url_pathの2項目を見つけて、以下のように変更してください。
upload_url_path => https://example.com/photo
これで、設定変更が完了です。
あとは、変更した場所にアップロードした画像が保存されるかを確認して、
問題がなければOKです。
【任意】高度なセキュリティ対策プラグインをインストール
WordPressには、高度なセキュリティ強化に特化したプラグインが多数存在します。
それらのプラグインに共通していることは、高度であるが故に、多機能で複雑です。
その為、使いこなすが少し大変です。
ですが、脆弱性対策の為の強力なツールにはあるので、インストールして対策を行うのもおすすめです。
おすすめのプラグインは、「SiteGuard WP Plugin」「All In One WP Security & Firewall」あたりです。
有名なプラグインばかりなので、使い方は検索すると直ぐに出てきます。
また、セキュリティ強化プラグインは他にもたくさんあるので、興味のある方は調べてみてください。
因みに、以前、セキュリティ強化のプラグインをインストールすると、なぜかログインできなくなるといった不具合を起こしました。
使用する場合、WEB制作者の方は、お客さんから「管理画面にログインできないんですけど・・・」みたいな問い合わせが入らないように、十分注意してください。
セキュリティプラグインとしては、国産の「CloudSecure WP Security」もあります。
日本語なので使いやすく、日本人にはおすすめです。
WordPressの運用開始後に行うべき対応
【必須】WordPress本体やプラグインを常に最新にしておく
脆弱性が見つかった場合に被害に合うのは、多くの場合、古いバージョンのWordPressを使用されている場合です。
WordPress本体のバージョンアップとなるといろいろと、それに伴う不具合が発生す場合もあります。
ですが、それでも常に最新バージョンにしておくことをおすすめしています。
※自動更新機能も有効にしておくのもおすすめ
【必須】管理画面の「パスワード」を定期的に変更
管理画面へのログインパスワードを複雑な文字列に設定しておけば、簡単に管理画面を突破されることは無いです。
ですが、
・パスワードを記載したメールが外に漏れた
・パスワードを記載した紙が外に漏れた
など、人為的なミスなどで漏れてしまう場合もあります。
その為、管理画面のパスワードは定期的に変更することをおすすめします。
それと、そもそもの話しになりますが、
・パスワードをメールに直接記載して送信
・パスワードを記載した情報を印刷して手元に置いておく
などの運用も止めましょう。
【必須】不要になったプラグインを削除
運用開始後、仕様変更などで不要になったプラグインが出てくることも多々あります。
使っていなくてもサーバ上に残していれば、それを悪用して攻撃されることもあります。
使わなくなったプラグインは、管理画面上に無効化にして残しておくのではなく、管理画面上から完全に削除してしまいましょう。
【必須】使っていないテーマを削除
運用開始後、途中で使用するテーマを変更することもあります。
また、WordPress本体のインストールと同時にデフォルトで入っているテーマもあります。
プラグインと同様に、不要なテーマがサーバー上に残っていると、その脆弱性を利用して攻撃されることもあります。
不要になテーマも、出来る限り削除しておきましょう。
【必須】不正アクセスを見つけたらブロックする
不正なIPアドレスからのアクセスが見つかった場合には、必ずブロックしておきましょう。
不正アクセスのブロック方法としては、プラグイン「WP-Ban」を利用する方法と.htaccessを利用する方法があります。
プラグイン「WP-Ban」を利用する場合には、以下のページを参考にしてください。
[ WP-Banを使って不正ログイン対策 ]
.htaccessを利用して設定する場合には、以下の記述を追記するだけです。
allow from all
deny from xxx.xxx.xx.xxx
deny from xxx.xxx.xx.xxx
※「xxx.xxx.xx.xxx」の部分に不正なIPアドレスを記載してください。
その他の対応
【必須】データベース(MySQL)の「パスワード」を複雑にする
WordPressの管理画面だけではなく、データベースとして使用するMySQLのパスワードにも注意してください。
簡単なパスワードだと突破されてしまう可能性もあるので、必ず記号を含めた複雑文字列を設定してください。
【必須】HTTPSで通信を行う(常時SSL化の設定)
今の時代、WEBサイト全体をHTTPSで常時接続(HTTPS接続の強制化)するが当たり前になってきています。
SEO対策の為にSSLのインストールを行っている方も多いです。
ですが、HTTPS通信の本来の目的は、SEO対策ではなくセキュリティ対策(情報の暗号化)です。
SSLを導入されていない方は、直ぐにインストールして、常時SSL化の設定を行ってください。
因みに、SSL証明書には3種類ありますが、個人利用の場合には「ドメイン認証SSL(DV)」になります。
※無料SSLは、このドメイン認証SSL(DV)になります。
ですが、法人利用の場合には、よりセキュリティレベルの高い「企業認証SSL(OV)」や「EV認証SSL(EV)」もおすすめです。
有料のSSL証明書の購入は、エックスサーバーSSL(XServer SSL)がおすすめです。
>> エックスサーバーSSLについて
また、SSL証明書の違いについて詳しく知りたい方は、こちらの記事をチェックしてください。
常時SSL化の方法
SSLはインストールしているが、常時SSL化を設定されていない方もいます。
それだと、単純のHTTPS通信できるようになっているだけなので、管理画面も含めて、必ず常時接続の設定を行ってください。
常時接続の設定は、プラグインを利用する方法と.htaccessを利用する方法があります。
プラグインを利用される場合には、「Really Simple SSL」か「WP Force SSL」がおすすめです。
.htaccessを使って設定される場合には、以下のような記述を追記するだけです。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
【任意】WAF(Web Application Firewall)を有効にする
最近は、多くのレンタルサーバでWAF(Web Application Firewall)を利用できるようになっています。
日本語にすると、「WEBアプリケーションファイアウォール」になります。
名前の通りですが、WEBアプリケーションに特化したファイアウォールみたいなセキュリティソフトです。
かなり強力なセキュリティ対策になるので、WAFを利用できる場合には、出来れば有効化しておくことをおすすめします。
ただし、本来は正常なはずの操作までブロックしてしまうこともあります。
.htaccessである程度回避することも可能ですが、それでも、ブロックされてしまうこともあります。
特に、"WordPressの記事投稿時に保存できない・・・"といった報告が多いです。
その為、導入時は慎重に行ってください。
【任意】ログイン画面にアクセス元のIPアドレスを表示させる
ログイン画面にIPアドレスを表示させることで、
管理画面にアクセスしてきた相手に「あなたのIPアドレスを取得してますよ!」という脅しになります。
方法は簡単です。
funtions.phpに以下のコードを追加するだけです。
気休め程度ですが、余裕のある方は設定してみてください。
}
add_filter("login_message", "login_ip_display");
このような表示になります。
最後に
今回は、WordPressのセキュリティ対策について、思いつくものを全てまとめてみました。
ですが、正直、WordPressのセキュリティ対策は、調べれば、他にもたくさん出てきます。
その為、全ての対策を行うのは、かなりハードルが高くなります。
まずは、優先度の高いものから設定を行いましょう。
優先順位の低い設定に関しては、余裕がある時でもOKです。
また、脆弱性診断サービスを利用するのもおすすめです。
特に、法人運営の場合には、その為の予算を組んでおくことも大切です。