状況
クラウドの VM 1 台に MySQL を Docker で立てる手順書をレビューしている。MySQL には、同じ VM 上で直接動くアプリ(コンテナではない)からだけ接続する。
このコマンドで最初に直すべき点は?
$ docker run -d --name db \ --env-file /etc/app/db.env \ -p 3306:3306 \ -v dbdata:/var/lib/mysql \ mysql:8.4正答
- --env-file ではなく -e で、パスワードを直接書くべき
- ホスト IP を省くと外部にも公開される。127.0.0.1:3306:3306 にする
- ポートを 13306:3306 のように変えれば、外から狙われにくくなる
- mysql:8.4 ではなく mysql:latest にして、常に最新の修正を入れるべき
解説
-p でホスト側の IP アドレスを省くと、ホストのすべてのインターフェースで待ち受け、VM のパブリック IP からも届く状態になる。クラウドのファイアウォールやセキュリティグループで塞いでいなければ、インターネットから DB への接続を試せてしまう。同じ VM のアプリからだけ使うなら -p 127.0.0.1:3306:3306 として、ホスト自身からだけ接続できるようにする。ポート番号を変えても走査で見つかるので対策にならない。パスワードを -e で書くとシェルの履歴に残るので、--env-file のほうがよい。latest にするとバージョンが意図せず変わる。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ