新年度が始まったということで、この時期に心機一転、WordPressを始めてみたという人もいるのではないでしょうか。
WordPressは世界中で使用されているCMSということもあり利用方法がわかりやすく、使い勝手もとてもいいのですが、すべて自己責任ということでセキュリティについても自分で管理する必要があります。
その中でもイタズラされやすく、また乗っ取りの可能性がある「ログイン対策」について記事にしてみたいと思います。
世界中で使用されているCMSが「WordPress」
世界中で使用されており最も使用率の高いCMSがWordPressです。世界中のホームページの43.1%はWordPressで、CMSのシェアは63.7%にもなります。つまり私たちが見ているサイトのほとんどはWordPressで作られていると言っても過言ではないでしょう。
利用率が高い分セキュリティ対策も必要
世界中で使用され、トップシェアを得ているということは、その脆弱性を狙って攻撃してくる人も多いということです。ハッカーからすればWordPressのセキュリティを突破できれば世界中のホームページを乗っ取り放題というわけです。
WordPressも頻繁にセキュリティアップデートがされ、様々な攻撃への対策がなされているので基本的には心配する必要がありません。緊急性の高いもの、危険度の高いものに対してはすぐにアップデートが来ます。
その一方で、使用している私たちがセキュリティについて管理できていなければすぐに突破されてしまうというのも事実です。その中でも問題があるのが「ログイン名」の問題です。
弱点:ログイン名が推測可能
世界中で愛されているWordPressですが、色んな所からログイン名を覗き見ることができてしまう弱点があります。これ自体は脆弱性ではなく仕様によるものですが、ホームページの扱いに不慣れな人間からすると不親切な仕様です。
ただし、ログイン名を覗ける所は限られていますので自分で穴を塞いでしまえば問題ありません。
/?author=1
1つ目は、サイトの末尾に「/?author=1」をつけるとログイン名が分かってしまうという問題です。実際には著者名(投稿者名)なのですが、初期設定では「ログイン名=著者名」となっていますのでこちらを見ることでログイン名がバレてしまうわけです。
対策① ニックネームとブログ上の表示名を変更
WordPressの右上をクリックするとプロフィールへアクセスすることができます。その中にニックネームとブログの表示名がありますので好きな名前に変更してください。投稿した記事からログイン名を隠すことができます。
しかし、「/?author=1」へのアクセスに対してはこの方法だけでは不十分ですので次の対策を打ちます。
対策② function.phpに書き込む
function.phpに細工をすることで「/?author=1」にアクセスした際に404エラーを返すという方法です。
こちらの方法を用いると投稿者アーカイブへアクセスすることができなくなりますが、投稿者アーカイブを利用している人は少ないと思います。個人でWordPressを運用している場合はまず必要ありません。力業でねじ伏せましょう。
この方法に関してはいくつかコードがあるのですが今回、参考・引用させていただいたサイトこちら。
add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
wp_redirect( home_url( '/404.php' ) );
exit;
}
}
add_action('init', 'disable_author_archive');
これをfunction.phpに貼り付け、再度「/?author=1」にアクセスして404エラーが返ってくることを確認してください。
/wp-json/wp/v2/users
著者名(投稿者名)を隠すことには成功しましたがこれではまだ不十分です。今度はサイトドメインの末尾に「/wp-json/wp/v2/users」をつけてアクセスしてみてください。おそらくログイン名を含んだ文字列が表示されていると思います。
僕も以前「/?author=1」だけ対策していましたが、その後にログイン試行のログを確認してみると見事にログイン名を使ったアクセスがありました。パスワードは違ったものの、半分は合っているので危険性としてはかなり高いです。
こちらはデータベース側の問題ということでfunction.phpではなくデータベースそのものを書き換える方法でいきます。
対策① Edit Author Slugを使う
WordPressのプラグインを使う方法です。更新はされていませんが現在でも使用可能で、後述する方法と同じ場所を書き換えてくれるものです。
著者名(投稿者名)も書き換えてくれるので、投稿者アーカイブを潰さずに「/?author=1」を対策したい場合にも使えます。
対策② phpMyAdmin を編集
直接データベースを操作して「user_nicename」を変更する方法です。「/wp-json/wp/v2/users」にアクセスした際のSlugが変更されてログイン名が分からなくなります。
使用しているサーバーのページからデータベースへのアクセスが発生しますので、少々手順が複雑となりますが一度書き換えてしまえば、それ以降変更は必要ありませんので手間はかかりません。
やりかたはこちらのサイトを参考にしてみてください。中級者でなくても書き換えられるように大変分かりやすく記述してありました。
この際に「user_login」を変更しなければ今まで通りのログイン名でログインできます。あくまで変更されるのはニックネームのみでログインには影響ありません。
変更後は「/wp-json/wp/v2/users」にアクセスして、ログイン名が表示されていないことを確認してください。
ログイン試行を防ぐ
WordPressのログイン回数はデフォルトでは制限がありません。つまり全てのログイン名に対して、全てのパスワードを当てることもできます。いわゆる総当たり攻撃(ブルートフォースアタック)が可能なわけです。
現在ではサーバー側が膨大なアクセスを検知した場合に切断してくれる仕組みもできていますが、それでも膨大なアクセスを検知するまではログイン試行が続くことになります。
このサイトでもログイン試行回数を制限する対策をしていますが、制限に引っかかるまでの0.01秒に満たない時間でも8~10回ほどアクセスがありますので、対策をしない場合では1分で数千~数万通りの試行がされるはずです。対策は必要です。
Limit Login Attempts Reloaded
プラグインを導入することで「リトライ回数」、「連続でリトライに失敗した際のロック時間」、「何度もロックされた場合の長時間ロック」が設定できます。
設定方法についてはこちらのサイトがわかりやすいです。
iPhoneなどでロックの解除に失敗した際に、次を試せるまでの時間が増えていくのと似ているかも知れません。実際にはリトライ回数が尽きた時点でアクセスが止まることがほとんどですので、長時間ロックが発動するほど攻撃され続けることは滅多にないかと思います。
「All In One WP Security」や「SiteGuard WP Plugin」でも同様の制限が可能
こちらはセキュリティプラグインになりますが、導入することでログイン試行回数の制限ができます。その他のセキュリティについても対策ができますのでこちらで対応するのもよいでしょう。個人的には下記のプラグインがバランスがいいと思います。
全部対策するなら『XO Security』
こちらのプラグインですがログイン名を隠して、ログイン試行回数を制限することができます。つまりここまで書いてきた全てをこのひとつで解決することができます。これさえあれば「Edit Author Slug」も「Limit Login Attempts」も不要というわけです。
プラグインの相性問題や軽さを考えると「Edit Author Slug」も「Limit Login Attempts」の方が問題が起きづらいのですが、なんと言っても1つで全て対策できるのが「XO Security」のすごいところ。
今回設定した内容と同じ部分にアクセスできるリンクがこちら。
REST API 設定(/wp-json/wp/v2/users 対策)
設定項目は少し多いのですが、チェックを付けるだけでセキュリティ上で問題となりそうな部分は塞ぐことができますので、導入してみるのはいかがでしょうか。