作者介紹:陳偉嘉,畢業于加州大學爾灣分校,曾就職于Facebook、Splunk,現任玉符科技 CTO,負責玉符 IDaaS 技術架構設計和實作,帶領研發團隊從 0 到 1 實作産品自主研發,搭建無狀态化支援、輕量化容器打包、運維自動化等微服務架構。
在傳統的研發中,我們經常關注的「安全」包括代碼安全、機器(運作環境)安全、網絡運維安全,而随着雲原生時代的到來,如果還按原有的幾個次元切分的話,顯然容易忽略很多雲原生環境引入的新挑戰,我們需要基于網絡安全最佳實踐——縱深防禦原則,來逐漸剖析「雲原生的安全」,并且對不同層次的防禦手段有所了解,進而建立自己的雲原生安全理念,真正搭建一個核心安全的雲原生系統。
注:“縱深防禦”,指在計算機系統中的多個層面使用多種網絡安全技術,進而減少攻擊者利用關鍵業務資源或資訊洩露到系統外部的總體可能性。在消息傳遞和協作環境中,縱深防禦體系可以確定惡意攻擊活動被阻止在基礎結構内的多個檢查點,降低了威脅進入内部網絡的可能性。
以 玉符 IDaaS系統為例,我們把一個雲原生系統安全模型分為 4 個層面,由外至内分别是:雲/資料中心/網絡層、叢集層、容器層、代碼層,如下圖所示:

對于這裡安全模型的每一層,都是單向依賴于外層的。也就是說,外層的雲、叢集、容器安全如果做得好,代碼層的安全就可以受益,而反過來,我們是無法通過提高代碼層的安全性來彌補外層中存在的安全漏洞或問題。
基于上述這一點原理,我們的縱深防禦政策是「自外而内」地進行“設防”。
一、雲/資料中心/網絡層安全
這一層也可以稱之為基礎設施安全,不管從何角度,公有或私有雲或企業資料中心以及對應的網絡安全,是 K8s 叢集最根本的安全基礎,如果這一層存在安全漏洞或者過于脆弱,則整個系統都不能在此基礎上保證元件的安全。
我們除了需要防禦傳統的攻擊,如 ARP 僞裝、DDOS、網絡層各類封包等攻擊,應該針對 Kubernetes 叢集采取以下保護措施:
1. 不允許在 Internet 上公開對 Kubernetes 管理平台(Control Plane)的所有通路,同時僅開放部分可信 IP 可以通路 Kubernetes 管理 API。
2. 所有節點隻暴露指定的端口,包括對管理平台的内部端口和來自 NodePort 和 LoadBalancer 類型的 Kubernetes 服務的連接配接,并且不應該直接暴露到 Internet。
3. 通過雲提供商或機房的網絡層安全組(例如 AWS 的 Security Group)對管理平台以及節點授予最小權限控制:
4. 對etcd(Kubernetes 的基礎存儲)的通路進行嚴格控制(僅允許來自叢集管理平台的通路),應強制所有連接配接都使用TLS,并確定所有資訊都是在持久化層被加密的(Encryption at rest)。
二、叢集層
保護 Kubernetes 叢集有兩個主體需要關注:
- 叢集與元件
- 運作的服務或應用
針對這兩個主體的保護,我們的保護可以分為 4 大塊:管理 API 的通路控制、Kubelet 的通路控制、Runtime(運作時)工作負載或使用者功能的通路控制、叢集元件的安全漏洞防護,如下圖所示。
1. 管理 API 的通路控制
a. 強制 TLS 保護傳輸層
b. 強制 API 認證
c. 強制 API 授權機制(RBAC)
2. Kubelet 的通路控制
a. 生産環境啟用身份驗證
b. 身份授權(RBAC)
c. 強制 TLS 保護傳輸層
3. Runtime(運作時)工作負載或使用者功能的通路控制
a. 限制使用特權容器
b. 合理限制資源負載
c. 防止加載非必要核心子產品
d. 限制 Pod 越權通路其他節點
e. 基礎資料憑證的通路控制
4. 叢集元件的安全漏洞防護
a. 禁止未授權通路 etcd
b. 啟用稽核日志記錄
c. 定期輪換基礎架構憑證
d. 定期更新修複漏洞
三、容器層
到了這一層,由于跟 Kubernetes 特性不是強相關,我們能提供一些通用的安全措施和建議:
四、代碼層
程式代碼層是最容易受攻擊,但也是最可控的部分之一。雖然一般負責這塊安全的人員不一定是運維開發(DevOps),可能是專門的安全工程師(Sec Eng),但有一些基本共性理念和建議是可以互相借鑒的。
總體來說,雲原生時代的這四層架構:雲/資料中心/網絡層、叢集層、容器層、代碼層,與傳統架構比起來更加細化和更易受攻擊。自外而内地踐行每一層的安全最佳實踐,我們的縱深防禦才能算是成功的,每個在雲原生技術上想長期獲益的團隊需要對此有共識。
參考資料:
[1]https://baike.baidu.com/item/%E7%BA%B5%E6%B7%B1%E9%98%B2%E5%BE%A1/8282191?fr=aladdin
[2]https://kubernetes.io/docs/concepts/security/overview/
[3]https://www.stackrox.com/post/2020/09/protecting-against-kubernetes-threats-chapter-8-lateral-movement/