WordPress のログイン画面に制限をかける

片倉洋一

前回、WordPress の脆弱性とその対応ということで、 WordPress にインストール時にも抱えているいくつかの脆弱性を紹介いたしました。
今回はその続きとして、 WordPress のログイン画面に対するセキュリティ強化対策を紹介しようと思います。

WordPress のログイン画面

まずは、前回と同じように適当なところに KUSANAGI の VM を立てて WordPress をプロビジョンします。

プロビジョンできましたら、そのプロビジョンした FQDN から WordPress の管理画面へログインするための URL にアクセスします。

例: https://(プロビジョンしたFQDN)/wp-admin

当然ですが、アクセスすると以下のように WordPress のログイン画面が表示されます。

通常、 WordPress のログイン画面へのアクセスには何の制限もかけられていません。
そのため、参照しているサイトが WordPress だと分かれば、簡単にログイン画面にアクセスすることができます。

ログイン画面へのアクセスを防ぐには

ログイン画面へのアクセスを防ぐには色々手段がありますが、一つの例としてログイン画面に IP アドレス制限や Basic 認証をかけるという手段があります。
そうすれば、特定の利用者以外からのアクセスを制限することができます。

実は、最新の KUSANAGI 9 では、すでにログイン画面への IP アドレス制限と Basic 認証をかけるための設定がある程度行われおり、少し設定を修正するだけでログイン画面への IP アドレス制限と Basic 認証をかけることができます。

それでは、 KUSANAGI 9 でどのように設定すればログイン画面に IP アドレス制限と Basic 認証をかけられるを見ていきます。

ログイン画面に IP アドレス制限と Basic 認証をかける

nginx と Apache httpd で設定が違いますので、それぞれ紹介します。

nginx の場合

まずは、対象のサーバーに ssh でログインします。

nginx の場合は下記のパスに KUSANAGI 9 のプロファイルごとの WordPress の設定ファイルが存在します。
その中に以下のような設定があると思います。

  • /etc/opt/kusanagi/nginx/conf.d/(プロファイル名).wp.inc
:
:
location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
    satisfy any;
    allow 0.0.0.0/0;
    allow 127.0.0.1;
    deny all;
    auth_basic "basic authentication";
    auth_basic_user_file  "/home/kusanagi/.htpasswd";
:
:

※この設定の記載は KUSANAGI のバージョンによって変わる場合がありますので、ご了承ください。

この設定の中の allow 0.0.0.0/0; という部分が、全ての IP アドレスを許可するという設定になっていますので、この設定を削除やコメントアウトします。
その際に、 allow 127.0.0.1; という設定は削除しないように気を付けてください。
設定を削除したのちに、その下に allow (許可したい IP アドレス)/32; と許可したい IP アドレスを設定します。

  • /etc/opt/kusanagi/nginx/conf.d/(プロファイル名).wp.inc
:
:
location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
    satisfy any;
    # allow 0.0.0.0/0;
    allow (許可したい IP アドレス)/32;
    allow 127.0.0.1;
    deny all;
    auth_basic "basic authentication";
    auth_basic_user_file  "/home/kusanagi/.htpasswd";
:
:

これで、指定の IP アドレスのみログイン画面の表示を許可され、指定した IP アドレス以外は Basic 認証が求められるようになりました。

なお、なぜ allow 127.0.0.1; という設定は残したままかという事ですが、 127.0.0.1 という IP アドレスはローカルループバックアドレスと呼ばれる特別な IP アドレスで、この IP アドレスは自分自身を指し、自分のサーバーと通信する際に利用する IP アドレスです。
通常、外部から接続することはできません。
WordPress ではこのローカルループバックアドレスを使って、 wp-cron ( WordPress で cron のように時間で実行されるタスク)などが実行されますので、必ず設定を残しておく必要があります。

閑話休題、まだ Basic 認証用のユーザーとパスワードを設定していない状態ですので、 htpasswd コマンドを使用してユーザーとパスワードを /home/kusanagi/.htpasswd ファイルに設定します。

# htpasswd -c /home/kusanagi/.htpasswd (ユーザー名)
New password:
Re-type new password:
Adding password for user (ユーザー名)
#

ユーザー名の部分には Basic 認証用のユーザー名を指定します。
Basic 認証用のパスワードは、New password:Re-type new password: で2回入力を求められるので、同じ値を入力します。
その際、パスワードは画面に表示されませんので気を付けてください。

もし、 Basic 認証用に新しいユーザーを追加したい場合は、先ほどのコマンドのオプションから -c を除いて実行すれば追加できます。

# htpasswd /home/kusanagi/.htpasswd (追加ユーザー名)
New password:
Re-type new password:
Adding password for user (追加ユーザー名)
#

最後に nginx サーバーのリロードをします。
nginx サーバーのリロードは kusanagi nginx --reload コマンドで行えます。

# kusanagi nginx --reload
nginx: the configuration file /etc/opt/kusanagi/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/opt/kusanagi/nginx/nginx.conf test is successful
nginx completed.
#

もしここでエラーが出る場合は、設定ファイルに問題がありますので、設定ファイルの内容を確認してください。

Apache httpd の場合

nginx と同様にまずは、対象のサーバーに ssh でログインします。

Apache httpd の場合は、 .htaccess ファイルで KUSANAGI 9 のプロファイルごとにアクセス制限の設定がされています。
それぞれのファイルの中で、以下のような設定があると思います。

  • /home/kusanagi/(プロファイル名)/.htaccess
:
:
<Files wp-login.php>
        Order deny,allow
        Deny from all
        Allow from all
        #Allow from 127.0.0.1
        AuthType Basic
        AuthName "ENTER YOUR NAME & PASSWORD TO LOGIN"
        AuthUserFile /home/kusanagi/.htpasswd
        Require valid-user
        Satisfy any
</Files>
:
:

※この設定の記載は KUSANAGI のバージョンによって変わる場合がありますので、ご了承ください。

  • /home/kusanagi/(プロファイル名)/wp-admin/.htaccess
:
:
Order deny,allow
Deny from all
Allow from all
#Allow from 127.0.0.1
AuthType Basic
AuthName "ENTER YOUR NAME & PASSWORD TO LOGIN"
AuthUserFile /home/kusanagi/.htpasswd
Require valid-user
Satisfy any
:
:

※この設定の記載は KUSANAGI のバージョンによって変わる場合がありますので、ご了承ください。

この設定の中の Allow from all という部分が、全ての IP アドレスを許可するという設定になっていますので、この設定を削除やコメントアウトします。
その下に、Allow from (許可したい IP アドレス) と許可したい IP アドレスを設定します。
同時に、 Allow from 127.0.0.1 のコメントを外して、有効化しておきます。
なぜ、 127.0.0.1 の設定を有効化するかについては、上記の nginx の場合に 127.0.0.1 についての記載がありますので、そちらを参照してください。

変更するときは、2つのファイルとも同じ設定にしてください。

  • /home/kusanagi/(プロファイル名)/.htaccess
:
:
<Files wp-login.php>
        Order deny,allow
        Deny from all
        #Allow from all
        Allow from (許可したい IP アドレス)
        Allow from 127.0.0.1
        AuthType Basic
        AuthName "ENTER YOUR NAME & PASSWORD TO LOGIN"
        AuthUserFile /home/kusanagi/.htpasswd
        Require valid-user
        Satisfy any
</Files>
:
:
  • /home/kusanagi/(プロファイル名)/wp-admin/.htaccess
:
:
Order deny,allow
Deny from all
#Allow from all
Allow from (許可したい IP アドレス)
Allow from 127.0.0.1
AuthType Basic
AuthName "ENTER YOUR NAME & PASSWORD TO LOGIN"
AuthUserFile /home/kusanagi/.htpasswd
Require valid-user
Satisfy any
:
:

これで、指定の IP アドレスのみログイン画面の表示を許可され、指定した IP アドレス以外は Basic 認証が求められるようになりました。
nginx と同様に、まだ Basic 認証用のユーザーとパスワードを設定していない状態です。
上記の nginx の htpasswd コマンドを使用してユーザーとパスワードを /home/kusanagi/.htpasswd ファイルに設定している内容と、同じことを行ってください。

Apache httpd は nginx と違いサーバーのリロードを実行しなくても、即時 .htaccess ファイルの設定が反映されます。

まとめ

このように、KUSANAGI 9 を利用しているのであれば、簡単に WordPress のログイン画面に制限をかけることができます。
利用している方は、是非この設定を行って、より安全に WordPress の運用を行うことをおすすめします。

これからも KUSANAGI はセキュリティを意識したプロダクトを提供し続けます。

<< Microsoft Entra IDを使用して、AzureのLinux仮想マシンにサインインする小さなプラグインを作り、WordPressのXML-RPCを停止する方法 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解