nginxでBasic認証を行うには?

メモ:

nginxでBasic認証を行うことができるよう、auth_basicディレクティブ,auth_basic_user_fileディレクティブやパスワードファイルの生成方法について確認していきます。

Basic認証を行うための設定

nginxでは、「HTTP Basic Authentication」 プロトコルを用いた、ユーザ名とパスワードによるアクセス制御がhttp_auth_basic_moduleで提供されています。

Basic認証を行うには、auth_basicディレクティブとauth_basic_user_fileディレクティブを使って次のように設定します。

location / {
    auth_basic           "Restricted area";
    auth_basic_user_file  /path/to/.htpasswd;
}

auth_basicディレクティブは、Basic認証をこのコンテキストで行うことを示しており、http, server, location, limit_except コンテキストで設定することができます。auth_basicは継承されるため、auth_basicディレクティブに off と指定することで、継承を打ち消す事ができます。 auth_basicディレクティブに設定する値は、realm 名になります。

auth_basic    realm名 又は off;

auth_basic_user_file ディレクティブは、ユーザ名とパスワードが入ったファイルの場所を設定します。auth_basic_user_file ディレクティブの書式とパスワードファイルの形式は、次のフォーマットとなります。

auth_basic_user_file    パスワードファイルのパス;
# comment
ユーザ名1:password1
ユーザ名2:password2:コメント
...

ただし、nginx自体にはパスワード生成ツールが付属していないので、別途 htpasswd コマンドなどを利用してファイルを作成します。

http_auth_basic_moduleで使用可能なパスワードには、次のものがあります。

  1. Apacheの htpasswd コマンドや、OpenSSL の openssl passwd コマンド などで作った crypt() 関数由来のパスワード。
  2. MD5 に基づいたapr1アルゴリズムでハッシュ化されたパスワード。
  3. その他、PLAIN, SHA, SSHA などのパスワードに対応していますが、PLAINやSHA-1は、使用しないようにとドキュメントに書かれています。

パスワードファイルの作り方

nginx自体にはパスワード生成ツールが付属していないので、パスワードファイルを生成することができるツールを使って生成します。例えば、ユーザ名が foo でパスワードが bar のパスワードファイルを作ってみます。

opensslコマンドを使ったパスワードファイルの作り方

OpenSSLが入っている場合、次のコマンドでパスワードファイルを生成することができます。

$ sudo echo "foo:$openssl passwd -crypt bar)" > /path/to/.htpasswd

また、apr1アルゴリズムの場合は、次のコマンドでパスワードファイルを生成することができます。

$ sudo echo "foo:$(openssl passwd -apr1 bar)" > /path/to/.htpasswd

Apatchのhtpasswdコマンドを使ったパスワードファイルの作り方

htpasswdコマンドを利用するためにhttpd-toolsのインストールから。

$ sudo yum -y install httpd-tools

htpasswdコマンドを使ってパスワードファイルを生成することができます。

$ sudo htpasswd -c /path/to/.htpasswd foo
New password: bar(パスワードを入力)
Re-type new password: bar(パスワードを入力)

以上でnginxでのBasic認証が実現できます。