
こんにちは、spicatoの有村です。
あっという間に12月ということで、一年が経つのが年々早く感じます。
さて早速本題ですが、今回はWordPressのセキュリティのお話です。
WordPressはもはや言うまでもないですが、世界でもっとも使用されているCMSです。
WordPressのシェアは、全世界のウェブサイトの4割、CMSに限れば6割というデータもあります。
それだけ普及しているということは、逆にそれだけハッカーに狙われやすいということでもあります。
そこで、今回は備忘録もかねて、改めて対策方法をまとめてみました。お付き合い頂ければ幸いです。
①ユーザーパスワードを複雑なものにする
まず最初に思いつくのは、パスワードを複雑にすることです。
パスワードは、会社名やドメイン名など第三者から推測されやすいものは避け、パスワード生成ツールなどを使用してできるだけ複雑なものにします。
②ログイン画面のURLの変更
次に思いつくのは、ログイン画面URLの変更です。
デフォルトだとWordPressのログインページURLはyoursite.com/wp-admin になっています。これをそのままにしておくと、いわゆる総当たり攻撃で解読されやすくなります。
これを防ぐには、ログインURLを変更するか、或いは画像認証を追加するなどの対策を行います。
ログインURLの変更、画像認証の追加はともに「SiteGurad WP Plugin」プラグインを使用すれば簡単に設定できます。
③ユーザー名を特定させない
WordPressはデフォルトだと、ログイン情報のユーザー名は簡単に特定できてしまいます。
例えば、サイトURLの後ろに「/?author=1」などとつけてアクセスしてみると、URLに「/author/ログインユーザー名/」と表示されてしまいます。
また、WordPressのREST API(WordPressのデータベース情報を取得できるAPI)のURLを叩けばサイトのコンテンツ情報が簡単に取得できます。
例えば、以下のURLにアクセスすると外部からユーザーIDが見えてしまいます。
yoursite.com/wp-json/wp/v2/users
対策としては、以下のコードをfunctions.phpに追加することで解決できます。
//author情報からユーザー名の特定防止
function disable_author_archive_query() {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ){
wp_redirect( home_url() );
exit;
}
}
add_action('init', 'disable_author_archive_query');
//WordPress REST API によるユーザー情報特定防止
function my_filter_rest_endpoints( $endpoints ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'my_filter_rest_endpoints', 10, 1 );
④ログイン画面のアクセスを接続元のIPで制限する
ログイン画面にアクセス可能な場所を会社のIPアドレスなどに限定しておくことで、それ以外の場所からのアクセスを防ぐことができます。
ログイン画面のIP制限の設定は.htaccessに以下の記述を追加することで実現できます。
<Files wp-login.php>
order deny,allow
deny from all
allow from [許可するIP]
</Files>
⑤WordPressとプラグインのバージョンを最新版に保つ
WordPressのバージョンを最新版に保つことはセキュリティの観点においても重要です。WordPressは最新版バージョンがリリースされるたびに、セキュリティ面のアップデートも行わているので、最新版に保つことは旧バージョンのセキュリティホールをついた侵入を防ぐという意味でも大事です。
デフォルトではWordPressはマイナーアップデートは自動で更新されるようになっていますが、メジャーアップデートは管理場面から手動で行う必要があります。(fuctions.phpなどで自動更新させることも可能です。)
⑥不要なプラグインやテーマファイルの削除
使用していないプラグインやテーマファイルを残したままにしておくと、それらに存在する脆弱性につけ込んだ攻撃にさらされる可能性がありますので、削除しておいたほうが良いです。
⑦ログインの失敗回数の制限
デフォルトだと、WordPressはユーザーがログインを何度失敗しても大丈夫なようになっています。
一定回数ログインが失敗すると一時的にブロックされるようにログインの失敗回数を制限します。
これも「SiteGurad WP Plugin」プラグインで設定できます。
⑧その他
その他に、こちらはWordPressというよりサーバー側での話になりますが、以下の対策方法もあります。
・FTPに接続できるIPアドレスを制限する。(これは使用しているレンタルサーバーのコントロールパネルで簡単に設定できます。)
・ファイルの送受信を秘密鍵が必要なSFTP接続形式にする。
おわりに
実装者としては、インタラクションやパフォーマンス面だけでなく、セキュリテイにも考慮したコーディングを今後も心がけでいきたいと思います。
今回はおもしろ要素なしでしたが、ここまでお付き合い頂きありがとうございました。
最近一気に冷え込んできたので、皆さまお体ご自愛ください。それでは。