2020/07/08

NginxにBasic認証を導入してみた(Docker編)

dockernginx

概要

タイトルの通りですが… Dockerで動かしているNginxに基本認証を設定してみました。

HTPASSWD という環境変数が設定されている場合だけ、基本認証を設定するようにしました。

実装内容

ポイントだけを記載していきます。

Dockerfile

  • Dockerfile
  • .htpasswd を作るために apache2-utils をインストールしておきます。
FROM nginx:1.14.0-alpine

RUN apk add --update bash curl apache2-utils

COPY etc/nginx.conf /etc/nginx/nginx.conf
COPY etc/conf.d/default.conf /etc/nginx/conf.d/default.conf

COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod +x /sbin/entrypoint.sh

WORKDIR /
EXPOSE 80
CMD ["/sbin/entrypoint.sh"]

設定ファイル

  • default.conf
  • location の箇所に基本認証の設定を入れられるように、 {{BASIC_AUTH}} と記載しておきます。
    • この箇所は entrypoint.sh の中で、置換して使います。
server {
  location / {
{{BASIC_AUTH}}
    allow all;
    ...
  }
}

entrypoint

  • entrypoint.sh
  • HTPASSWD という環境変数が設定されていれば、基本認証の設定を設定ファイルに入れるようにします。(なければ空になる)
  • sed を使う際に、"/ などが含まれるため、エスケープしておきます。(結構複雑です)
BASIC_AUTH_USER=${BASIC_AUTH_USER:-nginx}
HTPASSWD=${HTPASSWD:-}
BASIC_AUTH=""
if [ -n "${HTPASSWD}" ]; then
  file_name=/etc/nginx/.htpasswd
  echo "${HTPASSWD}" | htpasswd -i -c ${file_name} ${BASIC_AUTH_USER}
  indent="    "
  BASIC_AUTH="${indent}auth_basic           \\\"Restricted\\\";\n"
  file_name=`echo ${file_name} | sed "s/\//\\\\\\\\\//g"`
  BASIC_AUTH="${BASIC_AUTH}${indent}auth_basic_user_file ${file_name};"
fi
sed -ri "s/[{]{2}BASIC_AUTH[}]{2}/${BASIC_AUTH}/g" /etc/nginx/conf.d/default.conf

nginx -g "daemon off;"

以上の設定を使って、基本認証を導入することができました。

以上です。