Hashicorp Vault:安全性與複雜性的平衡
現代系統需要訪問大量的敏感信息如:資料庫訪問憑證,用於外部服務的API密鑰,面向服務架構的通信憑據等,這使得了解誰正在訪問什麼敏感信息變得非常困難,並且往往是特定於某個平台。如果沒有定製的解決方案,為系統添加密鑰滾動切換,安全存儲和詳細的審計日誌幾乎是不可能的。
Vault
HashiCorp的Vault是一個安全訪問Secrets的工具。Secrets是需要嚴格控制訪問許可權的任何內容,例如API密鑰,密碼,證書等。Vault為任何secret提供統一的介面,同時提供嚴格的訪問控制並記錄詳細的審計日誌。
其主要特性包括:
安全的Secrets存儲
任意鍵/值Secrets可以存儲在Vault中。Vault在將這些Secrets寫入永久存儲器之前對其加密,因此訪問原始存儲器無法直接訪問您的敏感信息。Vault可以將加密數據寫入磁碟,Consul等等。
動態的Secrets
Vault可以為某些系統(如AWS或SQL資料庫)動態生成訪問憑據。例如,當應用程序需要訪問MySQL資料庫時,它會向Vault詢問憑據,Vault將根據需要生成具有有效許可權的MySQL資料庫訪問密鑰對。創建這些動態訪問憑據之後,Vault還會在租期結束後自動撤銷這些憑據。
數據加密
Vault可以加密和解密數據而不存儲。這允許安全團隊定義加密參數,開發人員負責將加密的數據存儲在諸如SQL資料庫中而不必設計自己的加密方法。
租賃和續約(Leasing and Renewal)
Vault中的所有Secrets都具有與其關聯的租約。在租賃結束時,Vault會自動撤銷該Secret。客戶可以通過內置的更新API更新租約。
撤銷(Revocation)
Vault內置支持Secrets的撤銷。Vault不僅可以撤銷單個secret,而且可以撤銷Secrets樹,例如由特定用戶讀取的所有Secrets或特定類型的所有Secrets。撤銷功能可以協助Secrets的滾動切換以及在入侵的情況下鎖定系統。
Vault架構
在詳解上述架構之前,先來看一下Vault架構所涉及的幾個概念:
存儲後端(Storage Backend)
存儲後端負責加密數據的持久存儲。Vault不信任存儲後端,並且僅期望其提供持久性存儲功能。在啟動Vault伺服器時需要配置存儲後端。
屏障(Barrier)
屏障如同銀行保險庫的外層防護鋼殼和圍繞穹頂的混凝土。在Vault和存儲後端之間流動的所有數據都通過屏障。該屏障確保僅輸出加密數據,並且該數據在進入時被驗證和解密。任何內部數據可以訪問之前,障礙必須「開封」。
Secret後端(Secret Backend)
Secret後端負責管理Secrets。簡單的Secret後端像「generic」後端在查詢時簡單地返回相同的secret。某些後端支持使用策略在每次查詢時動態生成secret。這允許使用唯一的secret,可以讓Vault進行細粒度的撤銷和策略更新。例如,一個MySQL後端可以配置一個「web」策略。當讀取「web」密碼時,將生成一個新的MySQL用戶/密碼對,其僅具有Web伺服器的有限許可權集。
審計後端(Audit Backend)
審計後端負責管理審計日誌。來自Vault的每個請求和來自Vault的響應都將通過配置的審核後端。這提供了一種將Vault與不同類型的多個審核日誌記錄目標集成的簡單方法。
憑據後端(Credential Backend)
憑據後端用於驗證連接到Vault的用戶或應用程序。一旦驗證,後端返回應用的適用策略列表。Vault接受經過身份驗證的用戶,並返回可用於將來請求的客戶端令牌。例如,用戶密碼後端使用用戶名和密碼來認證用戶。
客戶端令牌(Client Token)
客戶端令牌在概念上類似於網站上的會話cookie。用戶驗證後,Vault會返回一個用於將來請求的客戶端令牌。Vault使用令牌驗證客戶端的身份並強制實施適用的ACL策略。此令牌通過HTTP頭傳遞。
Secret
Secret是Vault返回的包含機密或加密信息的任何內容。不是由Vault返回的所有內容都是Secret,例如系統配置,狀態信息或後端策略不被視為Secrets。Secret總是有相關的租約,這意味著客戶端不能假設Secret可以無限期地使用。Vault將在租賃結束時撤銷Secret,並且維護人員可以在租賃結束之前進行干預以撤銷Secret。
伺服器(Server)
Vault依賴於作為伺服器運行的長時間運行的實例。 Vault伺服器提供了一個API,客戶端與之交互並管理所有後端之間的交互,ACL實施和Secret租用撤銷。採用基於伺服器的架構可以客戶端與安全密鑰及策略分離,實現集中式審計日誌記錄並簡化操作員的管理。
再看上述Vault架構圖,從圖中可以看出組件被屏障Barrier清晰的隔離為內外兩部分。只有存儲後端和HTTP API位於外部,其他組件都位於屏障內部。存儲後端是不可信的,被Vault用來存儲加密後的數據。
Vault啟動時處於密封(「sealed」)狀態,在可以與其交互之前,Vault必須切換到啟封(「unsealed」)狀態。狀態切換需要提供啟封鑰匙。Vault初始化時會生成一把加密密鑰來保護所有的數據,這個加密密鑰受主鑰匙(master key)保護。默認情況下,Vault使用[Shamir的密鑰共享演算法](https://en.wikipedia.org/wiki/Shamir"s_Secret_Sharing)將主鑰匙拆分為5份,必須提供5個密鑰中任意3個來重建主鑰匙。
主鑰匙拆分的數量及用來重建主鑰匙的最低份數都可以設置,也可以禁用Shamir的密鑰共享演算法,這時需要使用主鑰匙直接啟封Vault。一旦Vault檢索到加密密鑰,它就能夠解密存儲後端中的數據,並進入啟封狀態。取消密封后,Vault會載入所有配置的審計,憑據和Secrets後端。
當客戶端首次連接到Vault時,需要進行身份驗證。 Vault提供可配置的憑據後端(Credential Backend),為客戶端提供靈活的身份驗證機制,如操作人員可使用用戶名/密碼,GitHub驗證,而應用可以使用公私鑰或Token令牌驗證。一個驗證請求從Vault內核進入憑據後端,由其校驗合法性並返回一個關聯的策略列表。
策略只是一個命名的ACL規則,例如,「root」策略是一個內置策略,具有所有資源的訪問許可權。可以創建任意數量的命名策略來細粒度的控制訪問路徑。Vault以白名單模式運作,除非透過策略明確授予存取許可權,否則不允許執行操作。由於用戶可能具有多個關聯的策略,因此如果任何一個策略允許,則允許操作。策略由內部策略存儲庫存儲和管理,此內部存儲通過系統後端操作,系統後端始終掛載在sys/下。
校驗過程中,憑據後端通過提供的策略進行驗證,如果驗證通過會生成一個新的客戶端令牌保存到令牌存儲,並返回給客戶端供後續請求使用。如果憑據後端的配置為客戶端令牌設定了租約,則該客戶端令牌必須周期性的生成以避免變得無效。
校驗通過後,所有的請求必須提供令牌,通過令牌可以校驗客戶端是否得到授權並載入相關的策略,載入的策略用於校驗用戶特定操作是否得到授權。操作請求隨後路由到Secrets後端,由其根據自身類型進行相應的處理。如果Secrets後端返回了一個secret,Vault內核會將其註冊到過期管理服務並為其附加一個租用ID。客戶端可以使用這個租用ID來撤銷或重新生成其secret,如果客戶端允許租約自動過期,則由過期管理服務負責secret的到期撤銷。
Vault內核負責記錄請求和響應並發送給審計匯流排,再由其存儲到審計後端。在請求處理流程之外,Vault內核負責某些後台操作,如關鍵的租約管理可以撤銷客戶端令牌和自動撤銷Secrets。此外,Vault通過使用回滾管理器使用預寫寫日誌(write ahead logging)來處理某些部分故障情況的恢復。
工作流程
以下是從Hashicorp Vault中存儲和檢索Secret機密信息的工作流程:
使用Hashicorp Vault的明顯缺點是額外的複雜性 - 即使使用簡單的設置和有限的功能,仍然需要團隊成員負責維護和管理訪問列表和Vault伺服器本身。
然而,在具有較高安全性要求的項目中,效益可能是巨大的。Vault遵循Hashicorp的優雅的解決方案設計原則,以獨立的方式分離不同的身份驗證和秘密存儲後端。它允許根據需要對Secret機密信息進行細粒度控制,可以在文件夾中為每個Secret或每組Secret定義策略和TTL設置。此外,Enterprise版本還提供技術支持,並允許跨多個數據中心進行複製。它是自主託管的,限制了對外部供應商的依賴,它是開源的,允許審核員根據需要評估代碼,以證明解決方案的安全性。
Secret Backends
AWS
Cassandra
Consul
Cubbyhole
Generic
MongoDB
MSSQL
MySQL
PKI (Certificates)
PostgreSQL
RabbitMQ
SSH
Transit
Custom
Auth Backends
App ID
AppRole
AWS EC2
GitHub
LDAP
MFA
Okta
RADIUS
TLS Certificates
Tokens
Username & Password
Audit Backends
File
Syslog
Socket
更多信息,請參考Hashicorp Vault的官方文檔。
※DCOS中的服務發現與負載均衡
※在DCOS中搭建私有DOCKER鏡像倉庫
TAG:領域修鍊之路 |