WordPress の管理画面に制限をかける – Security Edition 編

片倉洋一

以前、「 WordPress のログイン画面に制限をかける」というコラムでセキュリティ対策強化の方法を紹介しましたが、 KUSANAGI Security Edition ではそのセキュリティ強化が、「 kusanagi accesslimit 」コマンドで簡単に行えるようになっていますので、ご紹介いたします。

そもそも、 WordPress のログイン画面に制限をかける事でどういう対策が行われるか、という点につきましては拙文ではありますが、以下の記事を参照していただけますと幸いです。

WordPress のログイン画面に制限をかける – KUSANAGI Tech Column

それと、最新の KUSANAGI ( Security Edition 以外も含めて)ではデフォルトで、WordPress の管理画面に 127.0.0.1 以外の IP アドレス制限と Basic 認証による制限がかけられています。

注意点ですが、「 kusanagi accesslimit 」コマンドは nginx の環境でのみ利用可能となっています。

kusanagi accesslimit on で管理画面などに制限をかける

kusanagi accesslimit on を実行することで WordPress の管理画面などに IP アドレスの制限か Basic 認証による制限をかけられます。

IP アドレスを指定して WordPress 管理画面へのアクセスを許可する

それでは早速、kusanagi accesslimit on を利用して WordPress の管理画面に制限をかけてみましょう。

# kusanagi accesslimit on --allow 127.0.0.1 kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
-     satisfy any;
?              ^^
+     satisfy all;
?              ^^
      allow 127.0.0.1;
      deny all;
-     auth_basic "basic authentication";
-     auth_basic_user_file "/home/kusanagi/.htpasswd";

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

こちらの結果は、対象の KUSANAGI プロファイルの WordPress の管理画面に対して IP アドレス制限として 127.0.0.1 を許可、つまり反対に言えば 127.0.0.1 以外は拒否されることになります。
Basic 認証による制限は無効化されました。

更にもう一度、同じコマンドを使用して別の IP アドレスを指定してみましょう。

# kusanagi accesslimit on --allow 183.90.XXX.XXX kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
      satisfy all;
-     allow 127.0.0.1;
+     allow 183.90.XXX.XXX;
      deny all;

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

結果は別の IP アドレスのみが許可対象となり、先ほど指定した 127.0.0.1 は無効となりました。
このように、指定した情報で常に上書きする状態になりますので、追加したい場合は --allow 127.0.0.1,183.90.XXX.XXX というようにカンマ区切りで複数指定してください。

なお、 IP アドレスの指定については通常の全て指定する表記のほかに、 CIDR 表記も使用できます。
ある程度 IP アドレスの範囲が定められているのであれば、そちらの方が利便性が高いと思われます。

# kusanagi accesslimit on --allow 127.0.0.1,183.90.XXX.0/24 kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
      satisfy all;
+     allow 127.0.0.1;
-     allow 183.90.XXX.XXX;
?                      ^^^
+     allow 183.90.XXX.0/24;
?                      ^^^^
      deny all;

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

しかし、もっと多くの IP アドレスを指定する場合に、この方法では少し不便です。
そのために、 --allowfile というオプションでファイルからの入力も可能になっています。
例えば、以下のようなファイルを用意します。

127.0.0.1
::1
183.90.XXX.0/24
202.181.XXX.0/24

ファイルを作成する注意点は以下になります。

  • 1行に1 IP アドレスを記載する(カンマ区切りではない)
  • 空行が含まれるとエラーとなってしまうので、最後の行も空行にしないようにする

そして、その作成したファイルを --allowfile オプションで指定します。

# kusanagi accesslimit on --allowfile allow_ipaddresses.txt kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
      satisfy all;
      allow 127.0.0.1;
+     allow ::1;
      allow 183.90.XXX.0/24;
+     allow 202.181.XXX.0/24;
      deny all;

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

このように、ファイルに記載された IP アドレスが設定されます。
多くの IP アドレスを指定する場合には、このファイル入力形式を利用してみてください。

IP アドレスを指定して WordPress 管理画面へのアクセスを拒否する

ここまでは、 --allow --allowfile オプションについて記載してきました。
この2つのオプションは、許可する IP アドレスを指定するオプションで、その反対に IP アドレスを指定して拒否をしたい場合は、 --deny--denyfile を使用してください。
IP アドレスの指定方法は --allow, --allowfile と同様です。

# kusanagi accesslimit on --deny 161.142.XXX.XXX kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
-     satisfy any;
?              ^^
+     satisfy all;
?              ^^
+     deny 161.142.XXX.XXX;
+     allow all;
-     allow 127.0.0.1;
-     deny all;
-     auth_basic "basic authentication";
-     auth_basic_user_file "/home/kusanagi/.htpasswd";

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

WordPress 管理画面に対して Basic 認証による制限をかける

次は WordPress の管理画面に対して Basic 認証による制限をかける方法を記載します。
まずは、 htpasswd コマンドを使用するなどして Basic 認証用のファイルを作成します。
作成する際には、ファイルの権限が 644 になるようにしてください。

# htpasswd -c /home/kusanagi/test_htpasswd test_user
New password:
Re-type new password:
Adding password for user test_user
# chmod 644 /home/kusanagi/test_htpasswd
#

その後、作成したファイルを --basicauthfile オプションを使用して指定します。

# kusanagi accesslimit on --basicauthfile /home/kusanagi/test_htpasswd kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
      satisfy any;
      allow 127.0.0.1;
      deny all;
      auth_basic "basic authentication";
-     auth_basic_user_file "/home/kusanagi/.htpasswd";
?                                          ^
+     auth_basic_user_file "/home/kusanagi/test_htpasswd";
?                                          ^^^^^

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

これで、 WordPress の管理画面に指定した Basic 認証用のファイルで Basic 認証をかける事ができます。

なお、 --allow, --allowfile, --deny, --denyfile, --basicauthfile のオプションは同時に指定することはできません。
そのため、このコマンドを使用して IP アドレスによる許可と拒否を同時に設定することや、 IP アドレスによる許可と Basic 認証による制限を同時に設定することはできません。
--allow, --allowfile, --deny, --denyfile, --basicauthfile のオプションを使用すると、今まで設定された制限は削除されますので、その点はご注意ください。

ドキュメントルートに制限をかける

今までは全て WordPress の管理画面に対して制限をかける内容でした。
事情があって(例えば公開前のサイトでまだ一般に公開しくないなどの理由により)サイト全体に制限をかけたい場合は、 --documentroot オプションを使用します。

# kusanagi accesslimit on --documentroot --allow 127.0.0.1 kusanagi_html
Updated access limit to DocumentRoot:
----------------------------------------
  # WordPress template
  # vim: ft=conf et sw=4
  index index.php index.html index.htm;

  #include conf.d/wp-multisite.inc;
  #include conf.d/wp-plugins.inc;

  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

+ satisfy all;
+ allow 127.0.0.1;
+ deny all;
+
----------------------------------------
nginx: the configuration file /etc/opt/kusanagi/nginx127/nginx.conf syntax is ok
nginx: configuration file /etc/opt/kusanagi/nginx127/nginx.conf test is successful
accesslimit completed.
#

これにより、指定の KUSANAGI プロファイルのドキュメントルートに対して、 IP アドレスの制限をかけたことになります。
--allow, --allowfile, --deny, --denyfile, --basicauthfile による指定の内容は、今まで記載した内容と同様です。

なお、 --documentroot を指定しなかった場合は、自動的に WordPress の管理画面に対しての制限となりますが、それは --adminpage オプションを使用しているのと同じことになります。
それは、 --adminpage, --documentroot のどちらも指定しなかった場合はデフォルトで --adminpage オプションが使用されることになっているためです。

もう1つ注意点として、 --adminpage, --documentroot の設定はそれぞれ独立していますので、両方設定することが可能です。

kusanagi accesslimit off で管理画面などの制限を解除する

kusanagi accesslimit off を実行することで、 kusanagi accesslimit on でかけた WordPress の管理画面などに対する制限を解除できます。

WordPress 管理画面の制限を解除する

それでは、 kusanagi accesslimit off を実行してみましょう。

# kusanagi accesslimit off kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
-     satisfy any;
-     allow 127.0.0.1;
-     deny all;
-     auth_basic "basic authentication";
-     auth_basic_user_file "/home/kusanagi/.htpasswd";

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

結果として、対象の KUSANGI プロファイルの WordPress の管理画面の IP アドレスおよび Basic 認証の制限が解除されました。
kusanagi accesslimit off では、 IP アドレスと Basic 認証の両方の制限が解除されるので注意してください。

kusanagi accesslimit on と同じようにオプションを指定しないと、デフォルトで --adminpage オプションが指定されたのと同じこととなり、 WordPress の管理画面に対しての操作となります。

ドキュメントルートの制限を解除する

ドキュメントルートの制限を解除したい場合は、 kusanagi accesslimit on と同様でオプションに --documentroot を指定してください。

# kusanagi accesslimit off --documentroot  kusanagi_html
Updated access limit to DocumentRoot:
----------------------------------------
  # WordPress template
  # vim: ft=conf et sw=4
  index index.php index.html index.htm;

  #include conf.d/wp-multisite.inc;
  #include conf.d/wp-plugins.inc;

  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

- satisfy all;
- allow 127.0.0.1;
- deny all;
-
----------------------------------------
nginx: the configuration file /etc/opt/kusanagi/nginx127/nginx.conf syntax is ok
nginx: configuration file /etc/opt/kusanagi/nginx127/nginx.conf test is successful
accesslimit completed.
#

これにより、ドキュメントルートに対する IP アドレスおよび Basic 認証の制限が解除されます。

kusanagi accesslimit reset で管理画面などの制限を初期状態に戻す

kusanagi accesslimit reset は、 kusanagi accesslimit onoff で操作した制限の設定を初期状態に戻します。

WordPress 管理画面の制限を初期状態に戻す

それでは、 kusanagi accesslimit reset を実行してみましょう。

# kusanagi accesslimit reset kusanagi_html
Updated access limit to admin page:
----------------------------------------
  location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
+     satisfy any;
+     allow 127.0.0.1;
+     deny all;
+     auth_basic "basic authentication";
+     auth_basic_user_file "/home/kusanagi/.htpasswd";

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

これは、 kusanagi accesslimit off により制限が解除されていた設定を、元の設定に戻しています。
こちらも今までと同じように、オプションを指定しないと --adminpage オプションが指定されたのと同じ状態になります。

冒頭でも記載しましたが、最新の KUSANAGI では nginx の設定に対してあらかじめ、以下の設定がなされています。

location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
    satisfy any;
    allow 127.0.0.1;
    deny all;
    auth_basic "basic authentication";
    auth_basic_user_file "/home/kusanagi/.htpasswd";

この設定の内容は以下の通りです。

  • IP アドレスが 127.0.0.1 ( localhost )のアクセスは許可
  • 上記以外の IP アドレスのアクセスは拒否
    • 拒否された場合は /home/kusanagi/.htpasswd の内容に基づいた Basic 認証を求める

WordPress の管理画面に対して、 kusanagi accesslimit reset を実行した場合は、 kusanagi accesslimit on / off の設定を破棄し、上記の内容を復元することになります。

ドキュメントルートの制限を初期状態に戻す

ドキュメントルートの制限を初期状態に戻したい場合は、今までと同様でオプションに --documentroot を指定してください。

# kusanagi accesslimit reset --documentroot kusanagi_html
Updated access limit to DocumentRoot:
----------------------------------------
  # WordPress template
  # vim: ft=conf et sw=4
  index index.php index.html index.htm;

  #include conf.d/wp-multisite.inc;
  #include conf.d/wp-plugins.inc;

  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

- satisfy all;
- allow 127.0.0.1;
- deny all;
-
----------------------------------------
nginx: the configuration file /etc/opt/kusanagi/nginx127/nginx.conf syntax is ok
nginx: configuration file /etc/opt/kusanagi/nginx127/nginx.conf test is successful
accesslimit completed.
#

2025年6月現在の KUSANAGI では、初期状態でドキュメントルートに対して制限をかけていないため、結果としては kusanagi accesslimit off --documentroot と同じで、制限の解除となります。

kusanagi accesslimit status で管理画面などの制限を確認する

最後に kusanagi accesslimit status を紹介します。
こちらは、 WordPress の管理画面かドキュメントルートの制限の設定を確認するコマンドです。

WordPress 管理画面の制限を確認する

それでは、 kusanagi accesslimit status を実行してみましょう。

# kusanagi accesslimit status kusanagi_html
Access to admin page is limited.
----------------------------------------
location ~* /wp-login\.php$|/wp-admin/((?!(admin-ajax\.php|css/|images/|js/)).)*$ {
    satisfy any;
    allow 127.0.0.1;
    deny all;
    auth_basic "basic authentication";
    auth_basic_user_file "/home/kusanagi/.htpasswd";

----------------------------------------
accesslimit completed.
#

このように、 現在の nginx の設定内にある WordPress 管理画面に対する制限の設定が表示されます。
ちなみに、表示されている内容は KUSANAGI の初期設定の状態です。

繰り返しになりますが、オプションを指定しないと --adminpage オプションが指定されたのと同じ状態になります。

ドキュメントルートの制限を確認する

ドキュメントルートの制限を確認したい場合は、今までと同様でオプションに --documentroot を指定してください。

# kusanagi accesslimit status --documentroot kusanagi_html
Access to DocumentRoot is limited.
----------------------------------------
# WordPress template
# vim: ft=conf et sw=4
index index.php index.html index.htm;

#include conf.d/wp-multisite.inc;
#include conf.d/wp-plugins.inc;

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

satisfy all;
allow 127.0.0.1;
deny all;

----------------------------------------
accesslimit completed.
#

今度は nginx の設定内のドキュメントルートに対する制限の内容が表示されます。
今回表示されている内容は、 kusanagi accesslimit on --documentroot --allow 127.0.0.1 kusanagi_html を実行した際の設定内容になっています。

以上で、 KUSANAGI Security Edition で追加された kusanagi accesslimit の機能の紹介となります。

WordPress の管理画面に対して制限をかけたいが、設定の書き方がよく分からずに二の足を踏んでいた方も、 KUSANAGI Security Edition ではコマンドで簡単に設定できるようになっています。
KUSANAGI Security Edition ではウイルス対策などの内部的なセキュリティの強化だけでなく、今回の kusanagi accesslimit のような、ユーザーに簡単にセキュリティ対策が行えるようなコマンドも用意してあります。

新しいサイトを構築を考えている方は、是非、 KUSANAGI Security Edition の導入を検討してみてはいかがでしょうか。

<< kusanagi antivirus でマルウェア・ウイルス対策を行う

関連記事

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

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

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

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

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