Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
78
Help us understand the problem. What is going on with this article?
@STSynthe

NginxでBasic認証させる件

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

ユーザーファイルとはユーザー名と暗号化されたパスワード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

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

nginx.conf
http {
    server {
        location ~ /\.ht {
            deny all;
        }
    }
}

設定する

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認証がかかっているか確認して下さい。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. 厳密には『ハッシュ値』です。理解しやすく「暗号化されたパスワード」などと表記してます。 

  2. セキュリティー的な意味で「所有者」はユーザーに限定されので、パーミッションは400としてます。必要に応じて400以上に変えて下さい。 

  3. 無い場合はnobodyとなります。 http://nginx.org/en/docs/ngx_core_module.html#user 

78
Help us understand the problem. What is going on with this article?
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
STSynthe
どうも私です。ライセンスが明確にしているものに対してはライセンスの範囲内でお好きにして下さい。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
78
Help us understand the problem. What is going on with this article?