Docker イメージにクレデンシャル情報を含めて復元してみた
Docker イメージで環境変数を使用するとクレデンシャル情報(秘密情報)を含める場合があり、イメージが流出した際に復元できてしまいます。今回はそれをテストしてみました。
何が問題なのか?
Dockerfile にて ARG、ENV に渡された情報はイメージにも書き込まれ、それがセキュリティリスクになるということでした。以下のような書き方で発生します。
Dockerfile
ARG SECRET_KEY
ENV SECRET_KEY=${SECRET_KEY}
今回クレデンシャル情報はGithub のシークレットから読み出しておりDockerfileに直書きしていません。
環境
今回のテスト環境としては以下のような形でした。
GitHubActions → ECR + ECS
GitHubActions でイメージをビルドし ECR にプッシュしそのイメージを元に ECS でタスクを走らせています。
この時クレデンシャル情報は Github のシークレットに登録して Github actions 実行時に呼び出し、Dockerfile に渡すという流れになっていました。
ECR のレジストリがプライベートなのですが、これが公開された場合、漏洩した場合はイメージからクレデンシャル情報が復元できてしまいます。また Github actions などの CI/CD ツールでキャッシュを使用しイメージを保存していた場合もこのキャッシュ情報の中にクレデンシャル情報が含まれています。
GitHubActions で出た Warning
GitHubActions でビルドテストしたところビルド&プッシュしているところで以下のワーニングを出してくれました。これはありがたいですね。
warnings found (use docker --debug to expand):
- SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ARG
ECR のイメージをダウンロード
ECRからイメージをダウンロードするやり方は以下の記事をご参照ください。
ダウンロードしたイメージから環境変数が確認できるかテスト
以下のコマンドを実行すると確認できます。
docker inspect <image_id_or_name> | jq '.[0].Config.Env'
ベストプラクティス
イメージには基本的にクレデンシャル(秘密)情報を含めないようにします。デプロイ先に直接登録するのが通常の運用です。例えば AWS なら Secrets Manager や Systems Manager パラメータストアにコンソールから登録するようにします。
ECR のリポジトリがプライベートであれば、クレデンシャルを権限のない方が確認できることはないと思いますが、運用が変わったり、開発メンバーが増えたりなどの変化でイメージが公開されてもリスクを減らせるように事前に対策しておくのが良さそうです。
Discussion