Dockerシークレットは安全であると見なされているため、セキュリティレベルについて疑問に思っていました。シークレットへのアクセスをサービスに許可すると、予想どおり、コンテナーパスにマウントされたtempfsを確認できます(/var/lib/docker/containers/<container ID>/mounts/secrets
)サービスのタスクをホストしているノード上。ただし、このパス内のファイルをキャットして、シークレットの内容を確認することができました。
その時点で私は、何が秘密を構成よりも安全にするのか疑問に思いました。私の知る限り、それらがRAMディスクに保存されているという事実は、それらと構成の主な違いです。構成とシークレットの両方がraft内で暗号化されていますが、唯一の違いは、構成がディスク上のファイルに保存されていることです。 RAMディスクにあるシークレットとは対照的に、コンテナにマウントされている間。しかし、シークレットの内容を表示できる場合、それは本当に違いがありますか?
残念ながら、安全であることは簡単な用語ではありません。私はむしろリスク評価とリスク受容について話したいと思います。すべては質問に答えること、あなたがどれほど妄想的であるかについてです。安全だと主張するソリューションの種類。
ドキュメントごとに 次のようになります。
スウォームにシークレットを追加すると、Dockerは相互TLS接続を介してスウォームマネージャーにシークレットを送信します。シークレットは、暗号化されたRaftログに保存されます。 Raftログ全体が他のマネージャー間で複製され、残りの群れ管理データと同じ高可用性がシークレットに保証されます。
秘密の可用性。コンテナごと ephemerallity 。コンテナが稼働しているノードを知ることは決してないので、あまり気にする必要はありません。とはいえ、この秘密は、コンテナが実行されているすべての場所で利用できるはずです。
メモリ内のシークレット。メモリ内のシークレットを保持することについての一種の記述があります ここ 。問題は...システムとそのメモリ管理を信頼しない場合、メモリに保持されているパスワードだけでなく、はるかに大きな問題が発生します。
違い。
とはいえ、 openssl で暗号化された秘密ファイルを保持し、それを復号化して暗号化されていないコンテンツをメモリに配置することで、ほぼ同じことを実現できます。あなたが手動で行うことのすべて。