2020/07/08
NginxにBasic認証を導入してみた(Docker編)
概要
タイトルの通りですが… 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;"
以上の設定を使って、基本認証を導入することができました。
以上です。
関連する記事
tmkmsをdockerでビルドしてローカルのdocker-compose環境で利用してみる
tendermintのkey management systemであるtmkmsをsoftsignモードでテスト環境に導入してみる
[22.0]Local環境でbitcoind@Regtestを動かしてみる
version22.0のbitcoind・Regtestネットワークをdocker-composeを使って動作確認をしました
[EKS]NLB+NginxでClientのIPアドレスを取得する
EKS上にdeployしたnginxをNetwork Load Balancerを使って外部公開した時に接続元のIPアドレスを取得する対応をしました
[Nginx][Free版]cloudflareでユーザーのIPアドレス取得する
CloudflareのProxyを通した場合でもユーザーのIPアドレスを取得できるようにNginxの設定を編集しました