秘密をDockerコンテナーに渡す


26

画像解析ソフトウェアを実行するために使用されるベースDockerイメージがあります。イメージから作成された各コンテナには、処理されたイメージを分析および配布するためにソフトウェアによって使用される秘密(暗号化キー、顧客情報など)である構成設定のセットがあります。これらの秘密をコンテナに安全に渡すにはどうすればよいですか?


Hashicorpボールト
030

回答:


23

Dockerコンテナ内のアプリに秘密を取得するには、3つの方法があります。最初の2つは、Docker構成に関係します。最後の1つは、アプリにシークレットストアからシークレットを直接取得させることです。

1-環境変数

「The 12 Factor App」ガイドによると、シークレットは単なる設定であり、環境内で常に設定する必要があります。Dockerの実行中にシークレットを環境変数として設定すると、アプリからそこにアクセスできます。

2-マウントされたボリューム

すべてのシークレットを特定の構成/シークレットファイル内に配置し、それをマウントされたボリュームとしてインスタンスにマウントできます。

3-シークレットストアから取得

@ 030で述べたように、Hashicorp Vault(または「Amazon Secrets Manager」、またはそのようなサービス)を使用できます。
アプリまたはサイドカーアプリは、Dockerコンテナの設定を処理することなく、必要なシークレットを直接取得できます。この方法により、動的に作成されたシークレット(このようなシステムの非常に魅力的な機能)を使用でき、シークレットをファイルシステムから表示したり、dockerコンテナーのenv変数を検査したりする心配はありません。

個人的な意見

env変数を使用する方法だと思います。CIビルドシステムでビルド中にシークレットを取得し、展開時に設定する場合、Hashicorp Vaultなどのシークレットストアから管理できます。両方の長所を最大限に活用できます。また、秘密を取得するためにアプリケーションコードを記述する必要がない開発者の利点も得られます。開発者はコード機能に集中し、パスワードの取得などの管理タスクを処理しないようにする必要があります。

アプリケーションのコードは、アプリケーション自体の機能自体に焦点を合わせ、パスワードの取得などのバックエンドタスクを処理しないようにする必要があります。12因子アプリの状態と同じです。

編集:最後の文を変更して、開発者とシステム管理者のサイロ化の影響を除去しました。タスク自体はコードの観点から分離する必要がありますが、DevOpsは両方を念頭に置いて、制限されることのないほぼ同じ人物です。

個人的な意見(更新)

@Dirkのすばらしいコメント(秘密をDockerコンテナに渡す)ごとに、 ENV変数よりも秘密ストアを優先するという非常に強力な議論があります。


2
これにより、サイロが促進されます。DevOpsは、壁に物を投げつけるのではなく、一緒に物事を行っています。
030

2
コード、インフラストラクチャコンポーネントから切り離される必要があります。実際の人々は、インフラストラクチャの自動化とアプリのコードベースの両方をコーディングできますが、タスク自体は分離する必要があります。私の最初の答えの最後の文は、開発者である人々をサイロ化することでした。それ間違いです。わかりやすくするために編集します。
BoomShadow

7
環境変数に秘密を入れると、それらが漏洩するさまざまな可能性が提供されます。いくつかの例:コンテナーを実行しているマシン上のDockerデーモンにアクセスできるすべてのユーザーは、inspector execコマンドを使用してそれらを見ることができます。stdoutいくつかのデバッグモードで実行している場合、環境変数はしばしばログファイルにダンプされます。生成されたすべての子プロセスは、制御できない可能性のあるものを読み取って公開できます。ここでの詳細については、例えば: diogomonica.com/2017/03/27/...
ディルク

1
私もこの質問に取り組んでいます。私が理解していないのは、秘密情報を保護するために資格情報ボールトを使用しても、そのボールトにアクセスするには認証が必要であり、おそらく何らかの秘密が必要だということです。同じ問題は、パスワードで保護されたキーストアファイルの使用にも当てはまります。環境内の少なくとも「メタクレデンシャル」を渡すことに常に固執していますか?
Wheezil

1
@Wheezilメタ資格情報は、多くの特定の資格情報よりも簡単に保護できます。メタ資格情報を頻繁かつ自動的にローテーションできます。メタ資格情報は、セキュリティで保護されたホストにある格納域に移動でき、IPホワイトリストのようなものを使用して、実稼働サブネットからの接続のみを受け入れることができます。また、保管庫で保管中の暗号化、飛行中の暗号化、相互TSLおよび証明書のピン留め、およびより安全にするその他のすべてのベストプラクティスを確実に使用できます。
simbo1905

1

パイプのみを使用する別のオプションがあります。

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

まず、でdockerデーモンを作成します。-iコマンドread Aは、からの入力を待ってハングし/proc/1/fd/0ます。次に、2番目のdockerコマンドを実行し、stdinからシークレットを読み取り、最後のハングプロセスにリダイレクトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.