Hushfort

WordPress のユーザー名漏えい(ユーザー列挙)を防ぐには?

執筆:Eureka Studio · 更新日

要点

WordPress は 4 つの公開された場所でユーザー名を見せています。REST エンドポイント /wp-json/wp/v2/users、?author=1 のリダイレクト、投稿者アーカイブの URL、そしてコアのユーザーサイトマップです。これらを隠すには、ログアウト中の訪問者には REST の一覧をブロックし、?author= スキャンを止め、ユーザーサイトマップを削除し、ログインエラーのメッセージを共通にします。プラグインなら 4 つすべてに対応できます。対処後は、それぞれをテストしてください。

手順

  1. 1手順 1

    WordPress が今何を見せているか確認する

    ログアウトした状態で yoursite.com/wp-json/wp/v2/users にアクセスします。デフォルトのインストールでは JSON の一覧が返され、slug 欄に各投稿者のログイン名が入っています。

    yoursite.com/wp-json/wp/v2/users の公開 REST ユーザー一覧。slug に demo-admin が表示されている
  2. 2手順 2

    投稿者スキャンを試す

    次に yoursite.com/?author=1 にアクセスします。WordPress は /author/your-username/ へリダイレクトし、アドレスバーに名前が表示されます。ボットは 1、2、3 と番号を増やして、すべてのユーザーを集めます。

    yoursite.com/?author=1 が yoursite.com/author/demo-admin/ にリダイレクトされ、「投稿者: demo-admin」という投稿者ページが表示されている
  3. 3手順 3

    4 か所を塞ぐ

    「Hushfort → 攻撃面の強化」を開いてオンにします。「REST ユーザー一覧」、「投稿者スキャン」(「?author=1 スキャンをブロック」)、「サイトマップの投稿者一覧」、「oEmbed の投稿者情報」をオンのままにして保存します。

    攻撃面の強化の設定: REST ユーザー一覧はログアウト中の訪問者に対してブロック、投稿者スキャンはブロック、サイトマップの投稿者一覧と oEmbed の投稿者情報は削除
  4. 4手順 4

    プライベートウィンドウでもう一度テストする

    ログアウトした状態で同じリクエストを繰り返します。ユーザー一覧は 404 とともに「rest_no_route」を返すようになり、?author=1 もユーザー名へリダイレクトしなくなります。

    同じ REST ユーザー一覧のアドレスが、ステータス 404 で rest_no_route を返している

なぜ重要なのか

ログインするために、攻撃者に必要なものは 2 つ。ユーザー名とパスワードです。WordPress は初期状態のままだと、その前半を差し出してしまいます。これはバグではなく、それぞれの場所には理由があります (アプリ向けのフィード、わかりやすい投稿者 URL、検索エンジン)。しかしそれらが組み合わさると、どんなボットでも数秒でサイトのログイン名をすべて一覧にできてしまいます。

ユーザー名を隠しても、弱いパスワードが安全になるわけではありません。隠すことで、パズルの簡単なほうの半分がなくなり、推測のたびに名前とパスワードの両方を当てなければならなくなります。ログイン制限や二要素認証と組み合わせれば、推測は「時間がかかる」から「見込みがない」に変わります。

WordPress がユーザー名を公開している 4 か所:

  1. REST API — /wp-json/wp/v2/users が投稿者をスラッグ付きで一覧表示します。スラッグは通常、ログイン名と同じです。
  2. 投稿者スキャン — /?author=1 が /author/login-name/ へリダイレクトします。
  3. 投稿者アーカイブ — アーカイブの URL 自体に投稿者スラッグが含まれています。
  4. コアのサイトマップ — /wp-sitemap-users-1.xml が投稿者アーカイブの URL を一覧表示します。oEmbed の応答にも投稿者の情報が含まれることがあります。

よくある間違い

  • 1 か所を直して終わりにする。 REST の一覧が開いたままなら、?author= を塞いでもボットにとっては何も変わりません。4 か所すべてを確認してください。
  • 表示名がログイン名と同じ。 すべての漏えいを塞いでも、テーマが「投稿者: admin」と表示すれば名前はわかってしまいます。「ユーザー → プロフィール」で別の表示名を設定してください。
  • 本物の投稿者ページを壊してしまう。 書き手が複数いるブログでは、投稿者アーカイブは役に立ちます。アーカイブそのものではなく、番号スキャンをブロックしてください。
  • 詳しすぎるログインエラー。 「ユーザー名 jane のパスワードが間違っています」というメッセージは、その名前が存在することを裏付けてしまいます。どちらの場合も同じメッセージを使いましょう。

プラグインを使わない方法

ほとんどは必須プラグイン (wp-content/mu-plugins/hide-users.php) で対応できます:

<?php
// 1. REST user list: logged-out visitors get nothing.
add_filter( 'rest_endpoints', function ( $endpoints ) {
    if ( ! is_user_logged_in() ) {
        unset( $endpoints['/wp/v2/users'], $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
} );

// 2. ?author=N scans: stop the redirect that reveals the name.
add_action( 'template_redirect', function () {
    if ( isset( $_GET['author'] ) && ! is_admin() ) {
        wp_safe_redirect( home_url( '/' ), 301 );
        exit;
    }
} );

// 3. Core sitemap: drop the users provider.
add_filter( 'wp_sitemaps_add_provider', function ( $provider, $name ) {
    return 'users' === $name ? false : $provider;
}, 10, 2 );

// 4. Same message for wrong username and wrong password.
add_filter( 'login_errors', function () {
    return 'The username or password is incorrect.';
} );

注意点: テーマやプラグインが REST ユーザー一覧を読み取ることがあるため、まずステージングサイトでテストしてください。これでアーカイブ URL の投稿者スラッグは変わりません。変えるには、各投稿者の nicename を変更するか、表示名用のプラグインを使います。また、サイトを移転したり作り直したりするときに、管理すべきファイルがひとつ増えることになります。

うまくいかないときは

  • 連携サービスが投稿者一覧を取得できなくなった。 外部ツールの中には、ログインせずに /wp/v2/users を読み取るものがあります。アプリケーションパスワードを発行して認証させるか、一覧を再び許可してください。
  • 投稿者ページが 404 になる。 投稿者アーカイブを完全に無効化する設定を選んでいます。番号スキャンだけをブロックする選択肢に切り替えてください。
  • SEO プラグインがまだ投稿者を一覧表示している。 多くの SEO プラグインは独自の投稿者サイトマップを生成します。そのプラグインでも投稿者サイトマップをオフにしてください。

Hushfort なら

ユーザー名シールドは 無料の WordPress セキュリティプラグイン Hushfort Security に追加する有料アドオン Hushfort Pro の機能です。何がまだ漏れているかを示す攻撃面スキャンは、無料版プラグインに含まれます。

Hushfort の攻撃面の強化レイヤーに含まれる ユーザー名シールド は、4 か所すべてをひとつの画面で塞ぎます:

  • ログインしていない訪問者に対して、REST の /wp/v2/users の一覧をブロックします。
  • /author/name/ のアーカイブは残したまま、?author=N スキャンをブロックします (お好みでアーカイブ自体を無効にすることもできます)。
  • コアのユーザーサイトマップと、oEmbed の応答に含まれる投稿者情報を削除します。
  • ユーザー名が間違っている場合もパスワードが間違っている場合も、ログインエラーのメッセージを同じにします。

その後、攻撃面スキャン が実際のリクエストで各箇所をテストし、まだ漏れているユーザー名があれば名指しで示します。

よくある質問

WordPress のユーザー名の列挙とは何ですか?

?author=1 や REST ユーザー一覧のような公開 URL から、サイトのログイン名を収集することです。名前がわかれば、攻撃者はパスワードを推測するだけで済みます。

ユーザー名が見えているとセキュリティ上のリスクになりますか?

それだけで危険というわけではありませんが、推測の手間が半分になります。名前を隠すのは小さな強化策で、主な守りは強力なパスワード、ログイン制限、二要素認証が担います。

REST ユーザー一覧をブロックするとエディターが壊れますか?

いいえ。ログイン中のユーザーは対象外なので、ブロックエディターも管理画面も通常どおり動作します。影響があるのは、外部の連携サービスがログインせずにユーザー一覧を読み取っている場合だけです。

投稿者アーカイブページは残せますか?

はい。/author/name/ のアーカイブはそのまま使いながら、?author= の番号スキャンだけをブロックできます。名前を完全に隠すには、投稿者の表示名と投稿者スラッグをログイン名とは別のものにしてください。

ログインエラーのメッセージはなぜ重要なのですか?

WordPress はデフォルトで、ユーザー名とパスワードのどちらが間違っていたかを伝えます。これにより、どのユーザー名が存在するかが確定してしまいます。どちらの場合も同じメッセージにすれば、その手がかりはなくなります。

不具合の報告・機能のリクエスト

メッセージは Hushfort の開発チームに直接届きます。

内容の種類

返信にのみ使用します。

これらの情報は返信のためだけに使用します。 プライバシー