[Linux] nginxでBasic認証を行う方法(CentOS)
こんにちは、@yoheiMuneです。
今日は、nginxにBasic認証を設定する方法をブログに書きたいと思います。
CentOS7のイメージを使って、以下のようにコンテナを起動してログインします。
次に、nginxをインストールしておきます。以下の手順でインストールします。
今回は
Apacheのいない環境で.htpasswdを作る - Qiita
設定が正しくできれば、以下のようにBasic認証がかかった状態にすることができます。
例えば、今回は
Nginx で Basic 認証 - Qiita
nginxで特定ディレクトリをBasic認証から除外する方法 - Qiita
nginxのsatisfyについて(英語、nginxドキュメント)
nginxのallowについて(英語、nginxドキュメント)
最後になりますが本ブログでは、Linux・フロントエンド・Python・Node.js・インフラ・開発環境・Go言語・Swift・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
今日は、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点の作業を行います。.htpasswdファイルを作成する- nginxのconfファイルから
.htpasswdを読み込む - 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の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!






