Docker-composeでNginxのBasic認証を試すための環境を作成したのでGitにアップロードしました。
この記事は、前半ではコンテナの使用手順、後半ではコンテナやBasic認証の設定について解説を行います。
【Git】https://github.com/ruruyuki/nginx_basic_auth
コンテナの構成概要
今回公開したDocker-composeの構成は次のようになっています。
nginx_basic_auth
├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ ├── create_htpasswd.sh
│ ├── default.conf
│ ├── html
│ │ ├── auth_success.html
│ │ └── index.html
│ └── nginx.conf
└── tools
├── log
├── start_docker.sh
└── stop_docker.sh
コンテナの使用手順
前提
・DockerとDocker Composeがインストール済みであること。
・コマンドラインで作業すること。
Docker-Compose起動までの手順
・冒頭のGit URLからダウンロードしたソースを解凍する。
・「nginx_basic_auth-main」の配下にある
nginx_basic_auth ディレクトリに、コマンドラインで移動する。
・移動したディレクトリ内で以下コマンドを実行する。
docker-compose up -d --build
・Webブラウザで「http://127.0.0.1:8000」にアクセスする。
・Hello!! Welcome to Nginx と表示されます。
Basic認証検証手順
・Webブラウザで「http://127.0.0.1:8000/hoge」にアクセスするとBasic認証が表示されます
ユーザー名に「user1」、パスワードに「hoge01」
または、
ユーザー名に「user2」、パスワードに「hoge02」と入力すると、Authentication successful! と表示されます。
これでBasic認証が使用できることを確認できました。
以降はブラウザに認証情報が保存されてしまうのでBasic認証が実行されませんが、create_htpasswd.shのUSER_NAME_Xまたは、PASSWD_Xに設定しているユーザー名、パスワードを変更すると、Docker-composeを再実行すればまた認証が行われるようになります。
※ X は「1」または「2」の数字
Docker-composeを再実行するには次のコマンドを実行します。
docker-compose stop
docker-compose up -d --build
MacかLinuxであれば、 toolsディレクトリにある stop_docker.shとstart_docker.shを実行することで同じ操作が行えます。
このスクリプトを使用するとDocker-composeの起動・停止の履歴をlogフォルダに出力してくれます。
ただし、初回だと権限が付与されていないと思うので、toolsディレクトリで以下コマンドを実行してからご利用ください。
chmod 755 *.sh
解説
docker-compose.yml
docker-compose.ymlの構成はシンプルで、次のようになっています。
version: '3'
services:
nginx:
build: ./nginx
volumes:
- ./nginx/html:/var/www/html
ports:
- "8000:80"
build: ./nginx で docker-compose up実行時に ./nginx ディレクトリのDockerfile を使用するように設定しています。
volumes:
- ./nginx/html:/var/www/html
./nginx/htmlにあるファイルをDokcerの中の/var/www/htmlに配置するように設定しています。
ports:
- "8000:80"
ブラウザで8000ポートにアクセスすると、Dockerの80ポートにアクセスするように設定しています。
create_htpasswd.sh
Basic認証の肝となる.htpasswdファイルを作成するシェルスクリプトです。
スクリプトの中身は次のようになっています。
#!/bin/bash
# user1の作成
USER_NAME_1="user1"
PASSWD_1="hoge01"
CRYPTPASS_1=`openssl passwd -crypt ${PASSWD_1}`
echo "${USER_NAME_1}:${CRYPTPASS_1}" >> /etc/nginx/.htpasswd
# user2の作成
USER_NAME_2="user2"
PASSWD_2="hoge02"
CRYPTPASS_2=`openssl passwd -crypt ${PASSWD_2}`
echo "${USER_NAME_2}:${CRYPTPASS_2}" >> /etc/nginx/.htpasswd
Basic認証は/etc/nginx に .htpasswd ファイルを作成することで利用できます。
.htpasswdファイルの内容は次のようになります。
ユーザー名1:パスワード1
ユーザー名2:パスワード2
ユーザー名3:パスワード3
・
・
・
このシェルスクリプトが行なっていることは単純で、ユーザー名とパスワードをあらかじめ記載しておくと、その情報を元にパスワードのハッシュ化(暗号化)を行い、Dokcer内に.htpasswdファイルを作成してくれるというものです。
CRYPTPASS_1=`openssl passwd -crypt ${PASSWD_1}`
opensslコマンドはパスワードをハッシュ化(暗号化)してくれるコマンドです。
このコマンドを実行すると、平文のパスワードがハッシュ化されてCRYPTPASS_1 変数に保存されます。
CRYPTPASS_2も同様です。
default.conf
このファイルはNginxの設定を行なっているファイルです。
server {
listen 80;
server_name nginx-server;
charset UTF-8;
location / {
root /var/www/html;
index index.html index.htm;
}
location /hoge {
alias /var/www/html;
index auth_success.html;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
server_tokens off;
location / {
root /var/www/html;
index index.html index.htm;
}
ブラウザで、http://127.0.0.1:8000/ にアクセスするとindex.htmlが表示されるように設定を行なっています。
location /hoge {
alias /var/www/html;
index auth_success.html;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
ブラウザで、http://127.0.0.1:8000/hoge にアクセスするとauth_success.htmlが表示されるように設定を行なっています。
さらに auth_basic "Restricted"; と auth_basic_user_file /etc/nginx/.htpasswd; を設定することでBasic認証を利用できるようにしています。
先の location / の方にこの設定を記述すると、http://127.0.0.1:8000/ アクセス時にもBasic認証が実行されるようになります。
Dockerfile
最後にDockerfileの解説です。このファイルを元にNginxのコンテナが作成されます。
FROM nginx:latest
COPY nginx.conf /etc/nginx
COPY default.conf /etc/nginx/conf.d
COPY create_htpasswd.sh /etc/nginx
RUN apt-get update
RUN apt-get install -y openssl
RUN chmod 755 /etc/nginx/create_htpasswd.sh
RUN /etc/nginx/create_htpasswd.sh
RUN chmod 444 /etc/nginx/.htpasswd
FROM nginx:latest
Nginxの最新バージョンをインストールしてコンテナを作成する設定です。
COPY nginx.conf /etc/nginx
COPY default.conf /etc/nginx/conf.d
COPY create_htpasswd.sh /etc/nginx
ローカルのファイルをNginxコンテナに配置している処理です。
書式は次の通りです。
COPY "ローカルのファイル" "コンテナ内のディレクトリ"
RUN apt-get update
RUN apt-get install -y openssl
Basic認証のパスワードのハッシュ化(暗号化)を行うためのコマンドであるopensslのインストールを行う設定です。
RUN chmod 755 /etc/nginx/create_htpasswd.sh
RUN /etc/nginx/create_htpasswd.sh
Basic認証に使用する.htpasswdファイルを作成するシェルスクリプト「create_htpasswd.sh」に実行権限を与えた上で、スクリプトを実行している部分です。
このように記述しておくと、Nginxコンテナの作成と合わせ、コンテナ内に.htpasswdファイルを作成することができます。
解説は以上です。お疲れさまでした。