‫私はパスワードにDocker secretsを使っていますが､
‫これはコンテナ内にRAMファイルを作成するだけです｡
‫もし誰かがコンテナをハッキングしたら､ 私のアプリケーションと同じように､
‫そのファイルを見ることができます｡
‫イエスでもあり､ ノーでもある｡
‫素晴らしい｡ 話を続けよう｡ 何か良い方法はないでしょうか？
‫秘密の中身を暗号化？
‫そして､ ハッカーにわからないように､ アプリケーションの中で復号化するのです｡
‫ここで現実には､ アプリケーションはどこかにその秘密を持っていなければならず､
‫それらはメモリ上で暗号化されていない状態になるわけですね｡
‫暗号化されたものを復号化しているのは､ 私が知る限りすべてメモリに復号化されているんです｡
‫ハッカーがコンテナにrootを取れば､
‫その分､ いろいろなものが手に入ることになります｡
‫十分な知識があれば､ そのようなものを手に入れることができるはずです｡
‫そこでまず､ コンテナ内でアプリケーションをrootで実行しないことです｡
‫そうすると､ アプリケーションの外は一切いじれなくなるんです｡
‫コンテナ内で他のシステムユーティリティを実行することはできないので､
‫すべてのメモリを読み取ることができるかもしれませんね｡
‫もうひとつは､ これまで見てきた中で最も安全な方法は､
‫保管庫やワンタイムパスワードのようなもので､ 作成されたパスワードはアプリで使用され､ その後捨てられるので､
‫もう意味がないのです｡
‫現実には､
‫ほとんどの人がその準備ができていないのです｡ ほとんどの人のアプリはそれに対応できないんです｡
‫アプリを立ち上げるたびに､ 5分ごとにTwitterのAPIキーをローテーションするわけにはいかないでしょ？
‫こんな感じのもの｡ 次善の策は､ そのファイルがディスク上に永久に存在しないようにすることです｡
‫KubernetesのセキュリティとDockerのセキュリティ､
‫それら... sorry secrets､ Kubernetes
‫secrets､ Swarm secretsは､ RAM上の偽ファイルにパスワードを保存する方法として､ 私が今まで見た中で最高の方法です｡
‫そのパーミッションは､
‫自分のアプリだけが読めるように設定できるんですね｡
‫もし誰かが別のユーザーで侵入してきたら､ 必ずしもコンテナに別のユーザーを入れる必要はありませんが､ それらをロックして読み取り専用にし､
‫自分のアプリのユーザーしか読めないようにすることが可能です｡
‫そういうものなんですね｡
‫ということで､ 本当にそれだけです｡
‫私が見た中で唯一優れているのは､ まだメモリに保存し､ 暗号化せずに保存していることです｡
‫ただ､ ローカルに保存しないだけです｡
‫そのため､ VaultやHashiCorpのVaultなど､
‫ワンタイムパスワードを配信するリモートAPIを利用する必要があるんだ｡
‫しかし､
‫やはりそれらはシステム全体で構築しなければならないでしょう｡ 全体をデザインする必要がありますね｡
‫そして､ それはとても大変なことですよね｡
‫一方､ KubernetesやSwarmの秘密を利用すれば､ 通常､
‫その日のうちにそれらを完了させることができますね｡
‫古いアプリケーションでは環境変数に設定する必要があるため､
‫環境変数として設定しなければならないとしても､ あらゆるアプリケーションに実装することが可能です｡
‫ですから､ secretの中に入れておいて､ 実行時に必要であれば､
‫そのsecretを環境変数にダンプさせることができます｡
‫しかし､
‫私のコンサルティングのクライアントは､ 99％レガシーアプリケーションを扱っています｡
‫レガシーというのは､ コンテナ以前のすべてのもの､ つまりほとんどのアプリケーションを指しますね｡
‫私たちは､ コンテナができるまでの30年間､ コンテナなしでアプリケーションを作成してきました｡
‫だから､ 普通のものをたくさん持っています｡
‫つまり､ ほとんどのチームは､ コンテナに物を入れて､ ディスクに暗号化して保存する方法を探しているわけです｡
‫ディスク上にあれば､ 暗号化されている｡
‫KubernetesもSwarmもそれが可能です｡
‫なぜなら､ オーケストレーションを使いながらシークレットも使っている人はほとんどいないからです｡
‫とても､ とても小さなグループ､ 集団なのです｡
‫そうそう､ そこそこうまいと思うんだけどな｡