WordPressは現在、世界中の多くのサイトで利用されています。
WordPressは、2017年の2月時点で世界中のCMS(サイトシステム的なもの)の中では、58.6%。サイト全体の中でも、27.5%。実に世界中のサイトのうち4つに1つがWordpressで構築されているといわれています。
出典 Usage Statistics and Market Share of Content Management Systems for Websites, February 2017
これだけ利用ユーザーがいると、やはりシステムに対する攻撃の対象となりやすいです。ユーザーの多いWindowsの方がMacよりマルウェアが多いのと同じ原理です。攻撃者も、誰も使用していないCMSを攻撃対象とするよりも、多くの人に利用されているCMSの中から、セキュリティーの甘い人を探した方が楽ということだと思います。
先日も、WordpressでREST APIの脆弱性を突いたサイト改ざんが行われたのは記憶に新しいです。
とりあえず通常の場合、Wordpressデフォルトでも、もちろん攻撃から守る作りにはなっています。けれど、出来る限りセキュリティーは高めておくに越したことはありません。
ということで以下では、「Wordpressのセキュリティーをデフォルトよりは高める方法」について紹介したいと思います。
目次
Wordfence Securityプラグインをインストール
Wordfence Securityは、以下のような機能を含んだ統合Wordpress Securityプラグインです。
- ファイアウォール
- ウイルススキャン
- IPブロック
- ライブトラフィック
- ログインの安全性の確保
とりあえず、利用したい機能はインストールするだけでサイトに適用されます。
Wordfence Securityをインストールした時点で、ファイヤウォールが動作して、攻撃者と思われるIPを、以下のようにブロックしてくれます。
これは、当サイト1週間分の「ブロックしたIPのトップ10」リストです。Wordfence Securityをインストールするだけで、これだけの攻撃対象者からサイトを守ってくれています。
国別のトップ10であればこんな感じ。
また、攻撃者は管理者権限を得るためWordpressへのログインも試みます。ほとんどは、パスワードが合わず失敗となりますが、そういった「ログイン失敗リスト」もレポートしてくれます。
上の画像は、「test」と「admin」というユーザー名で、何度もログインを試みられた履歴です。
Wordfence Securityをインストールすると、攻撃を防いでくれるのはもちろんながら、こういったセキュリティーレポートが定期的にメールアドレスに届くので、サイトの攻撃状況をある程度把握することもできます。
また、Wordpressにログインがあると、メールに以下のようなログイン通知も来るので、IPやホスト名から「自分以外の誰かがWordpressにログインしたか?」を把握できるようになります。
SiteGuard WP Pluginの設定
SiteGuard WP Pluginは、以下の対策に特化したプラグインです。
- 不正ログイン
- 管理ページ(/wp-admin/)への不正アクセス
- コメントスパム
SiteGuard WP Plugin設定では、以下のようなことを行えます。
- 管理ページアクセス制限 :ログインしていない接続元から管理ディレクトリ(/wp-admin/)を守ります。
- ログインページ変更 :ログインページ名を変更します。
- 画像認証 :ログインページ、コメント投稿に画像認証を追加します。
- ログイン詳細エラーメッセージの無効化 :ログインエラー時の詳細なエラーメッセージに変えて、単一のメッセージを返します。
- ログインロック :ログイン失敗を繰り返す接続元を一定期間ロックします。
- ログインアラート :ログインがあったことを、メールで通知します。
- フェールワンス :正しい入力を行っても、ログインを一回失敗します。
- XMLRPC防御 :XMLRPCの悪用を防ぎます。
- 更新通知 :WordPress、プラグイン、テーマの更新が必要になった場合に、管理者にメールで通知します。
とりあえず、全ての機能を有効にしておいた方が、セキュリティー性が上がるのは間違いありません。けれど、僕の場合は最低限以下の機能はオンにしています。
- 管理ページアクセス制限:自分のIP以外が管理画面に入るのを制限
- ログインページ変更:wp-login.php攻撃対象となりやすいのでログインファイル自体を見つからないようにする
- ログイン詳細エラーメッセージの無効化 :攻撃者に余計な情報を与えない
- ログインロック :数回ログインに失敗したらそれ以上ログインの機会を与えない
- ログインアラート :誰がログインしたかをメールで確かめる(Wordfence Securityと機能がかぶるけどこっちは日本語)
- XMLRPC防御 :ブログエディター利用でXMLRPCを使用していない限りは無効に(攻撃者がいの一番に利用してくる機能)
- 更新通知 :WordPressやプラグインに更新があった場合は、すぐさまアップデートするため
設定方法の詳細については以下に詳しい説明があります。
管理ページアクセス制限を有効にした場合、接続IPが変わると管理画面にログインできなくなります。
そうなった場合は、.htaccessファイルを開いて以下のコード部分を削除してSiteGuardにて再設定してください。
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_START <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^404-siteguard - [L] RewriteRule ^wp-admin/css - [L] RewriteRule ^wp-admin/images - [L] RewriteRule ^wp-admin/admin-ajax.php - [L] RewriteCond %{REMOTE_ADDR} !^(127\.0\.0\.1|サーバIP)$ RewriteCond %{REMOTE_ADDR} !^管理者のIP$ RewriteRule ^wp-admin 404-siteguard [L] </IfModule> #==== SITEGUARD_ADMIN_FILTER_SETTINGS_END
ログインページ変更をすると、ログインページが変わってしまうので、必ずメモなり、ブックマークするなどして忘れないようにしましょう。変更と同時にメールが届くので、そこにも変更URLが書かれています。
Edit Author SlugでログインIDを見えなくする
Edit Author Slugは、Wordpressデフォルトではバレバレになってしまう「ログインユーザー名」を表示されないように編集することができるプラグインです。
WordPressデフォルト動作だと、アドレスバーから以下のように入力してページ遷移すると
http://ドメイン/?author=1
以下のように、ログインユーザー名が表示されてしまいます。
http://ドメイン/author/ユーザー名
この他にも、ログインユーザー名を知る方法はいくつかあります。
ですので、ログイン画面で「調べたユーザー名」を入力して、あとはパスワードが分かれば、ログインされてしまいます。
大抵の攻撃者はボットなどを使用して機械的に何度もログインを試みるので、弱いパスワードが設定されていたりすると、管理者権限を得られる可能性が高くなります。
そんなことがないよう、Edit Author Slugプラグインを利用してログインユーザー名を見えなくしてしまいます。
Edit Author Slugの設定は、管理画面メニューの「ユーザー」→「あなたのプロフィール」にあります。
「Edit Author Slug」設定項目から「Author Slug」を変更してしまいましょう。
REST APIを無効にする
冒頭でも書いたのですが、REST API脆弱性を突いたサイトの改ざんが行われました。
この脆弱性は、Wordpress4.7.2で修正されていますが、REST APIを使用しないのであれば、無効にしておくに越したことはありません。
REST APIを無効にすると動作しないプラグインもあります。JetpackやContact Form7等のプラグインもREST APIを利用します。こういったプラグインを使用するつもりなら、無効にしないことをおすすめします。
プラグインを使った方法
最も手軽な方法として、Disable Embedsプラグインをインストールする方法が楽かもしれません。
ただ、このプラグインを使用すると、Wordpressの埋め込み機能自体も利用できなくなってしまいます。
コードで無効にする
そういった場合は、functions.phpにコードを記入して無効にするという方法もあります。
以下は、initをフックして、REST APIを取り除く方法。
function my_limit_rest_init() { // Remove the REST API endpoint. remove_action( 'rest_api_init', 'create_initial_rest_routes', 99); } add_action( 'init', 'my_limit_rest_init', 9999 );
参考 WordPress4.7より追加されたREST API エンドポイントを無効にする | サイトスパイラル
以下は、rest_authentication_errorsをフックしてエラーステータスを生成する方法です。
function disable_rest(){ return new WP_Error( 'disabled', array( 'status' => rest_authorization_required_code() ) ); } add_filter( 'rest_authentication_errors', 'disable_rest' );
参考 WordPress4.7.0以降で「REST API」を無効にする方法が変わっていたので試しました | 今村だけがよくわかるブログ
Simplicityを利用している場合
Simplicityテーマを利用している場合は、管理画面の「外観」→「カスタマイズ」の「その他」項目にある「REST APIを有効」のチェックを外してください。
まとめ
これだけの設定がしてあれば、ある程度セキュリティーは高くなるかと思います。
あとその他の基本として、以下のような対策も忘れてはいけません。
- WordPress・プラグイン・テーマの新バージョンが出ればアップデートする
- 「Wordpressのログインパスワード」を記号なども用いて強力にする
今回紹介した対策をしたとしても、100%脅威を取り除くことは出来ないかもしれません。
けれど、「Wordpressデフォルト状態」よりは、攻めにくい城にはなるかと思います。
アメリカがトップですか…
うちはロシア、ウクライナとかその周辺です…
対策済みのポイントを突いた攻撃をして404とかになっているのが笑えてきます 笑
↑やばい人 笑
やっぱり多いのはadminとかadmin.phpとかですかね
ロシアからの攻撃が多いのでyandexからのアクセスがあったときは怖かったです…
基本的には悪くない人だと思いますが…
あと、なにげに一番速くインデックスしてくれたのがyandexでした
日本は平和ですな~ 笑