在傳統(tǒng)的研發(fā)中,我們經(jīng)常關(guān)注的「安全」包括代碼安全、機(jī)器(運(yùn)行環(huán)境)安全、網(wǎng)絡(luò)運(yùn)維安全,而隨著云原生時(shí)代的到來,如果還按原有的幾個(gè)維度切分的話,顯然容易忽略很多云原生環(huán)境引入的新挑戰(zhàn),我們需要基于網(wǎng)絡(luò)安全最佳實(shí)踐——縱深防御原則,來逐步剖析「云原生的安全」,并且對(duì)不同層次的防御手段有所了解,從而建立自己的云原生安全理念,真正搭建一個(gè)內(nèi)核安全的云原生系統(tǒng)。 |

注:“縱深防御”,指在計(jì)算機(jī)系統(tǒng)中的多個(gè)層面使用多種網(wǎng)絡(luò)安全技術(shù),從而減少攻擊者利用關(guān)鍵業(yè)務(wù)資源或信息泄露到系統(tǒng)外部的總體可能性。在消息傳遞和協(xié)作環(huán)境中,縱深防御體系可以確保惡意攻擊活動(dòng)被阻止在基礎(chǔ)結(jié)構(gòu)內(nèi)的多個(gè)檢查點(diǎn),降低了威脅進(jìn)入內(nèi)部網(wǎng)絡(luò)的可能性。
以某IDaaS系統(tǒng)為例,我們把一個(gè)云原生系統(tǒng)安全模型分為 4 個(gè)層面,由外至內(nèi)分別是:云/數(shù)據(jù)中心/網(wǎng)絡(luò)層、集群層、容器層、代碼層,如下圖所示:

對(duì)于這里安全模型的每一層,都是單向依賴于外層的。也就是說,外層的云、集群、容器安全如果做得好,代碼層的安全就可以受益,而反過來,我們是無法通過提高代碼層的安全性來彌補(bǔ)外層中存在的安全漏洞或問題;谏鲜鲞@一點(diǎn)原理,我們的縱深防御策略是「自外而內(nèi)」地進(jìn)行“設(shè)防”。
一、云/數(shù)據(jù)中心/網(wǎng)絡(luò)層安全
這一層也可以稱之為基礎(chǔ)設(shè)施安全,不管從何角度,公有或私有云或企業(yè)數(shù)據(jù)中心以及對(duì)應(yīng)的網(wǎng)絡(luò)安全,是 K8s 集群最根本的安全基礎(chǔ),如果這一層存在安全漏洞或者過于脆弱,則整個(gè)系統(tǒng)都不能在此基礎(chǔ)上保證組件的安全。
我們除了需要防御傳統(tǒng)的攻擊,如 ARP 偽裝、DDOS、網(wǎng)絡(luò)層各類報(bào)文等攻擊,應(yīng)該針對(duì) Kubernetes 集群采取以下保護(hù)措施:
不允許在 Internet 上公開對(duì) Kubernetes 管理平臺(tái)(Control Plane)的所有訪問,同時(shí)僅開放部分可信 IP 可以訪問 Kubernetes 管理 API。
所有節(jié)點(diǎn)只暴露指定的端口,包括對(duì)管理平臺(tái)的內(nèi)部端口和來自 NodePort 和 LoadBalancer 類型的 Kubernetes 服務(wù)的連接,并且不應(yīng)該直接暴露到 Internet。
通過云提供商或機(jī)房的網(wǎng)絡(luò)層安全組(例如 AWS 的 Security Group)對(duì)管理平臺(tái)以及節(jié)點(diǎn)授予最小權(quán)限控制:
對(duì)etcd(Kubernetes 的基礎(chǔ)存儲(chǔ))的訪問進(jìn)行嚴(yán)格控制(僅允許來自集群管理平臺(tái)的訪問),應(yīng)強(qiáng)制所有連接都使用TLS,并確保所有信息都是在持久化層被加密的(Encryption at rest)。

二、集群層
保護(hù) Kubernetes 集群有兩個(gè)主體需要關(guān)注:
集群與組件
運(yùn)行的服務(wù)或應(yīng)用
保護(hù) Kubernetes 集群組件與服務(wù)或應(yīng)用:
針對(duì)這兩個(gè)主體的保護(hù),我們的保護(hù)可以分為 4 大塊:管理 API 的訪問控制、Kubelet 的訪問控制、Runtime(運(yùn)行時(shí))工作負(fù)載或用戶功能的訪問控制、集群組件的安全漏洞防護(hù),如下圖所示。

管理 API 的訪問控制
Kubelet 的訪問控制
Runtime(運(yùn)行時(shí))工作負(fù)載或用戶功能的訪問控制
集群組件的安全漏洞防護(hù)
禁止未授權(quán)訪問 etcd
啟用審核日志記錄
定期輪換基礎(chǔ)架構(gòu)憑證
定期升級(jí)修復(fù)漏洞
三、容器層
到了這一層,由于跟 Kubernetes 特性不是強(qiáng)相關(guān),我們能提供一些通用的安全措施和建議:

四、代碼層
程序代碼層是最容易受攻擊,但也是最可控的部分之一。雖然一般負(fù)責(zé)這塊安全的人員不一定是運(yùn)維開發(fā)(DevOps),可能是專門的安全工程師(Sec Eng),但有一些基本共性理念和建議是可以互相借鑒的。

總體來說,云原生時(shí)代的這四層架構(gòu):云/數(shù)據(jù)中心/網(wǎng)絡(luò)層、集群層、容器層、代碼層,與傳統(tǒng)架構(gòu)比起來更加細(xì)化和更易受攻擊。自外而內(nèi)地踐行每一層的安全最佳實(shí)踐,我們的縱深防御才能算是成功的,每個(gè)在云原生技術(shù)上想長(zhǎng)期獲益的團(tuán)隊(duì)需要對(duì)此有共識(shí)。