セキュリティ観点で考えるWordPressのログインユーザー名

ヘッダ画像

WordPressのユーザー名は丸見え!?

知っていますか?
WordPressのログインユーザー名はだだ漏れだという事実を...

ダッシュボード乗っ取り防止のためのセキュリティ対策で必ずいわれるのが、「ワードプレスのユーザー名にはadminではないものを使おう」です。
たしかにadminというユーザー名には問題があります。
しかし、実はデフォルトの状態ではadminかどうかに関わらず、さして労力をかけずにログインIDは露呈してしまいます。
総当たり攻撃ともいわれるブルートフォースアタックから守らなければならないのは「ユーザー名」と「パスワード」のふたつです。
しかし、WordPress自体はユーザー名は隠すつもりがない仕様といえます。
見解は様々であれど、少なくともわたしは実際のユーザーがこれを認識していないのは大問題ではないかと考えます。

その詳細と対処方法について順を追って解説します。


WordPressではニックネームを必ず変更する

ユーザー名はadminやuser、あるいはブログ名などすぐに憶測できるものを使用していないことが前提です。
まだの方はまずユーザー名の変更を行ってください。

WordPressのユーザー名を変更する3つの方法
WordPressのユーザー名を変更する3つの方法

WordPressでは基本的に一度作成したユーザー名はダッシュボード上では変更できません。 インストール時にユーザー名を「admin」としてしまった、あるいはサイト運営の担当者が変わるなどの事情で変更の必要が生じた場合の対処の選択肢は以下の3つです。 新しいユ […]

ニックネームとユーザー名を同じにしない。

それではまずは基本的なところからいきます。
WordPressでは管理者がコメント欄に入力を行うと、ほとんどのテーマで投稿者としてニックネームが表示されます。
テーマによっては記事にも投稿者名としてこれが表示されてしまいます。

表示テーマ:Twenty Twelve

表示テーマ:Twenty Twelve

また、ブラウザではニックネームが表示されていなくてもソース内(body内HTMLタグなどのclass属性名)にニックネームが使われていることもあります。

このニックネームは管理画面の「ユーザー」→「プロフィール」で設定しますが、デフォルトではニックネーム=ユーザー名なのです。

nickname

つまり、ニックネーム未定義の場合、ユーザー名を公表していることになります。
このことを認知していないユーザーが多く、WordPress構築サイトはニックネーム=ユーザー名のものが意外に多いです。
最低限、任意のニックネームを設定して、ブログの表示名にこのニックネームを選択しましょう。

セキュリティ的にニックネーム未設定は論外だと心得てください!

投稿者アーカイブからユーザー名が分かる

WordPressでは投稿者ごとのアーカイブ(Author Archive)というページが自動作成されます。
この投稿者アーカイブはユーザー名がadminならば、example.com/author/adminでアクセスできます。
投稿者アーカイブへのリンクを作らなければ、閲覧者に知られることはないのではと思われますが、実はサイトURLに?author=ユーザーIDというパラメータを付けることでユーザー名の投稿者アーカイブにリダイレクトされます。

つまり・・・
example.com/?author=1でアクセスすれば
example.com/author/adminにリダイレクトされるということです。

?author=1の数字はユーザーIDになるわけですが、一番はじめに作られるユーザーが1となり、アカウントがひとりの場合、通常は1です。
2つ目以降のユーザーはauthor=2となっていきますので、1から順番にアクセスしてみればよいのです。

ちなみにこのサイトでは一度初期アカウントでログイン後、新規で作成し直しているので、author=1ではありません。
(ただし、下記の方法にて投稿者アーカイブのアクセスを禁止しており、404でアクセスできません)

ユーザー名が変更されていた場合、ブルートフォースアタックでのユーザー名の特定にひと工程手間が掛ることにはなります。
これが無意味ということはないとありませんが、その気になれば、たやすく見破られてしまうということを認識しておいてください。

投稿者アーカイブのURLをプラグインで変更

「Edit Author Slug」というプラグインを使うことで投稿者アーカイブのURLを変更できます。
プラグインを追加して有効にすると前述の管理画面の「ユーザー」→「プロフィール」に下記のような設定が追加されます。

editauthorslug

Customの項目でauthor/の後ろのURLを任意に指定できます。
この例ではユーザー名adminに対して、下記のような投稿者アーカイブのURLです。
https://seous.info/author/D6zfpGN8yI7f7xRXH3n0

投稿者アーカイブにアクセスさせない

複数の投稿者で運営しているサイトであれば、投稿者アーカイブは有用な場合もあるかと思うのですが、個人ブログやホームページ運用など、管理者がひとりであれば、他のアーカイブ系ページと内容が被ることになります。
重複コンテンツはSEO的な観点でもプラスには働きません。
こういった場合はそもそも投稿者アーカイブそのものが不要でしょう。
下記をfunctions.phpに下記を追記することで404を返します。

<?php
add_filter( 'author_rewrite_rules', '__return_empty_array' );

function disable_author_archive() {
    if( isset($_GET['author']) || (isset($_SERVER['REQUEST_URI']) && preg_match('#/author/.+#', $_SERVER['REQUEST_URI'])) ){
        wp_redirect( home_url( '/404.php' ) );
        exit;
    }
}

add_action('init', 'disable_author_archive');
?>

その他にもユーザー名が晒されている

コメント機能

コメント機能を使っていると通常はコメントテンプレートであるcomment-template.phpにより、コメント欄が出力されます。
このテンプレートでは以下のように投稿者名のクラスが付与されます。

class="comment byuser comment-author-xxxxxx ~"

しかも、ニックネームではなくログインユーザー名です。
これはfunctions.phpでのリムーブ処理でcomment-author()の出力を止めてしまうのがよいでしょう。

<?php
function remove_comment_author_class( $classes ) {
  foreach( $classes as $key => $class ) {
      if(strstr($class, "comment-author-")) {
        unset( $classes[$key] );
      }
  }
  return $classes;
}
add_filter( 'comment_class' , 'remove_comment_author_class' );
?>

WP REST API

WordPressはWP REST APIという仕組みで外部からJSON形式でデータ取得できます。
たとえば、こちらは投稿一覧です。
example.com/wp-json/wp/v2/posts
そして、ユーザー情報も取得することができます。
example.com/wp-json/wp/v2/users
自身のサイトURLに/wp-json/wp/v2/usersを加えてアクセスすると驚愕ではないでしょうか。
出力される内容にはユーザ名もニックネームも含まれます。
このデフォルトの機能は意図せずに有効になっているサイトがほとんどかと思います。

こちらもfunctions.phpで出力を止めることができます。

<?php
function 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', 'filter_rest_endpoints' );

?>

セキュリティ系のプラグインでは、デフォルトでこの挙動を抑制するものが多いようです。

万が一のログインユーザー名漏洩に備える

たとえ、ログイン情報が露呈したとしても、乗っ取りを防ぐ鉄壁の手段はあります。

  1. 管理画面へのIP制限
  2. ログインURLの変更
  3. ログイン試行回数制限

1~2はWordPressのダッシュボードにアクセスすることすらできないため、非常に効果が高いです。
もちろん、FTPにも対策を行います。
これはWordPress以外の静的HTMLのホームページにおいても有効です。
3のログイン試行回数制限はプラグインのほか、Xserverなどのレンタルサーバで見られる同様のオプション機能もありますので、それらも合わせて活用するとよいでしょう。

管理画面(ダッシュボード)へのアクセスを制限する
管理画面(ダッシュボード)へのアクセスを制限する

ガンプラー攻撃の媒体としてウェブサイトが使われる原因のひとつがFTP経由です。 しかし、CMSの場合はもうひとつ大きな危険があります。 ログインID(ユーザー名)とパスワードを盗むブルートフォースアタックで管理画面にログインされてしまうと、やりたい放題なのです […]

WordPressでは、ユーザー名はデフォルトでは公開扱いであり、あちこちで散見します。
セキュリティはパスワードが基本という考え方なのでしょうが、使うユーザーのリテラシーも様々です。
わたしには安易にユーザー名を公表する仕様は疑問に思えます。

WordPressでのユーザー名の漏洩についての対策を書きましたが、日々のチェックと不測の事態に備えバックアップは必須です。

コメント一覧

  1. 木村ゴン より:

    ユーザ名が漏洩しても、パスワードがあると思うので大丈夫だと高を括るのは危険ですか? 現在の乗っ取りの技術はどのくらい進んでいるのでしょうかね笑。

    • R3098 より:

      こんにちは。
      パスワードの強度にもよると思います。残念ながら、ユーザー名をadminとしてしまうユーザーが強固なパスワードを付けるとは考えにくいです。
      大文字、小文字いずれかの英字だけの6桁パスワードなんかは瞬殺ですものね(笑
      まあ、WordPress自体は「ユーザー名を公開して何が問題?」という考え方ですよね。
      デフォルト仕様ではダッシュボードのログインURLも共通ですし、私的にはそれはちょっと乱暴かなと思います。
      XML-RPC経由のブルートフォースアタックなどは、一般ユーザーはほとんど意識していないでしょう。

      「管理画面(ダッシュボード)へのアクセスを制限する」でも紹介していますが、管理画面に対してのブルートフォースアタックには、ログイン試行回数制限が有効です。プラグインもありますし、多くのレンタルサーバでも設定が可能だと思います。

  2. PPMc より:

    不正ログインを監視していてニックネームで隠しているはずのユーザー名でログインがあり、調べていてこちらにたどり着きました。
    大変参考になりました。
    ありがとうございました。

    • R3098 より:

      コメントありがとうございます。
      ログイン画面からのアタックだけを考えれば、ユーザー名が分かっていても試行回数の制限、もしくはURLであるwp-login.phpのパス変更でかなり危険度は下げられます。
      ただ、ログを見ていると、wp-login.phpへの直接アクセスだけでなく、XML-RPC経由のアタックも非常に多いので、やはりユーザー名は漏洩しない方がよいと思います。
      不要なら、XML-RPCも制限をした方がよいです。
      https://seous.info/wp-customize/3306#chapter-4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.



関連記事