WordPressの機能として、サイトURLの後に「/?author=1」と入力すると一番最初に作成したID、つまり管理者IDが表示されてしまうというのは有名な話で、別にこれがWordPressの脆弱性とかいうわけではなく、そういった機能です。
この対策として、多くのサイトでfunction.phpに記述を加えたり、プラグインを使用して投稿者アーカイブページヘのアクセスを回避し、/?author=1でユーザーIDの流出を防ぐ方法が紹介されています。
しかし、これだけではユーザーIDの流出を防ぐことはできないことをご存知でしょうか?
こんな小さな私のサイトも攻撃されている
下記画像を見てください。これは「SiteGuard」というプラグインのログイン履歴画面です。このログを見ると、私の仕業ではない大量のログイン失敗履歴が確認できます。下記の画像は加工していますが、失敗したログインでは私の管理者IDでログインを試みられていました…(恐ろしい…)
もちろん、私も「/?author=1」ページへのアクセスはホームへリダイレクトされるように対策していました。にも関わらず管理者IDが漏れていたのです。一体何が原因なのでしょうか?
/?author=1以外にも管理者IDを見る方法がある
あなたのサイトのURLの語尾に「/wp-json/wp/v2/users」と追加してアクセスしてみてください。表示された文字の中にあなたの管理者IDは含まれていませんか?
私も詳しくはわからないのですが、これはREST API機能といい、WordPressを活用していく上で便利な機能という感じのイメージで捉えています。
つまり、これも脆弱性というわけではなく、そういう機能です。うまく使えば便利なのですが、一方でデメリットもあるということです。水や火を扱うのと同じですね。
とりあえず、WordPressで普通に記事を書くブロガーのような方々にはあまり縁のない機能なのでは無いかと思います。放ったらかしにしておくとサイトを乗っ取られる原因にもなるので、どうせなら対策してしまいましょう。
対策1
xakuro Brog様の記事を参考にさせていただきました。くわしくはそちらをお読み頂いたほうがいいと思われます。
下記のコードをテーマの functions.php に追加することで、上記のエンドポイントを無効化することができます。
xakuro Brog
function my_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', 'my_filter_rest_endpoints', 10, 1 );
この対策でユーザーIDの漏洩に一つ対策が増えたわけですが、そもそもログインを試すことすらできない状態にしておけばユーザーIDが漏れても安心ですね!というわけで下記の対策です。
対策2
下記の画像の右側に注目してください。不正アクセスを試みた場合は「XMLRPC」というタイプで行われていることが分かります。普通、ログイン画面からログインした場合はタイプは「ログイン画面」となります。不正アクセスの攻撃はコンピュータが自動で行っている場合が多いため、「XMLRPC」というタイプでのログイン試行となります。
というわけで、普段はログイン画面からログインするという人は、そもそもこの「XMLRPC」タイプでのログインは必要ないというわけです。不正アクセス防止の為、「XMLRPC」タイプでのログインを一切無効にしてしまいましょう。
今回の対策に使用したのは「SiteGuard」というプラグインです。上記の画像もこのプラグインのログイン履歴を記録してくれる機能です。
プラグインの設定で「XMLRPC防御」という項目へ移動しましょう。
そこで、下記の画像のように「XMLRPC無効化」のラジオボタンにチェックを入れ、設定を保存します。
これでコンピュータによる自動でのログインアタックは防ぐことができます。
ぜひ定期的にログイン履歴を確認し、心当たりのないログイン試行がないか、管理者IDが漏れていないかをチェックしましょう。