2015-11-01 12 views
14

マイクロサービスとクラウドは事です。誰もが話して、書きます。個人的に私はこのトピックについて多くのことを考えています:これがどのように恩恵を受けるために利用できるのでしょうか?可能な課題は何ですか?どのようにこれは日々の開発をスピードアップすることができますか?すべてを管理する方法は? 数日後に気になる質問は、「マイクロサービス/クラウド環境での秘密の管理方法」です。マイクロサービス/コンテナ/クラウド環境で秘密を管理するにはどうすればいいですか?

150人のソフトウェアエンジニアとさまざまな製品を持つさまざまなチームを持つ企業を想像してください。各チームはソフトウェアを作成しており、あらゆるサービスにはさまざまな量の秘密(APIキー、パスワード、SSHキーなど)が必要です。 "古いファッション"のやり方は、いくつかの設定ファイルをini/yaml/txt形式で作成し、それを読むことでした。 12ファクターのアプリは言う:それは、envヴァースでそれを行う。

Env varsはマシンごとに設定でき、設定ファイルもそこに置くことができます。 これは、マシンがいっぱいで、いくつかのシステム管理者によって導入が行われた場合に機能します。 一般的なルールの1つは、「秘密をGitリポジトリに保存しない」ということです。

新しい世界が登場しました。 チーム自身が作成するアプリケーションは、これまで責任を負いません。 チームによって展開され実行される必要があります。 したがって、当社はコンテナとセルフサービスの方法(例:Mesos and Marathon or Kubernetes)に移行しています。

もちろん、Dockerfilesもenv varsを設定できます。そして、はい、ビルド中にDockerコンテナにあなたの設定ファイルを追加することができます。 これで誰もが(他のチームなどの)秘密にアクセスできます。誰もこの秘密を誰が使用しているかを知っておらず、危険なことをしています。

Dockerfilesもバージョン管理したいと考えています。また、Marathon上で実行したいアプリケーションは、バージョン化(Gitなど)する必要があります(REST APIによって適用されます)。どこのコンテナ/アプリの秘密をどこに保管して管理するのですか? SwarmとMachine(Dockerの場合)、MesosとMarathon(Dockerでも使える)、Kubernetesのようなスケジューラフレームワークでは、あなたのアプリケーションがどこで実行されているのかわからないからです。これは複数のマシンでスケジュールされます。 このツールのほとんどは認証されていません(デフォルトではもちろんNginxのプロキシなどで追加できます)。

秘密を管理する1つのアイデアは、Vaultのようなツールを使用しています。しかし、私はアプリで "ネイティブ"サポートを見たことはありません。 Blackboxも同様です。そして、私は設定管理がこれを解決する方法を知らない。私はシェフが暗号化されたデータバッグをサポートしていることを知っていますが、シェフを使ってDockerコンテナをセットアップ/構築することはできません。

マイクロサービス/コンテナ/クラウド環境に複数のエンジニアを持つ複数のチームの秘密をどのように管理していますか?

+0

おそらく、これを行うための業界標準である「コミュニティーの方法」がありますか?このような「未解決の質問」は申し訳ありません。このようなことについて議論するために、StackOverflowネットワークに正しい場所がありますか?または私はここで間違っていますか? – Andy

+4

ああ、私はこの木の森を逃したと思う。ここでの実際の質問とは対照的に、あなたが何をしているのかについて多くの騒ぎがあります。あなたはマイクロコンテナの秘密を管理しようとしています。質問をクリーンアップして明示的に*できますか?最初のスキムは、それが意見に基づくように読まれました。 – Makoto

+1

私はここに誠と同意します。彼の質問を明確にするために@Andyに忠告します。今のところ、この質問に従うのは難しいですが、そこに隠れている疑問があります。 – Chris

答えて

7

いくつかの解決策があります。

まず、あなたの秘密を画像に入れないでください。あなたが実現したように、それはちょっとしたアイデアです。ビルド時に秘密を追加しない場合は、実行時に秘密を追加する必要があります。これにより、いくつかのオプションがあります。

  • 12 Factor Appで示唆されているように環境変数を使用してください。コンテナの起動時にこれらの変数の値を設定ファイルに取り込むスクリプトを記述する必要があります。これはうまくいきますが、環境変数が簡単に流出するので(リンクされたコンテナやdocker inspectでよく見られ、バグレポートによく載っています)、本当に好きではありません。また、Summonを参照してください。

  • ボリュームを使用します。実行時に秘密の設定ファイルをマウントするだけです。これはうまくいきますが、ホスト上に隠された秘密のファイルがあることを意味します。これは、SwarmやMesosのようなフレームワークを使用している場合など、コンテナが実行されるホストがわからない場合にはさらに複雑になります。

  • Vault/Keywhizなどのセキュアなk/vストアを使用してください。あなたが指摘しているように、アプリケーションに値を取得するためにいくつかのスクリプトを実行する必要があります(env変数と同様)。何らかの理由でk/vストアに認証する必要があります(KeywhizおよびVaultのボリュームドライバを参照するか、env var経由で渡された1回限りのトークンを使用することもできます)。

Kubernetesにはすでにfairly advanced support for secretsがあります。他のフレームワークでは独自のソリューションが採用されることが期待されます。

関連する問題