「Ubuntu」にインストールされている「Nginx」にBasic(ベーシック)認証を設定する方法です。
apache2-utilsインストール
Basic認証に使用するパスワードファイルを作成する際に、「htpasswd」というコマンドを使用します。
「Ubuntu」では「apache2-utils」というパッケージに含まれているので、「apt」を使ってインストールします。
$ sudo apt update $ sudo apt install apache2-utils
これで、「htpasswd」コマンドを使用することが出来るようになりました。
Basic認証用パスワードファイル作成
Basic認証用のパスワードファイルを新規で作成する場合は「-c」オプションを指定して「htpasswd」コマンドを実行します。
$ htpasswd -c パスワードファイル ユーザ名
パスワードファイルを作成するディレクトリのパーミッションによっては、「sudo」が必要になる場合もあります。
作成例
実際にBasic認証用のパスワードファイルを下記の内容で作成してみます。
- パスワードファイル: /etc/nginx/.htpasswd
- ユーザ: tamohiko
$ sudo htpasswd -c /etc/nginx/.htpasswd tamohiko New password: Re-type new password: Adding password for user tamohiko
作成されたパスワードファイルの内容です。(一部マスクしています)
$ cat /etc/nginx/.htpasswd tamohiko:$apr1$pMqjjfuu$XXXXXFPxRvE97eWIukoIL.
パスワードファイルのパーミッション
「htpasswd」コマンドを使用してパスワードファイルを作成している場合は、下記のようにパーミッションは「644(rw-r--r--)」に設定されていると思います。
$ ls -la /etc/nginx/.htpasswd -rw-r--r-- 1 root root 47 Feb 25 17:15 /etc/nginx/.htpasswd
「htpasswd」コマンド以外の方法でパスワードファイルを作成した場合は、パーミッションの確認と設定も忘れずに行ってください。
Nginx設定
Basic認証を設定したい「location」に下記の設定を行います。
location ディレクトリ { auth_basic "認証ダイアログに表示するメッセージ"; auth_basic_user_file パスワードファイル; }
※「auth_basic」にメッセージを設定しても最近のWebブラウザ(Chrome,Edge,Firefox)では、セキュリティ上の理由から設定されているメッセージを、認証ダイアログで表示をしなくなりました。
設定例
「http://blog.server-memo.net/secret/」にアクセスした際にBasic認証が行われる設定例となります。
赤字の部分がBasic認証に関する設定です。
server {
listen 80;
server_name blog.server-memo.net;
root /usr/share/nginx/blog;
index index.html;
location /secret {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
設定反映
設定が完了したら「nginx -t」で設定ファイルの文法に間違いがないかを確認します。
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
問題がなければ「nginx」を再起動して設定を反映させます。
$ sudo systemctl restart nginx
動作確認
WebブラウザでBasic認証を設定したURLにアクセスして、認証ダイアログが表示されることを確認してください。
その後、設定したユーザとパスワードを入力して、認証が成功するかの確認を行ってください。
パスワードファイルの作成場所と名前について
Basic認証に使用するパスワードファイルの作成場所と名前について説明します。
作成場所
パスワードファイルは、セキュリティを考慮して外部からアクセスすることが出来ない、Webサイトの公開ディレクトリ外に配置することを推奨します。
どうしても置く必要がある場合は、Nginxの設定で下記のようにパスワードファイルへのアクセスを禁止する設定を行ってください。
設定例
下記の例は、「.ht」で始まるファイルへのアクセスを禁止する設定例となります。
location ~ /\.ht { deny all; }
パスワードファイルが「/usr/share/nginx/blog/secret/.htpasswd」であった場合の設定例は下記のようになります。
server { listen 80; server_name blog.server-memo.net; root /usr/share/nginx/blog; index index.html; location ~ /\.ht { deny all; } location /secret { auth_basic "Restricted"; auth_basic_user_file /usr/share/nginx/blog/secret/.htpasswd; } }
「nginx -t」で設定の書式に問題が無いかを確認します。
$ sudo nginx -t
Nginxを再起動して設定を反映させます。
$ sudo systemctl restart nginx
動作確認
実際にWebブラウザで「.htpasswd」ファイルにアクセスして、「403 Forbidden」になるかの確認を行ってください。
設定がうまく行っていない場合は、「.htpasswd」ファイルがダウンロードされてきます。
パスワードファイル名
Basic認証のパスワードファイルの名前は「.htpasswd」が一般的ですが、それ以外でも問題ありません。
複数のlocationで異なるパスワードファイルを使用する場合や、複数のドメインを管理している場合は、ファイル名にドメイン名やlocation名を含めると、管理が容易になります。
- .htpasswd_ドメイン名
- .htpasswd_location名
下記のように「/secret」と「/himitsu」といった「location」ごとに異なるパスワードファイルを使用したい場合に、パスワードファイルの名前を下記のように設定すると管理も楽になります。
- /secret用: .htpasswd_secret
- /himitsu用: .htpasswd_himitsu
server { listen 80; server_name blog.server-memo.net; root /usr/share/nginx/blog; index index.html; location /secret { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd_secret; } location /himitsu { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd_himitsu; } location ~ /\. { deny all; } }
認証情報(ユーザ)の追加と削除方法
作成したパスワードファイルに、認証情報を追加・削除する方法について説明します。
追加方法
既存のパスワードファイルに認証情報追加する場合は、下記のように「-c」オプションを使用せずに「htpasswd」コマンドを実行します。
htpasswd パスワードファイル 追加ユーザ
実際に「tamotamo」というユーザの認証情報を追加してみます。
$ sudo htpasswd /etc/nginx/.htpasswd tamotamo New password: Re-type new password: Adding password for user tamotamo
パスワードファイルの内容を確認すると、先程追加したユーザの情報が追加されていました。
$ cat /etc/nginx/.htpasswd tamohiko:$apr1$pMqjjfuu$XXXXXFPxRvE97eWIukoIL. tamotamo:$apr1$qSvL.ub3$XXXXXTo/h8T5/yZ/a2L2M.
削除方法
パスワードファイルに登録されている認証情報を削除する場合は、「-D」オプションを使用します。
htpasswd -D パスワードファイル 削除ユーザ
実際に「tamotamo」ユーザの認証情報を削除してみます。
$ sudo htpasswd -D /etc/nginx/.htpasswd tamotamo Deleting password for user tamotamo
パスワードファイルを確認すると、「tamotamo」ユーザの認証情報が削除されていることが確認できます。
$ cat /etc/nginx/.htpasswd tamohiko:$apr1$pMqjjfuu$XXXXXFPxRvE97eWIukoIL.
コメント