[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をフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!