Help us understand the problem. What is going on with this article?

NginxでBasic認証させる件

ユーザーファイルを作成する

ユーザーファイルとはユーザー名と暗号化されたパスワード1群。
Apacheで言うところの.htpasswdにあたります。

# comment
ユーザー名1:暗号化されたパスワード1
ユーザー名2:暗号化されたパスワード2:comment
ユーザー名3:暗号化されたパスワード3

フォーマットもこの通りほぼ同じ。

パスワードの暗号化ですが、この節ではopensslがインストールされている事を前提にして手順を記載してます。
Apacheのhtpasswdを使ってもかまいませんが、わざわざそれをインストールする手間が省けます。

sudo echo "ユーザー名:$(openssl passwd -apr1 パスワード)" > /path/to/htpasswd/hoge

これで/path/to/htpasswd/hogeが作成されました。もちろんファイルパスはダミーですので適当に変えて使いましょう。
後は所有者やパーミッションを適切に設定しておくとよいです。

sudo chown 所有者 /path/to/htpasswd/hoge && sudo chmod 400 /path/to/htpasswd/hoge

あまりよろしくは無いですがパブリックディレクトリにユーザーファイルを置く場合はアクセスを排除するようにもしておきましょう。通常パブリックディレクトリにこのファイルを設置する必要はありません。

設定する

nginx.confか、あるいはinclude先でも。

nginx.conf
# (省略)
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認証がかかっているか確認して下さい。
余談ですがreloadでは無く、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は安全ではないということで使用は避けた方が良いです。
結局上記で紹介している方法が無難ですね。
以上ネタでした。

参考文献


  1. 厳密には『ハッシュ値』です。理解しやすく「暗号化されたパスワード」などと表記してます。 

STSynthe
どうも私です。ライセンスが明確にしているものに対してはライセンスの範囲内でお好きにして下さい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした