Webシステムに簡易的なユーザー認証を設定する方法として、Basic認証はアプリケーション本体と切り離して簡単に導入できるためとても便利です。特に開発中のシステムをデモ目的等で一時的に公開したい場合や、少人数で利用する小さなシステムに認証を設定したい場合に有効だと思います。
.htpasswdファイルの作成
.htpasswdファイルはユーザー名とパスワードの組み合わせを保存するファイルになります。ファイル名は慣習的に.htpasswdという名前にすることが多いですが、必ずしもそうする必要性はありません。
.htpasswdファイルを作成するには、Linux上ではhtpasswdコマンドを利用するのが便利です。Ubuntuにおいてhtpasswdコマンドが利用できない場合は、apache2-utilsライブラリをインストールするのが良いと思います。
$ sudo apt install apache2-utils
htpasswdコマンドが利用できるようになったら、次のコマンドで.htpasswdファイルを作成します。
$ sudo htpasswd -c /etc/nginx/.htpasswd <username>
cオプションでファイルの出力先を指定します。Nginxの実行ユーザーがアクセスできればどこでも大丈夫ですが、Nginxの設定フォルダかアプリケーションの設置フォルダに配置するのが良いと思います。Webからアクセスできないように注意しましょう。
<username>の部分には、作成したいユーザー名を指定します。
上記のコマンドを入力すると、次のようなプロンプトが表示されますので、設定したいパスワードを入力してエンターを押してください。以上で.htpasswdファイルの完成です。
New password:
Re-type new password:
Nginxの設定
.htpasswdファイルができたら、Nginxの設定ファイルにそのファイルを指定します。Basic認証を指定したいパスのlocationディレクティブに次の設定を追加します。
server {
...
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
auth_basicには認証ダイアログに表示させたい文字列を指定します。(ただ、最新のブラウザでは、ここに設定しても表示されないようになってしまったように思われます。)auth_basic_user_fileには先ほど作成した.htpasswdファイルのパスを指定します。
最後にNginxの設定をリロードすれば設定が適用されます。
$ sudo systemctl reload nginx
SSLで利用するよう注意
Basic認証のダイアログで入力されたユーザー名とパスワードは、コロン「:」で連結された後、Base64でエンコードされてサーバーに送られます。デコードすれば簡単にパスワードが見られてしまうため、非SSL(https://ではない)のWebサーバーでは、特別に通信が秘匿される手段が用意されている場合を除いて、利用しないようにしましょう。