PR

NginxにBasic(ベーシック)認証を設定する方法

「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.

コメント

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