2021.06.29  

【Nginx】Docker-composeでBasic認証の検証環境を作成

Nginx,  Docker    

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ファイルを作成することができます。

解説は以上です。お疲れさまでした。

Nginxのおすすめ本


参考にさせて頂いたサイト

Docker+NginxでBasic認証を行うまでの3つの手順

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信