Docker push での事故を防ぎたい
ホシイです。Docker Desktop、便利ですよね。
しかし、便利すぎるがゆえに問題になったり、そのために使えなくなったりしてしまったらたいへんです。普段から確認をしておきたい、というのが今回の趣旨です。
Docker Desktop を sign in ありで使いたい?
August 31, 2021 (January 31, 2022 まで猶予期間でした) より、Docker Dekstop の Windows 版と macOS 版は、一定の条件下の利用で有料ライセンスが必要になりました。
さて、Docker account で sign in した状態で docker を使うに際し、気になることがあります。DockerHub に “間違って” image を公開しちゃったりしないでしょうか?
わたしは業務では GCR (gcr.io) を利用することが多いので、image name には gcr.io/… といった指定をつけて運用していますが、たとえばこれをつけ忘れちゃったりしたらどうなるんでしょう?
最近は手元にテスト環境をつくるようなツール類を container を使って用意していて、docker をふだん使わないメンバーにも使ってもらっていたりすることから、不意の操作で意図せず image が公開されてしまった… というような事故が起きないようにしておきたいです。
秘密情報が含まれた container image が誤って公開状態で DockerHub に upload されてしまうと、情報セキュリティの問題になってしまいます。
そこで、認証と repository の状態によって push の挙動がどのようになるか実験してみました。 以下、Organization に所属した Docker account を使って検証しています。
問題がないケース
存在しない image repository への push は deny されます
❯ docker push test
Using default tag: latest
The push refers to repository [docker.io/library/test]
8d3ac3489996: Preparing
denied: requested access to the resource is denied
registry 部分を省略すると docker.io/library
が自動補完されるようです。
これを避けるために、常に registry 指定を明示して使うのがよさそうです。
認証していなければ private repository への push は deny されます
❯ docker push sqexjp/xxxx-test:hoshy-test
The push refers to repository [docker.io/sqexjp/xxxx-test]
8d3ac3489996: Preparing
denied: requested access to the resource is denied
これはまあ認証してないので失敗します。
※ あらかじめ repository sqexjp/xxxx-test が存在している場合の結果です。
認証していてかつ private repository が存在していれば push できます
❯ docker push sqexjp/xxxx-test:hoshy-test
The push refers to repository [docker.io/sqexjp/xxxx-test]
8d3ac3489996: Pushed
hoshy-test: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
これも当然です。認証していて、存在する先なので push できています。
※ あらかじめ repository sqexjp/xxxx-test が存在している場合の結果です。
認証していても repository が存在しなければ deny されます
❯ docker push sqexjp/hoshy-test
Using default tag: latest
The push refers to repository [docker.io/sqexjp/hoshy-test]
8d3ac3489996: Preparing
denied: requested access to the resource is denied
認証済みでも、勝手に repository が生成されて push されたりはしないようです。(安心)
※ Organization 単位での設定でも挙動が変わることがあるかもしれません。ご注意ください。
当然ながら、public repository でも権限がないものは push できません
❯ docker push alpine
Using default tag: latest
The push refers to repository [docker.io/library/alpine]
8d3ac3489996: Preparing
denied: requested access to the resource is denied
これもまあそうですよね。なので、“testxxxx” みたいな雑な image name をつけているぶんには問題が起きることは無さそうです。
と、ここまでの結果を見て安心していたのですが…
問題があるケース
以上は Organization 下の repo に対して検証していましたが、DockerHub では user 単位の repo を持つことができ、Organization 単位の repo と明確に区分されています。
- Organization/repo
- User/repo ← こちら
user repository という点が先程までと違います。
存在しない user repository への push
❯ docker push sqexhoshy/test2:latest
The push refers to repository [docker.io/sqexhoshy/test2]
8d3ac3489996: Pushed
latest: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
Docker ID sqexhoshy
で存在しない (未作成の) user repository test2
に対して push すると、repository が自動作成され、しかも default で public に状態なってしまいます。
しかも、管理者権限でもこれを制限する方法がないようです。
image name の指定文字列としてなかなかここまで事故ることは無さそうですが、ちょっと試すときに自分の user name を image につけるようなことはままあるので、忘れた頃がこわいやつです。
また、今回の検証では、Organization には有料ライセンスがついていますが account 単体としては free 版を使用しています。(この区分が認識しづらい…) この場合、1 account で持てる private repository はひとつまでという制限もあり、それ以上は private にできません。ここは注意が必要そうです。
ということでまとめ
ふだんから container image には registry 指定を確実に入れておくのが安全です。
例) GCR 利用
❯ docker build -t asia.gcr.io/aaaa-aaaa/punpkin:latest .
❯ docker tag 8d3ac3489996 asia.gcr.io/aaaa-aaaa/punpkin:latest
蛇足
この記事を書いた時点 (2022/05) では、Docker FAQs には以下のように書かれており、必要数のライセンスが購入されていれば sign in せずに利用できるようです。
(抜粋)
- My organization has purchased Docker subscriptions to cover the use of Docker Desktop by employees at my organization. Do the employees in my organization need to sign in when using Docker Desktop to prove we are in compliance?
- No, the employees in your organization are not required to sign in when using Docker Desktop to prove your organization is in compliance. We trust our customers to purchase the correct number of subscriptions to cover usage of Docker Desktop for their organization if their organization is greater than 250 employees OR has more than $10 million in annual revenue.
用途によっては当面 sign in なしで使い続けることを検討してもよいかもしれません。
※ ご利用方法に合わせて最新の情報を確認しながらご利用ください