2017/08/29更新

[Linux] nginxでBasic認証を行う方法(CentOS)

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、nginxにBasic認証を設定する方法をブログに書きたいと思います。
画像

目次




今回の検証環境はこちら

nginxが自由に試せればどこでも良いのですが、今回はDockerで検証してみたいと思います。Dockerについては「Dockerに入門する(インストール、OSイメージ入手、コンテナ起動、コンテナ管理)」というブログを書きましたので、参考になれば幸いです。

CentOS7のイメージを使って、以下のようにコンテナを起動してログインします。
# CentOS7のイメージを入手
$ docker pull centos:7

# コンテナの起動とログイン
# -pオプションで、Docker内の80ポートをホスト(Macなど)では8080ポートでアクセスできるようにしています.
# また、--rmオプションをつけて、ログアウトすると自動的にコンテナを削除するようにしています.
$ docker run --rm -it -p 8080:80 centos:7 bash
[root@1ec28c0ef93a /]#
これでDocker内に入れればOKです。

次に、nginxをインストールしておきます。以下の手順でインストールします。
# nginxのインストール
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum -y update nginx-release-centos
$ yum -y --enablerepo=nginx install nginx

# バージョン確認
$ nginx -v
nginx version: nginx/1.12.1

# 起動
$ nginx

# 起動確認
$ curl http://localhost
これで起動確認まで出来ればOKです。CentOS7であれば通常はsystemctlを用いた起動を行いますが、Docker上ではそれができません(CAP_SYS_ADMINという権限が剥奪されているため(別途付与すればできますが割愛します))。またDockerでnginxを起動する場合は、DockerfileにてENTRYPOINTなどを指定して起動しますが、今回は検証用ということでnginxコマンドをそのまま実行します。

そしてこの後の手順にて、何度かnginxを再起動する必要があるのですが、以下のように行います。

# nginxの再起動の手順(今回の暫定的な方法です)

# プロセスをKill
$ kill $(cat /var/run/nginx.pid)

# そして起動
$ nginx
本来であればコンテナの再起動などで行いますが、今回は検証用とのことで暫定的にこの方法でいきたいと思います。



nginxにBasic認証をかける

前置きが長くなってしまいましたが、ここが本題です。nginxでBasic認証を行う場合には、以下の3点の作業を行います。

  1. .htpasswdファイルを作成する
  2. nginxのconfファイルから.htpasswdを読み込む
  3. nginxを再起動する
順に見てみたいと思います。


Basic認証用のファイルを作成する(.htpasswdファイル)

Apacheと同じく、まずはBasic認証用のファイルを作成します。ファイル名はなんでも良いですがここでは.htpasswdとしています。
# Basic認証用のファイルを作成するためのツールを入手
$ yum install -y httpd-tools

# 上記のツールを使って、.htpasswdファイルを作成
# ここでは、ユーザー名:myuser、パスワード:secret として作成しています
htpasswd -c /etc/nginx/.htpasswd myuser
New password: secret
Re-type new password: secret
Adding password for user myuser

# 作成されたものを確認します.
cat /etc/nginx/.htpasswd
myuser:$apr1$DyKH9aML$iRmoZcVLtJ74xWNRnTOJf1
無事に/etc/nginx/.htpasswdにファイルができればOKです。

今回はhttpd-toolsを用いましたが、opensslコマンドで作成することも可能です。
Apacheのいない環境で.htpasswdを作る - Qiita


nginxでBasic認証用のファイルを読み込む

上記で作成したファイルを、nginxの設定で読み込んで、アクセスした時にBasic認証が有効になるようにします。下記では/etc/nginx/conf.d/default.confを編集していますが、環境によっては/etc/nginx/nginx.conf/etc/nginx/conf.d/*.confなど異なるファイルの場合もありますので、適宜読み替えをお願いします。
server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/html;

    # Basic認証用の設定を追加
    auth_basic "Restricted";  # 表示される文字
    auth_basic_user_file /etc/nginx/.htpasswd;  # 先ほど作成したBasic認証用のファイル

    location / {
        index  index.html index.htm;
    }

    ...以下省略...
これで設定ファイルへの記載は完了です。


nginxの再起動をして有効化する

最後に、nginxの再起動をして有効化します。今回の再起動の方法を参考に、nginxの再起動をします。


設定が正しくできれば、以下のようにBasic認証がかかった状態にすることができます。
画像


一部のパスのみBasic認証を除外する

さて、上記の設定の場合すべてのパスでBasic認証が発生しますが、例えば/res以下のパスへのリクエストの場合に、Basic認証をかけないようにすることができます。

例えば、今回は/res/a.htmlとアクセスできるファイルを用意します。
mkdir /usr/share/nginx/html/res
echo "12345" > /usr/share/nginx/html/res/a.html
そして、そのURLの場合に、Basic認証をかけないようにするには、以下のように設定を追記します。
server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        index  index.html index.htm;
    }

    # /res以下は、Basic認証を除外する設定
    location /res {
        satisfy any;  # IP制限 または Basic認証のいずれかがOKなら通す設定
        allow   all;  # そして、IP制限をすべて通す設定(つまり、Basic認証は関係なくなる)
    }

    ...以下省略...
そして、ホスト上から以下のアクセスをした際にBasic認証がかからなければOKです。
http://localhost:8080/res/a.html
他にもBasic認証については、特定のパスのみBasic認証を有効にしたり、複数のユーザー名を使い分けたりなど、用途が様々ですので必要に応じて使い分けてみてください。



参考資料

今回の内容を調査のため、以下の記事を参考にしました。ありがとうございます。

Nginx で Basic 認証 - Qiita

nginxで特定ディレクトリをBasic認証から除外する方法 - Qiita

nginxのsatisfyについて(英語、nginxドキュメント)

nginxのallowについて(英語、nginxドキュメント)


最後に

サーバーサイドのエンジニアって最初は難しいなぁと思ってましたが、案件を通してどんどんと技術に触れていくと、分かることがいっぱいできて楽しいですね。今回のnginxでのBasic認証も必要があって調査した次第でした。

最後になりますが本ブログでは、Linux・フロントエンド・Python・Node.js・インフラ・開発環境・Go言語・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。