Docker4 択難易度 標準

状況

クラウドの 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

正答

  1. --env-file ではなく -e で、パスワードを直接書くべき
  2. ホスト IP を省くと外部にも公開される。127.0.0.1:3306:3306 にする
  3. ポートを 13306:3306 のように変えれば、外から狙われにくくなる
  4. 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

portpublishmysql

この問題を含む Docker のテストを制限時間つきで解く

Dockerクイズへ