Kubernetes從網路策略到安全策略_Kubernetes中文社群
編者注:今天的文章由 Bernard Van De Walle( Aporeto 公司 Kubernetes 專案帶頭人)撰寫,文章描述如何使用新的方法來實現 Kubernetes 網路策略。
Kubernetes 網路策略
Kubernetes 支援網路策略的新 API,為隔離應用和減少攻擊層面提供複雜的模型。這個功能由 SIG-Network group 演化而來,可以通過內建標籤和 Kubernetes 建立的選擇器,令定義網路策略變得輕鬆、優雅。
Kubernetes 將這個功能留給到第三方來實施這些網路策略,同時不需要提供預設實現。
我們希望引入一種新的方法來思考“安全”、“網路策略”。要說明的是,安全和可達性是兩個不同的問題:將
然而,我們也從過去的經驗中知道,使用外部控制面板也可以引入新的挑戰:ACL 的發行版本要求 Kubernetes workers 之間較高的同步性; 每當建立一個新的 Pod,其餘 Pod 上的 ACL 都需要進行更新,因為舊的 Pod 上面更新的 Pod 上的一些策略是相關的。當共享狀態機制能夠在小一些的規模中執行的時候,高度的相關性顯然是二次問題,在大規模叢集中,他們往往有匯聚性、安全性以及最終的一致性問題。
從網路策略到安全策略
在 Aporeto,我們使用不同的方法來實施網路策略,從策略那裡解耦網路。我們將我們的解決方案開源為 Trireme,旨在將網路策略轉化為授權策略,為 Pod 之間的交流實施透明的身份驗證和授權功能。相比於使用 ACL 或者濾包器來實施策略,Trireme 使用的是授權功能。在這樣的功能之下,容器使用跟策略要求匹配的身份只需要收到容器發過來的流量。Trireme 中,授權功能和驗證功能都覆蓋在 TCP 協調序列。身邊識別(一整套標籤)被俘獲為一個 JWT,由 local keys 標記,在 Syn/SynAck 協調中轉換。收到的 worker 驗證之後,JWT 被可信任授權機構(身份驗證步驟)標記,並且驗證接受連結策略的快取檔案。一旦接受連線,剩下通過 Linux 核心的流量,以及所有的保護策略有潛力提供服務(如果需要的話,也包括連線追蹤功能)。目前的實施使用簡單的使用者空間程式,可以捕捉最開始的協商資料包,並且附加授權資訊作為有效載荷。JWT 包括在 Ack 資料包期間驗證的 nonce,還能夠抵禦中間人攻擊、回方式攻擊。
Trireme 實施直接跟 Kubernetes master 交流,不需要外部 controller,在策略更新和 Pod 例項化的時候接收訊息提示,這樣的話就可以根據需要維護策略的本地快取,更新授權規則。在需要同步的 Trireme 元件之間沒有共享的狀態。Trireme 可以作為獨立的程序在每個 worker 上部署,也可以在每個 worker 上使用 Daemon Sets。在接下來的例子中,Kubernetes 擁有 Trireme Pod 的生命週期。
Trireme 的簡化來源於安全策略與網路傳輸的分離。不考慮用來進行 Pod 交流的網路組合,策略實施直接跟連線上呈現的標籤有關。這種身份識別給予運維人員極大的靈活性,即使沒有將安全策略實施到網路實施細節,也可以使用任意網路組合。同樣,聯邦叢集上的安全策略變得簡單、可行。
Kubernetes 和 Trireme 部署
Kubernetes 彈性擴容、為容器部署和微服務提供可擴充套件的安全支援這些方面有著獨一無二的地位。為實施這些策略,Trireme 提供簡單、安全、可排程機制。
通過使用提供的 Daemon Set,你可以嘗試在 Kubernetes 上部署 Trireme。你需要修改一些基於自己的叢集架構的 YAML 引數。所有的步驟可以點選這裡檢視,檔案中還包括了一個 3 層策略的例子,可以用來測試流量模式:https://github.com/aporeto-inc/trireme-kubernetes/tree/master/deployment。