koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

phpMyAdminのDockerイメージにBASIC認証を追加する

人は何故BASIC認証を求めてしまうのだろうか? やはり安心のためだろう。

BASIC認証は兎に角お手軽だ。ユーザー名とパスワードの組さえ設定すればそれだけで認証できてしまう。

令和の時代になってもこれ程簡単に設定できる認証はそうそうない。

何となく未認証でインターネットに晒したくないサイトにBASIC認証を設定してしまいたい場面はある。

例えばphpMyAdminだ。

コンテナの普及著しい令和の時代ではオフィシャルなDockerイメージをデプロイすることでphpMyAdminを立てられてしまう。便利だ。

github.com

これにBASICを設定しておきたい。

そう思ってしまったので設定出来るようにした。

github.com

https://github.com/7474/phpmyadmin-with-basic-auth/blob/v5.1.3/Dockerfile

FROM phpmyadmin/phpmyadmin:5.1.3

# BASIC認証を構成した設定ファイルをコピーして有効にしておく
COPY basic-auth.conf /etc/apache2/conf-available
RUN a2enconf basic-auth

# 環境変数から .htpasswd ファイルを作成してたら起動するエントリースクリプトを配置しておく
COPY docker-entrypoint-with-basic-auth.sh /docker-entrypoint-with-basic-auth.sh

ENTRYPOINT ["/docker-entrypoint-with-basic-auth.sh"]
CMD ["apache2-foreground"]

phpMyAdminの公開ディレクトリは /var/www/html なのでそこに認証を必要とするように設定する。

<Directory "/var/www/html">
  AuthType Basic
  AuthName "auth"
  AuthUserFile /etc/apache2/.htpasswd
  Require valid-user
</Directory>

後はパスワードファイルを起動時に作って終わり。

#!/bin/bash

htpasswd -cb /etc/apache2/.htpasswd "$BACIC_AUTH_USER" "$BACIC_AUTH_PASSWORD"

/docker-entrypoint.sh "$@"

実際にこのイメージを使うかどうかは分からないが、供養の意味も込めて記事を書いた次第である。

世のBASIC認証したい人に届けば幸いだ。

Apache2で動作するようになっているコンテナイメージなら同じ要領でBASIC認証を追加できるだろう。

Nginxにしたって似たようなものだと思う。

コンテナの前で認証しろ?

AWS App Runner*1は強制的にパブリックなエンドポイントが生えるのでそう言うのやりづらいんだよね。

そうでないにしてもコンテナの環境変数設定するだけは楽っしょ!

BASIC認証で安心を得たい程度にはちょうど良い塩梅なのではなかろうか。

そんな感じ。


余談

App RunnerはECRとECR Publicしか参照できないので、今回はECR Publicにイメージを公開してみた。

BASIC認証をイメージに追加するのにかかった時間を1とするなら、ECR Publicにイメージ公開するのにかかった時間は10位あったように思う。

ECRとECR Publicが全然別の存在だって知らなくて、ECR向けにIAMを作っていたり不馴れでやたら時間を取られてしまった。

ECRへのログインは出来ているのに、ECR Publicへのアクセスが401になる状態、しばらく意味が分からなかった。

やはりIAMは難しい。


とかなんとかやっていたら、AzureのApp Runner相当サービスであるContainer AppsがEasy Authに対応していた。

これは文字通り簡単便利に認証を追加できる機能で、App Serviceが好きな理由の一つでもある。

App Runnerは爪の垢を煎じて飲んで欲しい、お前はCognitoと連携できるのか? そういうところだぞ。

*1:koudenpaは最近App Runnerで遊んでいる