WordPressで構築したサイトのアクセスログを見ると、ページには表示させていないのに何故かログインアカウントでアタックされている場合があります。
これはWordPressが自動生成する投稿者アーカイブが有効になっているからです。攻撃者はこの機能を悪用して不正ログインを試みます。
投稿者アーカイブとは
投稿者アーカイブとは、WordPress が自動生成する投稿者ごとの投稿をまとめる機能のことです。
ちょっと技術的なことを言うと、テーマのauthor.php
に規定されているページのことです。
初期状態のWordPressでは投稿者ごとに投稿者アーカイブが作成されます。そのため、WordPressのユーザー名が閲覧者にバレてしまい、大いなるセキュリティの穴となることがあります。
投稿者アーカイブを見る方法
WordPressサイトで、以下のようなURLにアクセスすると、対象ユーザーが作成した投稿の一覧ページが表示されます。
http://example.com/author/ユーザー名/
また、以下のように?author=1
を付けてアクセスすると、ユーザーIDが1のユーザーの投稿者アーカイブにリダイレクトされます。
リダイレクト先のURLには管理者のユーザー名が含まれるので、WordPressのログインIDがわかってしまいます。
http://example.com/?author=1
投稿者アーカイブのURLの危険性
投稿者アーカイブのURL内にログインアカウント名が公開されていることになります。
ユーザー名は管理画面のログインに必要となる重要なデータです。不正ログインを試みるには大きな手掛かりになります。あとはパスワードさえ突破すれば不正ログインに成功です。
ブルートフォースアタック(総当たり攻撃)という攻撃手法を用いて、手あたり次第パスワードを利用してログインを試されたら、簡単なパスワード「1111」「1234」「password」などではあっという間にログインされてしまいます。
ちなみに、投稿者のニックネームを設定していても変わりません。
ニックネームを設定していると、投稿ページをはじめとしたフロントページではユーザー名は表示されないので安心なのですが、投稿者アーカイブのURLに限っては、ニックネームで上書きされることはなくユーザー名のままとなります。
また、投稿ページやフロントページに投稿者アーカイブへのリンクを載せない場合もあるでしょう。
しかし、投稿者アーカイブが存在している以上、URLから直接アクセスされたらユーザー名はバレてしまいます。
投稿者アーカイブを無効化する
投稿者アーカイブは次のいずれかの方法で無効化することができます。
- author.phpを使用する方法
- functions.phpを使用する方法
- プラグインを使用する方法
今回は、「author.phpを使用する方法」と「functions.phpを使用する方法」を紹介します。
functions.phpを使用する方法
functions.php
を利用すると簡単に無効化することが出来ます。
適用しているテーマのfunctions.php
に以下のコードを追加します。コピペでOKです。
add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
if( preg_match( '#/author/.+#', $_SERVER['REQUEST_URI'] ) ){
wp_redirect( esc_url( home_url( '/404.php' ) ) );
exit;
}
}
add_action('init', 'disable_author_archive');
上記のコードをfunctions.php
に追加すると、投稿者アーカイブにアクセスすると404エラーにリダイレクトされるようになります。
これで、投稿者アーカイブが無効化されます。
リダイレクト先を404エラーから変更する場合には、wp_redirect()
で指定しているURLを変更してください。
例えば、以下のように記述した場合には、投稿者アーカイブにアクセスするとトップページにリダイレクトされるようになります。
wp_redirect( esc_url( home_url('/') ) );
author.phpを使用する方法
投稿者アーカイブのテンプレートauthor.php
を使用して投稿者アーカイブを無効化する方法もあります。
適用しているテーマのauthor.php
に以下のコードを追加します。コピペでOKです。投稿者アーカイブにアクセスさせないようにすることで無効化する方法です。
add_filter( 'author_rewrite_rules', '__return_empty_array' );
テーマによってはauthor.php
がない場合があります。
適用しているテーマにauthor.php
がない場合には、author.php
を作成してください。
最後に
ログインIDがバレても問題ない、そんなことよりパスワードを強化すべきだ、という意見もあります。
もちろん、パスワードを強化することも非常に重要です。
投稿者アーカイブを無効化したら不正ログインに防げる訳ではないので、セキュリティ強度の高いパスワードを設定することも併せて対応するようにしてください。
また、投稿者アーカイブを無効化しても、WordPress標準のXMLサイトマップ機能で出力されるXMLサイトマップには、投稿者アーカイブのURLも含まれています。
現時点では標準のXMLサイトマップ機能は細かい制御ができないため、投稿者アーカイブのURLだけ除外したりすることが出来ません。
投稿者アーカイブを無効化する処理と一緒に、標準のXMLサイトマップ機能を無効化する処理も実装しておくのがお勧めです。
標準のXMLサイトマップ機能を無効化する方法は、以下の記事で紹介しています。