nginxでBasic認証(パスワードによる認証)

[最終更新] 2016年12月5日

nginxでBasic認証を行います。ユーザー名とパスワードを入力させるアレです。パスワードファイルを作成し、nginxの設定ファイルでパスワードファイルの場所を指定します。

Basic認証について

Basic認証は、パスワード認証の一つです。ページにアクセスするとユーザー名とパスワードを求めるダイアログを表示させることができます。手順が簡単で、ほとんどすべてのブラウザで対応していることから、広く使われています。特にテストページの公開などでは役立つのではないでしょうか。

手順としては、ユーザー名と(暗号化した)パスワードを記述したパスワードファイルを作成し、nginxの設定ファイルでパスワードファイルを指定するだけです。とてもお手軽。内部的には、ngx_http_auth_basic_moduleを利用します。

パスワードファイルの作成

パスワードファイルの作成については、Apache互換の方法と、opensslコマンドを使った方法の2種類あります。前者はつまりhtpasswdコマンドを利用したものですが、nginxでApacheのツールを使うのも筋悪ですし、ここでは後者の方法を採用します。

まず、パスワードファイルの書式は以下です。

username:password
username:password:comment

コメントは必須ではありません。また、passwordは暗号化した文字列です(平文も可ですが当然非推奨)。暗号化した文字列の生成には、opensslコマンドを用います。たとえば、パスワードを1234とした場合(言うまでもなくこのパスワードは最低です)、コマンドは以下です。

openssl passwd 1234

この場合、パスワード1234がcrypt()により暗号化されます。デフォルトではcryptです。が、「NginxでBasic認証させる件 – Qiita」の記事によると、暗号化はcryptよりもMD5ベースのものがよいとされ、その場合は-apr1をオプションとして付記します。

実際、標準のcryptではパスワードが8文字以下しか使えないようで、8文字以上のパスワードを入力しても、以下の警告文が出て切り詰められてしまいます(参考「[.htpasswd] Basic認証パスワードを確認する方法と文字数制限の巻 – TrippyBoyの愉快な日々」)。

Warning: truncating password to 8 characters

これはちょっと危ないので、先の記事にならい-apr1オプションを使うことにします。

さて、パスワードファイルはどこに置いてもよいのですが、ここでは仮に/etc/nginx/hogehogeとします。hogeユーザーのパスワード1234を、パスワードファイルhogehogeに記述するには、以下のコマンドを実行します。

echo "hoge:$(openssl passwd  -apr1 1234)" | sudo tee -a /etc/nginx/hogehoge

hoge,1234,etc/nginx/hogehoge の各部分は適宜変更。teeコマンドは、パイプできた文字列を標準出力とファイルの両方に出力に出力するコマンドです。T分岐のイメージですね。-aは追記を意味します。もちろん、viなどで/etc/nginx/hogehogeを直接編集してもよいです。これで、パスワードファイルの作成は完了です。

このままだと履歴にパスワードが残って嫌な感じなので、私は~/.bash_historyより当該の履歴を削除します。

設定ファイル

次に、作成したパスワードファイルを、nginxが読み込むように設定します。/etc/nginx/nginx.confあるいは、includeした設定ファイルの、http、server、location、limit_exceptコンテキスト内に、auth_basicおよびauth_basic_user_fileディレクティブを記述します。

具体的に、www.example.comサーバー用の設定ファイル、/etc/nginx/conf.d/www.example.com.conf があると仮定すると、以下の様な記述になります。

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.com;
    index        index.html index.php;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    # たとえば以下のように記述します
    auth_basic                  "password_site";
    auth_basic_user_file        /etc/nginx/hogehoge;

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

認証をかけたい場所によって、auth_basicおよびauth_basic_user_fileディレクティブの記述する場所を適宜変更します。

ここまで終わったら、nginxで設定ファイルを再読み込みします。CentOS 7においては、systemdを使います。

sudo systemctl reload nginx.service

以上。

参考

書籍「nginx実践入門」を参考にしました。本書は、技術評論社のサイトから電子版を買うことも出来ます。一通りのことがわかりやすくまとまっている本です。

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です