WordPressのREST API
WordPress v4.7以降にREST APIが搭載されていて、デフォルトで有効になってます。
自分のサイトにWordPressを使って構築しているのなら、https://YourSiteURL/wp-json/でアクセスしてみてください。
(インストールしているディレクトリがドキュメントルートではないなら、https://YourSiteURL/hoge/wp-json/の場合もあります)
もしかしたら、このようなJSONが表示されていることと思います。(このスクリーンショットはMicrosoft Edgeでの表示となります)
このように表示されていれば、注意が必要です。
認証が不要なエンドポイントがある
WordPressは、APIを使っていろいろな情報を取得できたり更新できるようになっています。
この中で認証不要なエンドポイントがあります。
例えば、ユーザー情報の取得とかは認証不要です。
こんなURLでアクセスしてみましょう。
1 2 |
https://YourSiteURL/wp-json/wp/v2/users/1 |
このように6行目と7行目のモザイク部にユーザIDが表示されていませんか?
WordPressインストール時に作成したユーザーを、そのまま管理者として利用していることが多いと思います。
そのようなケースでは、管理者のアカウントが表示されてしまいます。
また、複数ユーザーが登録されている場合は、1を2,3,4と変更してアクセスするとユーザー情報が次々と表示されます。
このように、意図しない情報公開により、次のようなことがあるかも知れません。
- WordPressの運用を制作会社に業務委託していて、その制作会社名が表示されている
- 運用担当者の実名が公開されている
WordPressの便利APIの存在を知らないと、管理者のアカウント情報をWEB上で公開することになってしまいます。
/wp-admin/や/wp-login.phpに対するアクセスを、何の制限も設けていない運用担当は流石に存在しないでしょうから、すぐに何かをされてしまうことはないと思います。(万が一/wp-admin/や/wp-login.phpへの制限がついてないなら今すぐやりましょう!)
管理者のアカウントが外部に漏れたりしたらどこで何が起こるかわかりません。
また担当している側からしてみたら、自分の名前が意図していないところで公開されているのは気持ちいいものではないでしょう。
REST APIの塞ぎ方
では、APIにアクセスさせないようにするにはどうすればよいでしょうか?
プラグインを探せばありますが、果たして信用に足るプラグインでしょうか?
信用できないプラグインなら、コードを書けば良いのですが、何も難しいことはありません。
/etc/opt/kusanagi/nginx/conf.d/プロファイル名.confを開き、serverディレクティブに次のコードを追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# /wp-josnへのアクセス制限 location = /wp-json { satisfy all; allow 127.0.0.1; allow xxx.xxx.0.0/16; deny all; try_files $uri $uri/ /index.php?$args; } # /wp-json/へのアクセス制限 location = /wp-json/ { satisfy all; allow 127.0.0.1; allow xxx.xxx.0.0/16; deny all; try_files $uri $uri/ /index.php?$args; } # /wp-json/wp/v2/users/1へのアクセス制限 location = /wp-json/wp/v2/users/1 { satisfy all; allow 127.0.0.1; allow xxx.xxx.0.0/16; deny all; try_files $uri $uri/ /index.php?$args; } |
また、3番目のlocationはユーザーが管理人1人なので、パスを決め打ちで設定しています。
そしてNGINXを再起動します。
1 |
# kusanagi nginx |
以上で設定完了です。
まとめ
/feed/、/rss/、/robots.txtなどAPIだけではなく、このようなURLにもWordPressは応答を返してくれます。
見られて問題無い情報であれば良いですが、見られて困るような場合は直ちに塞ぐようにしましょう。
コメント