云原生安全模型與實踐
在傳統(tǒng)的研發(fā)中,我們經(jīng)常關(guān)注的「安全」包括代碼安全、機(jī)器(運(yùn)行環(huán)境)安全、網(wǎng)絡(luò)運(yùn)維安全,而隨著云原生時代的到來,如果還按原有的幾個維度切分的話,顯然容易忽略很多云原生環(huán)境引入的新挑戰(zhàn),我們需要基于網(wǎng)絡(luò)安全最佳實踐——縱深防御原則,來逐步剖析「云原生的安全」,并且對不同層次的防御手段有所了解,從而建立自己的云原生安全理念,真正搭建一個內(nèi)核安全的云原生系統(tǒng)。
注:“縱深防御”,指在計算機(jī)系統(tǒng)中的多個層面使用多種網(wǎng)絡(luò)安全技術(shù),從而減少攻擊者利用關(guān)鍵業(yè)務(wù)資源或信息泄露到系統(tǒng)外部的總體可能性。在消息傳遞和協(xié)作環(huán)境中,縱深防御體系可以確保惡意攻擊活動被阻止在基礎(chǔ)結(jié)構(gòu)內(nèi)的多個檢查點,降低了威脅進(jìn)入內(nèi)部網(wǎng)絡(luò)的可能性。 |
以某IDaaS系統(tǒng)為例,我們把一個云原生系統(tǒng)安全模型分為 4 個層面,由外至內(nèi)分別是:云/數(shù)據(jù)中心/網(wǎng)絡(luò)層、集群層、容器層、代碼層,如下圖所示:
對于這里安全模型的每一層,都是單向依賴于外層的。也就是說,外層的云、集群、容器安全如果做得好,代碼層的安全就可以受益,而反過來,我們是無法通過提高代碼層的安全性來彌補(bǔ)外層中存在的安全漏洞或問題?;谏鲜鲞@一點原理,我們的縱深防御策略是「自外而內(nèi)」地進(jìn)行“設(shè)防”。
一、云/數(shù)據(jù)中心/網(wǎng)絡(luò)層安全
這一層也可以稱之為基礎(chǔ)設(shè)施安全,不管從何角度,公有或私有云或企業(yè)數(shù)據(jù)中心以及對應(yīng)的網(wǎng)絡(luò)安全,是 K8s 集群最根本的安全基礎(chǔ),如果這一層存在安全漏洞或者過于脆弱,則整個系統(tǒng)都不能在此基礎(chǔ)上保證組件的安全。
我們除了需要防御傳統(tǒng)的攻擊,如 ARP 偽裝、DDOS、網(wǎng)絡(luò)層各類報文等攻擊,應(yīng)該針對 Kubernetes 集群采取以下保護(hù)措施:
- 不允許在 Internet 上公開對 Kubernetes 管理平臺(Control Plane)的所有訪問,同時僅開放部分可信 IP 可以訪問 Kubernetes 管理 API。
- 所有節(jié)點只暴露指定的端口,包括對管理平臺的內(nèi)部端口和來自 NodePort 和 LoadBalancer 類型的 Kubernetes 服務(wù)的連接,并且不應(yīng)該直接暴露到 Internet。
- 通過云提供商或機(jī)房的網(wǎng)絡(luò)層安全組(例如 AWS 的 Security Group)對管理平臺以及節(jié)點授予最小權(quán)限控制:

- 對etcd(Kubernetes 的基礎(chǔ)存儲)的訪問進(jìn)行嚴(yán)格控制(僅允許來自集群管理平臺的訪問),應(yīng)強(qiáng)制所有連接都使用TLS,并確保所有信息都是在持久化層被加密的(Encryption at rest)。
二、集群層
保護(hù) Kubernetes 集群有兩個主體需要關(guān)注:
- 集群與組件
- 運(yùn)行的服務(wù)或應(yīng)用
保護(hù) Kubernetes 集群組件與服務(wù)或應(yīng)用:
針對這兩個主體的保護(hù),我們的保護(hù)可以分為 4 大塊:管理 API 的訪問控制、Kubelet 的訪問控制、Runtime(運(yùn)行時)工作負(fù)載或用戶功能的訪問控制、集群組件的安全漏洞防護(hù),如下圖所示。

(1) 管理 API 的訪問控制
- 強(qiáng)制 TLS 保護(hù)傳輸層
- 強(qiáng)制 API 認(rèn)證
- 強(qiáng)制 API 授權(quán)機(jī)制(RBAC)
(2) Kubelet 的訪問控制
- 生產(chǎn)環(huán)境啟用身份驗證
- 身份授權(quán)(RBAC)
- 強(qiáng)制 TLS 保護(hù)傳輸層
(3) Runtime(運(yùn)行時)工作負(fù)載或用戶功能的訪問控制
- 限制使用特權(quán)容器
- 合理限制資源負(fù)載
- 防止加載非必要內(nèi)核模塊
- 限制 Pod 越權(quán)訪問其他節(jié)點
- 基礎(chǔ)數(shù)據(jù)憑證的訪問控制
(4) 集群組件的安全漏洞防護(hù)
- 禁止未授權(quán)訪問 etcd
- 啟用審核日志記錄
- 定期輪換基礎(chǔ)架構(gòu)憑證
- 定期升級修復(fù)漏洞
三、容器層
到了這一層,由于跟 Kubernetes 特性不是強(qiáng)相關(guān),我們能提供一些通用的安全措施和建議:
四、代碼層
程序代碼層是最容易受攻擊,但也是最可控的部分之一。雖然一般負(fù)責(zé)這塊安全的人員不一定是運(yùn)維開發(fā)(DevOps),可能是專門的安全工程師(Sec Eng),但有一些基本共性理念和建議是可以互相借鑒的。
總體來說,云原生時代的這四層架構(gòu):云/數(shù)據(jù)中心/網(wǎng)絡(luò)層、集群層、容器層、代碼層,與傳統(tǒng)架構(gòu)比起來更加細(xì)化和更易受攻擊。自外而內(nèi)地踐行每一層的安全最佳實踐,我們的縱深防御才能算是成功的,每個在云原生技術(shù)上想長期獲益的團(tuán)隊需要對此有共識。
參考資料:
- https://baike.baidu.com/item/%E7%BA%B5%E6%B7%B1%E9%98%B2%E5%BE%A1/8282191?fr=aladdin
- https://kubernetes.io/docs/concepts/security/overview/
- https://www.stackrox.com/post/2020/09/protecting-against-kubernetes-threats-chapter-8-lateral-movement/