2015-11-01 78 views
14

微服務和雲是一件事情。每個人都在談論和寫作。就我個人而言,我正在考慮很多關於這個主題的內容:如何從中受益?什麼是可能的挑戰?這如何加速日常發展?以及如何管理所有的東西? 幾天以來困擾我的一個問題是「如何管理微服務/雲環境中的祕密?」。如何管理微服務/容器/雲環境中的祕密?

想象一家擁有150名軟件工程師和各種產品的團隊的公司。每個團隊都在創建一個軟件,每個服務都需要不同數量的祕密(API密鑰,密碼,SSH密鑰等等)。 「舊時尚」的方式是以ini/yaml/txt格式創建一些配置文件並從中讀取。 12因素應用程序會說:按照環境變量做。

Env vars可以在每臺機器上設置,配置文件也可以放在那裏。 如果您手中充滿了機器並且部署由少數系統管理員完成,則此功能可用。 其中一條通則是:「不要在Git倉庫中存儲祕密。」

現在新的世界進來了 Ever團隊負責他們自己生產的應用程序。 他們應該由團隊部署和運行。 因此,我們公司正在採用容器和自助服務的方式(例如Mesos和Marathon或Kubernetes)。

當然,Dockerfiles也可以設置env變量。是的,您可以在構建期間將您的配置文件添加到Docker容器中。 但是,每個人都可以訪問這些祕密(例如來自其他團隊)。沒有人知道誰在使用這些祕密並做一些危險的事情。

您還想要對Dockerfiles進行版本化。你想在Marathon上運行的應用程序也應該進行版本化(Git或其他)(並由REST API應用)。那麼在哪裏存儲和管理這些容器/應用程序的所有祕密? 因爲使用像Swarm和Machine(Docker)這樣的調度器框架,Mesos和Marathon(也可用於Docker)或者Kubernetes你不知道你的應用程序將在哪裏運行。這將安排在幾臺機器上。 而且大多數這些工具都沒有認證(默認情況下,這可以通過Nginx代理或其他方式添加)。

管理機密的一個想法是使用像Vault這樣的工具。但我從來沒有在應用程序中看到「本地」支持。這同樣適用於Blackbox。我不知道配置管理如何解決這個問題。我知道Chef支持加密的數據包,但afaik無法使用Chef來設置/構建Docker容器。

如何在多個團隊環境中與幾名工程師在微服務/容器/雲環境中管理祕密?

+0

也許有這樣做的一種「社區方式」或行業標準如何做到這一點?對不起,這樣一個「開放的問題」。在StackOverflow網絡中是否有正確的位置來討論這樣的事情?還是我錯了? – Andy

+4

啊,我想我錯過了這棵樹上的樹林。有很多關於你在做什麼的聲音,而不是這裏的實際問題。你打算管理微型集裝箱內的祕密;你能清理你的問題,所以它*顯式*?最初的脫脂使它看起來像是基於意見的。 – Makoto

+1

我同意Makoto在這裏,我敦促@Andy澄清他的問題。就目前來看,這個問題很難遵循,但我懷疑有一個很好的問題藏在裏面。 – Chris

回答

7

有幾種解決方案。

首先,不要把你的祕密放入圖像。正如你所意識到的那樣,這是一個糟糕的主意。如果您不在構建時添加祕密,則必須在運行時進行。這給我們留下了幾個選擇:

  • 使用12 Factor App建議的環境變量。然後,您需要編寫一個腳本,該腳本將在容器啓動時用這些變量的值填充配置文件。這是有效的,但我不太喜歡它,因爲環境變量很容易泄漏(它們可以在鏈接容器中看到,並且通常包含在bug報告中)。另見Summon

  • 使用量。只需在運行時用祕密掛載配置文件即可。這是有效的,但確實意味着你有一個祕密文件在主機上。當你不知道你的容器將在哪個主機上運行時,比如當使用Swarm和Mesos這樣的框架時,這會變得更加複雜。

  • 使用安全的k/v存儲區,如Vault/Keywhiz。正如你指出的那樣,你需要做一些腳本來獲取值到應用程序中(就像env vars一樣)。您還需要以某種方式向k/v存儲進行身份驗證(您可能需要查看KeywhizVault的卷驅動程序,或使用通過env var傳遞的一次性令牌)。

Kubernetes已經fairly advanced support for secrets,我希望看到其他框架採用自己的解決方案。