WordPressのログイン履歴に不審なアクセスがあり、ユーザー情報が外部から取得できないか確認した。すると、投稿のREST APIレスポンスにuser_nicenameという形で投稿者のスラッグが含まれていた。
Table of contents
Open Table of contents
user_loginとuser_nicenameの違い
| 項目 | 用途 |
|---|---|
user_login | ログイン時に入力するユーザー名 |
user_nicename | 投稿者URLなどに使用するスラッグ |
nickname | プロフィールのニックネーム(ユーザーメタ) |
display_name | サイト上の表示名 |
WordPressは通常、新規ユーザーの作成時にuser_loginをもとにuser_nicenameを生成する。
そのため両者が一致していることがある。管理画面からニックネームや表示名を変えても、user_nicenameは変わらない。
REST APIで確認する
外部の未認証環境から実行する。
curl -sS "https://example.com/wp-json/wp/v2/posts?_embed&per_page=1" \
| jq '.[0]._embedded.author[] | {id, name, slug, link}'
出力例:
{
"id": 1,
"name": "編集担当",
"slug": "admin",
"link": "https://example.com/author/admin/"
}
ここでのslugはuser_nicenameに対応する。user_loginと同じ値ならログイン名を推測できる。ただし、数値のユーザーIDや投稿者スラッグは本来公開され得る情報であり、表示されたこと自体が認証情報の漏洩を意味するわけではない。
投稿者URLからも推測できる場合がある。
curl -sSI "https://example.com/?author=1"
WP-CLIでuser_nicenameを変更する
まず現在の値を確認する。
wp user list --fields=ID,user_login,user_nicename,display_name
IDが1のユーザーの場合:
wp user update 1 --user_nicename=site-editor
変更後は、例えば次のようになる。
user_login = secret-admin
user_nicename = site-editor
display_name = 編集担当
user_loginは変わらないため、従来のユーザー名でログインできる。user_nicenameを変更すると投稿者アーカイブURLが変わるので、公開中のページやリンクがあればリダイレクトも検討する。
新規ユーザーをWP-CLIで作る場合は、作成時に--user_nicenameを指定できる。WordPress標準の「新規ユーザーを追加」画面には通常この入力欄はない。
セキュリティ上の位置づけ
user_nicenameを変えることは、ログイン名の露出を減らす補助的な対策である。攻撃者がすでにログイン名を知っている場合、その知識を取り消すことはできない。強いパスワード、ログイン試行回数制限、2要素認証も併用したい。