ユーザーファイルを作成する
ユーザーファイルとはユーザー名と暗号化されたパスワード1群。
Apacheで言うところの.htpasswdにあたります。
# comment
ユーザー名1:暗号化されたパスワード1
ユーザー名2:暗号化されたパスワード2:comment
ユーザー名3:暗号化されたパスワード3
フォーマットもこの通りほぼ同じ。
パスワードの暗号化ですが、この節ではopensslがインストールされている事を前提にして手順を記載してます。
Apacheのhtpasswdを使ってもかまいませんが、わざわざそれをインストールする手間が省けます。
sudo sh -c "echo -n 'ユーザー名:$(openssl passwd -apr1 パスワード)' > '/usr/share/nginx/html/.htpasswd'"
# sudo不要&追記するなら
echo "ユーザー名:$(openssl passwd -apr1 パスワード)" >> "/usr/share/nginx/html/.htpasswd"
これで/path/to/htpasswd/hogeが作成されました。もちろんファイルパスはダミーですので適当に変えて使いましょう。
後はユーザーファイルの所有者やパーミッション2を適切に設定しておくとよいです。
nginx.conf或いは任意の設定ファイルに記載されてるuser <ユーザー> [グループ];と同じ所有者にする必要があります3。
sudo chown ユーザー:グループ /path/to/htpasswd/hoge && sudo chmod 400 /path/to/htpasswd/hoge
所有者やパーミッションが合っていないとステータス500を返してきます2。
あまりよろしくは無いですがパブリックディレクトリにユーザーファイルを置く場合はアクセスを排除するようにもしておきましょう。通常パブリックディレクトリにこのファイルを設置する必要はありません。
http {
server {
location ~ /\.ht {
deny all;
}
}
}
設定する
nginx.confか、あるいはinclude先でも。
# (省略)
http {
#auth_basic "closed site";
#auth_basic_user_file /path/to/htpasswd/hoge;
server {
auth_basic "closed site";
auth_basic_user_file /path/to/htpasswd/hoge;
location /himitsu/ {
#auth_basic "closed site";
#auth_basic_user_file /path/to/htpasswd/hoge;
limit_except GET {
#auth_basic "closed site";
#auth_basic_user_file /path/to/htpasswd/hoge;
}
}
}
}
auth_basicとauth_basic_user_fileが指定できるコンテキストは共にhttp, server, location, limit_exceptなので以上のような設定例で動きます。
個別のディレクトリにBasic認証をかけるにはどのコンテキストを使うかというとlocationになります。以上の例だと http://<ドメイン or IP>/himitsu/ にBasic認証がかかってますね。ディレクトリに限った話ではありませんが通常はこれを使用するのが無難かもしれません。
全体にBasic認証をかけるにはhttpかserverですが、httpはトップクラスのネストになるのでサーバー全体にBasic認証がかかることに留意してください。
serverも似たような感じなのですがバーチャルホストを扱う場合は個別ドメイン毎に指定出来たりします。バーチャルホストを扱わないのであればどっちで指定しても同じかと思いますがそういうことが出来ると言うことを頭の隅っこの方にでも覚えておいてもらえれば変な事故を防げるときが来るかもしれません。
全体という意味でならlocationでも指定方法によっては全体にBasic認証をかけることもできます。
最後に
sudo service nginx reload
でBasic認証がかかっているか確認して下さい。restartでも反映できます。
reloadの場合はサーバーを止めずに設定を反映できます。
Apache VS Nginx
Apacheユーザーのための早見表。
Nginxは最後にセミコロンが要ることに注意!
| Apache | Nginx | |
|---|---|---|
| ユーザー認証の種類 | AuthType Basic |
N/A |
| 認証領域の説明(名前) | AuthName "hoge" |
auth_basic "hoge";(auth_basic off;で認証無効化) |
| ユーザー一覧のファイル指定 | AuthUserFile /path/to/htpasswd |
auth_basic_user_file /path/to/htpasswd; |
| グループ一覧のファイル指定 | AuthGroupFile /dev/null |
N/A |
| どのユーザーをリソースにアクセスさせるか | Require valid-user |
N/A |
| コンテキスト |
ディレクトリ .htaccess
|
http server location limit_except
|
パスワードの値には…(ネタ)
Nginx 1.0.3以上からRFC 2307に記載されてるようにパスワードの値に
ユーザー名:{スキーム}値
と指定できます。
これはApacheも同様。ただしどちらもバージョンによって使える、使えないスキームがあるので注意。
Nginxで使えるスキーム
PLAIN-
SHA(1.3.13から) SSHA
PLAINってまさか…!!(ポロリもあるよ)
生のパスワードがそのまま使える…ヤバめ
hoge:{PLAIN}012345678
絶対に使いたくないスキーム第一位に選ばれそうです。
ApacheとNginxは推奨してない
PLAIN, SHA, CRYPTは安全ではないということで使用は避けた方が良いです。
結局上記で紹介している方法が無難ですね。
以上ネタでした。
参考文献
-
厳密には『ハッシュ値』です。理解しやすく「暗号化されたパスワード」などと表記してます。 ↩
-
セキュリティー的な意味で「所有者」はユーザーに限定されので、パーミッションは
400としてます。必要に応じて400以上に変えて下さい。 ↩ ↩2 -
無い場合は
nobodyとなります。 http://nginx.org/en/docs/ngx_core_module.html#user ↩