DockerのMySQLイメージで接続元ホスト名によるアクセス制御ができない( `skip-name-resolve`)
はじめに
MySQL では、接続元ホスト名ごとに「接続できる」「接続できない」の制御が可能ですが、設定方法を正しく把握していなかったので Docker 環境を使って検証したところハマってしまいました。
検証環境
環境
「Docker」と「Docker Compose」を使って以下のような環境を構築し検証したいと思いました。
- サーバは 2 台。
- 「MySQL サーバ」である
db-server
- 「Apache+PHP サーバ」である
web-server
- 「MySQL サーバ」である
- 「MySQL サーバ」には「Apache+PHP サーバ」からアクセス可能なユーザー
app_user
を用意する。 - 「MySQL サーバ」には「Apache+PHP サーバ」から のみ アクセス可能な追加のユーザー
app_user_additional
を用意する。
検証環境の用意
「Web サーバ」用の Docker コンテナ、「MySQL サーバ」用の Docker コンテナを立ち上げるために、「Docker Compose」を利用しました。
docker-compose.yml
の設定は以下のようになりました。
docker-compose.yml
上記の YAML ファイルから Docker Compose を起動すれば、以下のユーザーで接続できます。
root
( testpass )app_user
( app_p@ssw0rd )
YAMLファイルはカレントディレクトリに配置します。
「MySQL サーバ」コンテナ内の /docker-entrypoint-initdb.d
ディレクトリにカレントディレクトリをマウントしていますが、
これはこのコンテナが /docker-entrypoint-initdb.d
ディレクトリ配下にある *.sh
や *.sql
を初回起動時に実行し、初期化する仕組みがあるためです。
この仕組を利用した初期化用スクリプトとして、 createdb.sql
も作成しておきます。
createdb.sql
これで、先の root
、 app_user
に加えて、「Web サーバ」(ホスト名= web-server
)から以下のユーザーで接続できる想定でした。
app_user_additional
( app_p@ssw0rd )
コンテナ環境の起動
以下のコマンドでコンテナを deamon 起動します。
「Web サーバ」( web-server
)からの接続
「Web サーバ」コンテナに接続して db-server
ホスト名を利用した接続を試してみます。
mysql
コマンドで接続したいのですが、この環境には mysql
コマンドが存在しないためインストールします。
3 つのユーザー( root
/ app_user
/ app_user_additional
)で MySQL にログインを試みてみます。
全ユーザーともログインができる想定でした。
app_user_additional
ユーザーではなぜか接続できない
結果は以下のとおりでした。
root
ユーザーで接続できなかったのは localhost
からしか接続できない設定となっているのでしょう。
app_user_additional
ユーザーで接続できなかったのはなぜでしょう?
原因は公式の MySQL コンテナの設定
今度は db-server コンテナから root
ユーザーで MySQL にログインし、あるグローバル変数の値を確認してみます。
上から2つ目の skip_name_resolve
グローバル変数の値が ON
となっています。
これはユーザーのアクセス制御を行う際にホスト名が利用できないことを表しています。
設定を変更するには、MySQL コンテナの /etc/mysql/conf.d/docker.cnf
を変更しないといけません。
つまり一度コンテナをビルドし直す必要があります。
ちなみにユーザーの一覧を確認してみましたが、 app_user_additional
ユーザーは存在していました。 また、 root
ユーザーはローカルからの接続しか許可されていませんでした。
接続元ホスト名指定をやめて、接続元 IP アドレス指定をすれば対応可能
結局、 createdb.sql
を書き換えて接続元ホスト名を指定している箇所を接続先 IP アドレスに変更してやれば問題が解消します。
※ホスト IP アドレスやサブネット IP アドレスを調べるには、 docker inspect
コマンドでコンテナの詳細情報を確認します。
ひとこと
Docker Compose で構成されたコンテナ群以外から DB サーバコンテナに接続しに来るケースは殆ど無いでしょうし、MySQL ユーザー作成時に接続元を細かく制御するのはバッドプラクティスなんでしょうか?
ディスカッション
コメント一覧
まだ、コメントがありません