作者 | Ying Li
譯者 | HardworkFish
容器正在改變我們對應用程式和基礎設施的看法。無論容器內的程式碼量是大還是小,容器架構都會引起程式碼如何與硬體相互作用方式的改變 —— 它從根本上將其從基礎設施中抽象出來。對於容器安全來說,在 Docker 中,容器的安全性有三個關鍵組成部分,它們相互作用構成本質上更安全的應用程式。
構建更安全的應用程式的一個關鍵因素是與系統和其他應用程式進行安全通訊,這通常需要證書、令牌、密碼和其他型別的驗證資訊憑證 —— 通常稱為應用程式涉密資訊。我們很高興可以推出 Docker Secrets,這是一個容器原生的解決方案,它是加強容器安全的可信賴交付元件,使用者可以在容器平臺上直接整合涉密資訊分發功能。
有了容器,現在應用程式是動態的,可以跨越多種環境移植。這使得現存的涉密資訊分發的解決方案略顯不足,因為它們都是針對靜態環境。不幸的是,這導致了應用程式涉密資訊管理不善的增加,在不安全的、土造的方案中(如將涉密資訊嵌入到 GitHub 這樣的版本控制系統或者同樣糟糕的其它方案),這種情況十分常見。
Docker 涉密資訊管理介紹
根本上我們認為,如果有一個標準的介面來訪問涉密資訊,應用程式就更安全了。任何好的解決方案也必須遵循安全性實踐,例如在傳輸的過程中,對涉密資訊進行加密;在不用的時候也對涉密資料進行加密;防止涉密資訊在應用最終使用時被無意洩露;並嚴格遵守最低許可權原則,即應用程式只能訪問所需的涉密資訊,不能多也不能不少。
透過將涉密資訊整合到 Docker 編排,我們能夠在遵循這些確切的原則下為涉密資訊的管理問題提供一種解決方案。
下圖提供了一個高層次檢視,並展示了 Docker swarm 樣式體系架構是如何將一種新型別的物件 —— 一個涉密資訊物件,安全地傳遞給我們的容器。
Docker Secrets Management
在 Docker 中,涉密資訊是任意的資料塊,比如密碼、SSH 金鑰、TLS 憑證,或者任何其他本質上敏感的資料。當你將一個涉密資訊加入 swarm 叢集(透過執行 docker secret create
)時,利用在引導新叢集時自動建立的內建證書頒發機構[1],Docker 透過相互認證的 TLS 連線將金鑰傳送給 swarm 叢集管理器。
$ echo "This is a secret" | docker secret create my_secret_data -
一旦,涉密資訊到達某個管理節點,它將被儲存到內部的 Raft 儲存區中。該儲存區使用 NACL 開源加密庫中的 Salsa20、Poly1305 加密演演算法生成的 256 位金鑰進行加密,以確保從來不會把任何涉密資訊資料寫入未加密的磁碟。將涉密資訊寫入到內部儲存,賦予了涉密資訊跟其它 swarm 叢集資料一樣的高可用性。
當 swarm 叢集管理器啟動時,包含涉密資訊的加密 Raft 日誌透過每一個節點獨有的資料金鑰進行解密。此金鑰以及用於與叢集其餘部分通訊的節點 TLS 證書可以使用一個叢集級的加密金鑰進行加密。該金鑰稱為“解鎖金鑰”,也使用 Raft 進行傳遞,將且會在管理器啟動的時候使用。
當授予新建立或執行的服務許可權訪問某個涉密資訊許可權時,其中一個管理器節點(只有管理器可以訪問被儲存的所有涉密資訊)會透過已經建立的 TLS 連線將其分發給正在執行特定服務的節點。這意味著節點自己不能請求涉密資訊,並且只有在管理器提供給他們的時候才能訪問這些涉密資訊 —— 嚴格地控制請求涉密資訊的服務。
$ docker service create --name="redis" --secret="my_secret_data" redis:alpine
未加密的涉密資訊被掛載到一個容器,該容器位於 /run/secrets/
的記憶體檔案系統中。
$ docker exec $(docker ps --filter name=redis -q) ls -l /run/secrets
total 4
-r--r--r-- 1 root root 17 Dec 13 22:48 my_secret_data
如果一個服務被刪除或者被重新安排在其他地方,叢集管理器將立即通知所有不再需要訪問該涉密資訊的節點,這些節點將不再有權訪問該應用程式的涉密資訊。
$ docker service update --secret-rm="my_secret_data" redis
$ docker exec -it $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data
cat: can't open '/run/secrets/my_secret_data': No such file or directory
檢視 Docker Secret 檔案[2]以獲取更多資訊和示例,瞭解如何建立和管理您的涉密資訊。同時,特別感謝 Laurens Van Houtven[3] 與 Docker 安全和核心團隊合作使這一特性成為現實。
透過 Docker 更安全地使用應用程式
Docker 涉密資訊旨在讓開發人員和 IT 運營團隊可以輕鬆使用,以用於構建和執行更安全的應用程式。它是首個被設計為既能保持涉密資訊保安,並且僅在特定的容器需要它來進行必要的涉密資訊操作的時候使用。從使用 Docker Compose 定義應用程式和涉密資料,到 IT 管理人員直接在 Docker Datacenter 中部署的 Compose 檔案,涉密資訊、網路和資料捲都將加密並安全地與應用程式一起傳輸。
更多相關學習資源:
via: https://blog.docker.com/2017/02/docker-secrets-management/
作者:Ying Li[9] 譯者:HardworkFish 校對:imquanquan, wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出