BASIC認証でログイン画面を守る

2017年6月2日

WordPressのインストールの際、不正ログイン検出用に狂骨というプラグインを入れましたが、そもそもログイン画面にアクセスできないようにした方がより安全ですね。

不正アクセスが多い

レンタルサーバーからVPSに移行した当初、とにかくWordPressへのログインアタックが多かった。ロシアとかウクライナとか。。。

はじめはOS側のファイヤーウォールで怪しいIPアドレスをブロックしていたんですが、奴らどんどんアドレスを変えてアタックしてくるからキリがない。

こんな感じでどんだけだよっ!ってくらいログインを試みてきます。

ウクライナ美女からの猛烈アタック

ウクライナ美女からの猛烈なアタック。

で、考え方を変えました。

BASIC認証を設置する

ログインスクリーンにたどり着く前に認証画面を置くだけで、WordPressへのアタックはぴたりと止まります。

BASIC認証画面

BASIC認証に失敗すると404ページへ転送されるので、それ以上攻撃してこなくなるようです。

以来、狂骨に不正アクセスログが記録された記憶がありません。ただnginxのアクセスログにはwp-login.phpへのアクセスが毎日あるので、アタックがなくなっているわけじゃないですね。

とはいえアタック回数は激減しました。

nginxのBASIC認証

nginxでwp-login.phpにBASIC認証をかけるためには該当するserverブロックのアクセスルールの初めのほうにwp-login.phpのブロックを置きます。(前方一致ルールよりも後に置いてもルールが適用されないので)

ブロック内の最初の2行(auth_basicで始まるもの)がBASIC認証の適用指示になります。auth_basic_user_fileで指定したパスの.htpasswdファイル内に設定されたユーザー名とパスワードの組み合わせと一致した場合のみwp-login.phpにアクセスできるようになります。

location = /wp-login.php {
    auth_basic "Restricted";
    auth_basic_user_file /home/user/.htpasswd;
    fastcgi_pass unix:/var/run/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /usr/local/www/junkworks/$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param HTTPS on;
}

.htpasswdファイルはhtpasswdコマンドで作成します。

$ sudo htpasswd -c /home/user/.htpasswd username
New password: 
Re-type new password: 
Adding password for user username
$ cat /home/user/.htpasswd
username:$apr1$4.YRQj2L$6ozFytV1ChVlEvkGL5oDL.

BASIC認証のログインユーザー名はnginxのログに残るので、毎日ログチェックをすることでBASIC認証が破られていないかがわかります。

たったこれだけのことでWordPressへのログインアタックはかなり防ぐことができますよ。