nginxでBasic認証を設定する

  • nginx
  • Linux
  • Shell

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

nginxでBasic認証をかける手順のメモ。

htpasswdコマンドをインストールする

htpasswd はApacheのパッケージに含まれてるので、ディストリごとに入れるパッケージが違う。

Debian / Ubuntu系:

sudo apt-get install -y apache2-utils

RHEL / CentOS / Amazon Linux系:

sudo yum install -y httpd-tools

htpasswdファイルを作る

htpasswd コマンドがあるならそれを使うのが早い。

sudo htpasswd -c /path/to/htpasswd <username>

-c は新規作成のオプションなので、2人目以降のユーザーを追加するときは外す。付けたままだとファイルが上書きされるらしい(未確認)。

htpasswd コマンドが無い環境なら openssl で代用できる。

echo "<username>:$(openssl passwd -apr1 パスワード)" | sudo tee /path/to/htpasswd > /dev/null

sudo echo ... > /path/to/htpasswd のように書くと、sudo が効くのは echo だけでリダイレクトは元の権限で実行されるため、書き込み先次第でPermission deniedになる。tee に渡す形にすればそこは回避できる。あと openssl passwd は平文パスワードが引数に残るので、シェルのhistoryに出したくない場合は対話式の方法を探した方がいい。

nginxの設定

server に直接書けば、その配下すべてに認証がかかる。

server {
auth_basic "Auth";
auth_basic_user_file /path/to/htpasswd;
}

location単位で認証を分けたい場合

auth_basic / auth_basic_user_file は http / server / location / limit_except のどのコンテキストにも書ける。子コンテキストで何も指定しなければ、親の設定をそのまま継承する。

例えば server レベルで認証をかけた上で、特定の location だけ外したい場合は明示的に off にする必要がある。

server {
auth_basic "Auth";
auth_basic_user_file /path/to/htpasswd;
location /public/ {
auth_basic off;
}
}

逆に「GET以外のメソッドだけ認証をかけたい」ような場合は、server レベルの auth_basic を切った上で limit_except 側に書く。

server {
location /himitsu/ {
limit_except GET {
auth_basic "Auth";
auth_basic_user_file /path/to/htpasswd;
}
}
}