知っていますか?
WordPressのログインユーザー名(user_login)はだだ漏れだという事実を…
ダッシュボード乗っ取り防止のためのセキュリティ対策で必ずいわれるのが「ワードプレスのユーザー名にはadminではないものを使おう」です。
たしかにadminというユーザー名には問題があります。
しかし、実はデフォルトの状態ではadminかどうかに関わらず、ごく簡単にユーザー名は露呈してしまいます。
総当たり攻撃であるブルートフォースアタックから守らなければならないのは「ユーザー名」と「パスワード」のふたつです。
しかし、WordPress自体はこのユーザー名を隠すつもりがない仕様に見えます。
見解は様々であれど、わたしは実際のユーザーがこれを認識できていないのは大問題ではないかと考えます。
その詳細と対処方法について順を追って解説します。
憶測できるユーザー名は避けるべき
ユーザー名は、adminやuser、あるいは、ブログ名などの関連するものを避けることが重要です。適切なユーザー名でない方はまずユーザー名の変更を行ってください。
ニックネームとユーザー名を同じにしない
それではまずは基本的なところからいきます。
WordPressでは管理者がコメント欄に入力を行うと、ほとんどのテーマで投稿者が表示されます。
テーマによっては記事にも自体にも投稿者名を表示します。
また、ブラウザの表示には現れない場合でも、HTMLソース内(bodyタグのクラス属性など)に投稿者名が含まれていることがあります。
サイト上で表示される投稿者名は、管理画面の「ユーザー」→「プロフィール」で設定された「ブログ上の表示名」(display_name)で指定されます。
display_name はユーザーのプロフィール設定のフィールドで user_nicename/first_name/last_name/user_login などから選択します。
ただし、display_name が未設定の場合は user_nicename が使用されます。
この user_nicename は通常、user_login(ユーザー名)と同一の値です。
つまり、ニックネームが未定義の場合はユーザー名がそのまま公開されることになります。
この点を認知していないユーザーが多く、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を変更できます。
プラグインを追加して有効にすると前述の管理画面の「ユーザー」→「プロフィール」に下記のような設定が追加されます。
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' );
?>
セキュリティ系のプラグインでは、デフォルトでこの挙動を抑制するものが多いようです。
万が一のログインユーザー名漏洩に備える
たとえ、ログイン情報が露呈したとしても、乗っ取りを防ぐ鉄壁の手段はあります。
- 管理画面へのIP制限
- ログインURLの変更
- ログイン試行回数制限
1~2はWordPressのダッシュボードにアクセスすることすらできないため、非常に効果が高いです。
もちろん、FTPにも対策を行います。
これはWordPress以外の静的HTMLのホームページにおいても有効です。
3のログイン試行回数制限はプラグインのほか、Xserverなどのレンタルサーバで見られる同様のオプション機能もありますので、それらも合わせて活用するとよいでしょう。
WordPressでは、ユーザー名はデフォルトでは公開扱いであり、あちこちで散見します。
セキュリティはパスワードが基本という考え方なのでしょうが、使うユーザーのリテラシーも様々です。
わたしには安易にユーザー名を公表する仕様は疑問に思えます。
WordPressでのユーザー名の漏洩についての対策を書きましたが、日々のチェックと不測の事態に備えバックアップは必須です。
「WordPressのユーザー名は丸見え!?」への4件の返信
不正ログインを監視していてニックネームで隠しているはずのユーザー名でログインがあり、調べていてこちらにたどり着きました。
大変参考になりました。
ありがとうございました。
コメントありがとうございます。
ログイン画面からのアタックだけを考えれば、ユーザー名が分かっていても試行回数の制限、もしくはURLであるwp-login.phpのパス変更でかなり危険度は下げられます。
ただ、ログを見ていると、wp-login.phpへの直接アクセスだけでなく、XML-RPC経由のアタックも非常に多いので、やはりユーザー名は漏洩しない方がよいと思います。
不要なら、XML-RPCも制限をした方がよいです。
https://seous.info/wp-customize/3306#chapter-4
ユーザ名が漏洩しても、パスワードがあると思うので大丈夫だと高を括るのは危険ですか? 現在の乗っ取りの技術はどのくらい進んでいるのでしょうかね笑。
こんにちは。
パスワードの強度にもよると思います。残念ながら、ユーザー名をadminとしてしまうユーザーが強固なパスワードを付けるとは考えにくいです。
大文字、小文字いずれかの英字だけの6桁パスワードなんかは瞬殺ですものね(笑
まあ、WordPress自体は「ユーザー名を公開して何が問題?」という考え方ですよね。
デフォルト仕様ではダッシュボードのログインURLも共通ですし、私的にはそれはちょっと乱暴かなと思います。
XML-RPC経由のブルートフォースアタックなどは、一般ユーザーはほとんど意識していないでしょう。
「管理画面(ダッシュボード)へのアクセスを制限する」でも紹介していますが、管理画面に対してのブルートフォースアタックには、ログイン試行回数制限が有効です。プラグインもありますし、多くのレンタルサーバでも設定が可能だと思います。