WordPressのログイン画面に、Basic認証を導入しよう!

ニアです。

サーバーを移行してから、とある国からWordPressのログイン画面へのブルートフォースアタックで狙われています。(汗)

一応、ログイン試行回数を制限するプラグイン「Login Limit Attempts」を入れているのですが、その対策なのか1日おきに攻撃が来るので厄介です。

そこで今回は、WordPressのログインページにBasic認証を導入することにしました。

1. WordPressのログインページにBasic認証を導入しよう

ここではKUSANAGIのWordPressマシンにBasic認証を導入し、ログインページをパスワード保護していきます。

Webサーバーはnginx 1.10.0を使用しています。

1.1. .htpasswdの作成

まず、Basic認証に使用するID・パスワードを格納するファイル「.htpasswd」を作成します。

htpasswdコマンドを実行し、Basic認証で使用するパスワードを2回入力します。

# htpasswd -cs [ファイル名] [ユーザー名]
htpasswd -cs .htpasswd Nia
New password: [パスワード]
Re-type new password: [パスワード]
Adding password for user Nia

「-c」オプションを付けるとパスワードファイルの新規作成(存在する場合は上書き)し、「-s」オプションを付けるとパスワードをSHAでハッシュ化して保存します。

ちなみに、ファイルに保存する時のパスワードのハッシュ化オプションには以下4種類があります。

オプション 意味
-d パスワードをCRYPTでハッシュ化します(デフォルト)
-m パスワードをMD5でハッシュ化します
-s パスワードをSHA(SHA1)でハッシュ化します
-p パスワードを平文のままで保存します。

平文のままで保存するのはセキュリティの観点からおすすめしません。またCRYPTの場合、有効なパスワードは8文字以内という制約があります。

1.2. .htpasswdの配置とパーミッションの設定

.htpasswdファイルを作成したら、/home/kusanagiに配置します。

mv .htpasswd /home/kusanagi/

※カレントディレクトリを/home/kusanagiに移動してから、.htpasswdファイルを作成するのも手です。

また、.htpasswdファイルの所有者を「kusanagi」、グループを「www」に設定し、パーミッションは644に設定します(外部からは読み取りのみを許可します)。

chown kusanagi:www .htpasswd
chmod 644 .htpasswd

1.3. 設定ファイルの編集

.htpasswdファイルを配置したら、今度はnginxの設定ファイルを編集します。

/etc/nginx/conf.dにある「[プロファイル名]_http.conf」を開きます。

wp-login.php」があるlocationブロック内の「allow 0.0.0.0/0;」をコメントアウトします。

※「0.0.0.0/0」はすべてのIPアドレスとマッチします。

location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {

	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";

	location ~ [^/]\.php(/|$) {
		# ...
	}
}

設定ファイルを保存します。サイトがSSLに対応している場合、[プロファイル名]_ssl.confも同様に編集します。

nginxを再起動します。

systemctl restart nginx

WordPressのログインページにアクセスしようとすると、Basic認証のダイアログが現れます。

basic-auth

Microsoft Edgeでの認証画面

Basic認証で登録したユーザー名とパスワードを入力すると、ログインページにアクセスすることができます。

正しいユーザー名とパスワードを入力しなかった場合、HTTPのステータスコードは200(OK)ではなく、401(Authorization Required )となります。

1.3. 特定のIPからアクセスする時に、Basic認証をスキップさせてみよう

1.2.の設定ファイルの内容では、ログイン画面だけでなく、管理画面にアクセスする時にもBasic認証を求められます。ブラウザを起動するたびにユーザー名とパスワードを入力するのは面倒なので、自分のPCのネットワークのIPアドレスからアクセスする時はBasic認証をスキップさせるようにしてみましょう。

「[プロファイル名]_http.conf」を編集します。(サイトがSSLに対応している場合、[プロファイル名]_ssl.confも編集します。)

deny all;」の前に、「allow 自分のPCのネットワークのIPアドレス」を入れます。

location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
<span id="mce_8_start" style="overflow:hidden;line-height:0px" data-mce-style="overflow:hidden;line-height:0px" data-mce-type="bookmark"></span>
	satisfy any;
	#allow 0.0.0.0/0;
	allow 127.0.0.1;
	allow xxx.xxx.xxx.xxx;  # 自分のPCのネットワークのIPアドレス
	deny all;
	auth_basic "basic authentication";
	auth_basic_user_file  "/home/kusanagi/.htpasswd";

	location ~ [^/]\.php(/|$) {
		# ...
	}
}

satisfy any」とは、「IPアドレスの制御」と「パスワード認証」のいずれか一方を満たせばアクセスを許可するという意味です。

こうすることで、自分のPCのネットワークのIPアドレスからログインページや管理画面に、Basic認証をスキップしてアクセスすることができます。

2. phpMyAdminにもBasic認証を導入しよう

KUSANAGI+nginxでphpMyAdminを使いたいです!」で導入した、phpMyAdminへのアクセスにもBasic認証を導入して、自分のPCのネットワークのIPアドレス以外からはBasic認証を要求するようにしてみましょう。

# http://[ホスト名]/phpMyAdmin/ 内のファイルに対する処理を行います。
location ^~ /phpMyAdmin/ {
	alias /usr/share/phpMyAdmin/;
	try_files $uri $uri/ /index.php;
	satisfy any;
	allow 127.0.0.1;
	allow xxx.xxx.xxx.xxx; # 自分のPCのネットワークのIPアドレス
	deny all;
	# Basic認証を追加します。
	auth_basic "basic authentication";
	auth_basic_user_file  "/home/kusanagi/.htpasswd";

	# http://[ホスト名]/phpMyAdmin/ 内のphpファイルに対する処理を行います。
	location ~ /phpMyAdmin(.+\.php)$ {
		fastcgi_pass    127.0.0.1:9000;
		fastcgi_index   index.php;
		fastcgi_param   SCRIPT_FILENAME  /usr/share/phpMyAdmin$1;
		include         fastcgi_params;
		fastcgi_buffers 256 128k;
		fastcgi_buffer_size 128k;
		fastcgi_intercept_errors on;
		fastcgi_read_timeout 120s;
	}
}

3. おわりに

今回は、WordPressのログインページとphpMyAdminにBasic認証を導入しました。

Basic認証はあくまで玄関の補助鍵のような役割なので、WordPress側のパスワードは強固なものに設定して置くことが大切ですね。

それでは、See you next!

【追記】ブルートフォースアタックによるターゲットはwp-login.phpだけだと思った?

という時期が私にもありました。⇒ ブルートフォースアタックで狙われていたのは、実は○○○○○○.phpだった件

コメント

タイトルとURLをコピーしました