web-dev-qa-db-ja.com

シークレットをDockerコンテナーに安全に保存する方法

私が取り組んでいるアプリケーションには、12を超える秘密、SSL証明書、およびAPIキーがあります。現在、.gitignoreに追加されたファイルがあり、すべての秘密が含まれています。これらの秘密をすべて安全に保存する方法は?セキュリティが最優先事項であるエンタープライズアプリはこれをどのように処理しますか?

私はAWS KMSを調べていますが、理解している限り、すべてのシークレットを暗号化してコミットし、実行時にAWS資格情報を渡してシークレットを復号化します(ユーザーは復号化にKMSキーのみを使用でき、他の権限がユーザーに追加されます)。

ここで、コンテナが実行されているマシンが危険にさらされていると仮定します-シークレットは暗号化されているので、問題ありませんが! docker inspectコマンドを実行すると、すべての環境変数(AWSシークレット)が表示されるため、コンテナーにexecを実行すると、env変数を使用してシークレットを復号化するだけで済みます。目的または多分私はどこかにステップを逃していますか?

:私の現在のソリューションも安全ではありません-ファイルはgitignoredですが、コンテナーが実行されているマシンにまだ存在しています(後で、イメージがビルドされた後、それらはenv変数として公開されます)。

注2:Gitリポジトリはプライベートです

6
r00m

一般的に言えば、指摘しているように、そこでの妥協はすべてのダウンストリームに影響を与えるため、コンテナーを実行しているインスタンスにはコンテナー自体よりも厳しいセキュリティを想定する必要があります。これは、ec2インスタンスを実行しているVM Hostと同じです。

標準的な解決策は、環境変数を介してシークレットをコンテナに渡すことです。また、コンテナーにマウントされたFuseファイルシステムを作成する(Hashicorp Vaultに格納されているシークレット用の)ソリューション、またはDockerボリュームドライバーを使用した同様のアプローチを見てきました。これはそれほど簡単なことではありませんが、多くの秘密を渡せば簡単です。

Docker Secrets は、コンテナ内でシークレットを共有および保存するための新しい推奨方法です。 Dockerは、シークレットを/run/secretsの下のファイルに、環境変数アプローチを介して意図的に格納することを選択しました。

3
smeeb