從網(wǎng)絡(luò)安全視角看如何保護(hù) Kubernetes 集群安全
Kubernetes 已成為容器編排的事實(shí)標(biāo)準(zhǔn),但其復(fù)雜架構(gòu)帶來(lái)了諸多安全挑戰(zhàn),企業(yè)必須主動(dòng)應(yīng)對(duì)。保護(hù) Kubernetes 集群需要采用多層防御策略,涵蓋控制平面防護(hù)、強(qiáng)認(rèn)證機(jī)制、網(wǎng)絡(luò)分段、密鑰管理和持續(xù)監(jiān)控。
本指南基于 CIS Kubernetes 基準(zhǔn)和 NIST 網(wǎng)絡(luò)安全框架等行業(yè)標(biāo)準(zhǔn),提供 Kubernetes 環(huán)境中企業(yè)級(jí)安全防護(hù)的技術(shù)實(shí)現(xiàn)與優(yōu)秀實(shí)踐。
一、控制平面安全基礎(chǔ)
Kubernetes 控制平面是集群的中樞神經(jīng)系統(tǒng),其安全性直接關(guān)系到整個(gè)集群的完整性。控制平面加固應(yīng)從限制 API 服務(wù)器訪問(wèn)和實(shí)施全面加密策略開始。
1. API 服務(wù)器加固
未經(jīng)適當(dāng)訪問(wèn)控制,kube-apiserver 絕不應(yīng)直接暴露在互聯(lián)網(wǎng)上??赏ㄟ^(guò)簡(jiǎn)單 curl 命令測(cè)試 API 服務(wù)器的暴露情況:
curl https://my-control-plane-ip:6443/api
若獲得響應(yīng),則表明 API 服務(wù)器可公開訪問(wèn),需立即修復(fù)。建議通過(guò)防火墻規(guī)則或安全組將訪問(wèn)限制在內(nèi)網(wǎng)或企業(yè) VPN。
關(guān)鍵 API 服務(wù)器安全配置包括啟用 TLS 加密和證書管理。CIS Kubernetes 基準(zhǔn)要求為 kube-apiserver 設(shè)置以下參數(shù):
# 關(guān)鍵 kube-apiserver 安全參數(shù)
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key
--client-ca-file=/etc/kubernetes/pki/ca.crt
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
2. 靜態(tài)數(shù)據(jù)加密
Etcd 數(shù)據(jù)加密為敏感集群信息提供關(guān)鍵保護(hù)。通過(guò)創(chuàng)建 EncryptionConfiguration 對(duì)象配置加密:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <32字節(jié)base64編碼密鑰>
- identity: {}
創(chuàng)建配置后,使用指向該文件的--encryption-provider-config參數(shù)重啟 kube-apiserver。這將確保所有密鑰在存入 etcd 前均被加密,防范備份泄露導(dǎo)致的數(shù)據(jù)暴露風(fēng)險(xiǎn)。
二、基于角色的訪問(wèn)控制實(shí)施
RBAC(Role-Based Access Control)是 Kubernetes 授權(quán)的基石,在集群資源上實(shí)施最小權(quán)限原則。正確配置 RBAC 可防止未授權(quán)訪問(wèn)并限制潛在安全事件的影響范圍。
1. 創(chuàng)建細(xì)粒度角色
首先定義符合組織職責(zé)的特定角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
此配置授予 production 命名空間內(nèi) pod 的只讀權(quán)限,體現(xiàn)了細(xì)粒度權(quán)限分配原則。除非絕對(duì)必要,否則應(yīng)避免授予集群范圍的管理權(quán)限,這會(huì)顯著增加安全風(fēng)險(xiǎn)。
2. 服務(wù)賬戶安全
為應(yīng)用程序創(chuàng)建僅含必要權(quán)限的專用服務(wù)賬戶:
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: application
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: application
name: app-role
rules:
- apiGroups: [""]
resources: ["configmaps", "secrets"]
verbs: ["get"]
此方法確保應(yīng)用程序僅以必要權(quán)限運(yùn)行,從而減少潛在攻擊面。
三、網(wǎng)絡(luò)安全與分段
網(wǎng)絡(luò)策略提供關(guān)鍵的微隔離能力,控制 Pod 間及與外部資源的流量。實(shí)施全面的網(wǎng)絡(luò)策略可構(gòu)建縱深防御,防范橫向移動(dòng)攻擊。
1. 默認(rèn)拒絕網(wǎng)絡(luò)策略
通過(guò)實(shí)施默認(rèn)拒絕策略建立基線安全態(tài)勢(shì):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
該策略默認(rèn)阻止所有流量,僅允許明確規(guī)則的必需通信。
2. 選擇性允許策略
為必要通信創(chuàng)建特定策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web-to-api
namespace: production
spec:
podSelector:
matchLabels:
app: api-server
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: web-frontend
ports:
- protocol: TCP
port: 8080
此配置僅允許 web 前端 Pod 通過(guò) 8080 端口與 API 服務(wù)器通信,實(shí)現(xiàn)精確流量控制。
四、密鑰管理與保護(hù)
Kubernetes 密鑰需要謹(jǐn)慎處理,以防憑證泄露并確保應(yīng)用生命周期中的安全完整性。
1. 外部密鑰管理集成
與外部密鑰管理系統(tǒng)集成以增強(qiáng)安全性:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-backend
namespace: production
spec:
provider:
vault:
server: "https://vault.company.com"
path: "secret"
auth:
kubernetes:
mountPath: "kubernetes"
role: "production-role"
外部密鑰存儲(chǔ)提供自動(dòng)輪換、審計(jì)日志和集中管理等高級(jí)功能。
2. 密鑰輪換自動(dòng)化
使用 kubectl 和自定義腳本實(shí)現(xiàn)密鑰自動(dòng)輪換:
#!/bin/bash
# 自動(dòng)密鑰輪換腳本
kubectl create secret generic db-credentials \
--from-literal=username=$NEW_USERNAME \
--from-literal=password=$NEW_PASSWORD \
--dry-run=client -o yaml | kubectl apply -f -
kubectl rollout restart deployment/application
此方法確保密鑰定期更新而無(wú)需人工干預(yù)。
五、Pod 安全標(biāo)準(zhǔn)實(shí)施
Pod 安全標(biāo)準(zhǔn)取代已棄用的 PodSecurityPolicies,通過(guò)準(zhǔn)入控制器提供全面的工作負(fù)載保護(hù)。
1. 受限安全配置
為生產(chǎn)工作負(fù)載配置最嚴(yán)格的安全策略:
apiVersion: v1
kind: Namespace
metadata:
name: secure-production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
此配置強(qiáng)制執(zhí)行受限策略,防止權(quán)限提升并實(shí)施安全最佳實(shí)踐。
2. 自定義安全上下文
定義顯式安全上下文以增強(qiáng)保護(hù):
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
spec:
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001
fsGroup: 10001
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
這些設(shè)置可防止權(quán)限提升,并將容器能力限制在必需功能范圍內(nèi)。
2. 安全監(jiān)控與威脅檢測(cè)
持續(xù)監(jiān)控提供集群安全事件和潛在威脅的實(shí)時(shí)可見性。部署 Falco 進(jìn)行運(yùn)行時(shí)安全監(jiān)控:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: falco
spec:
selector:
matchLabels:
app: falco
template:
spec:
containers:
- name: falco
image: falcosecurity/falco:latest
securityContext:
privileged: true
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
Falco 可檢測(cè)異常行為,包括未授權(quán)系統(tǒng)調(diào)用、權(quán)限提升和可疑網(wǎng)絡(luò)活動(dòng)。
六、合規(guī)性與漏洞管理
定期合規(guī)審計(jì)確保符合安全框架要求并識(shí)別配置偏差。使用 Trivy 進(jìn)行全面的漏洞掃描:
# 掃描集群漏洞和錯(cuò)誤配置
trivy k8s --report=summary cluster
# 掃描特定命名空間
trivy k8s -n production --severity=CRITICAL --report=all
Trivy 可識(shí)別容器鏡像漏洞、Kubernetes 配置問(wèn)題以及違反 CIS 基準(zhǔn)的情況。
七、總結(jié)
保護(hù) Kubernetes 集群安全需要在所有架構(gòu)組件上實(shí)施多層防護(hù)。通過(guò)加固控制平面、實(shí)施強(qiáng)健的 RBAC 策略、建立網(wǎng)絡(luò)分段、安全管理密鑰、執(zhí)行 Pod 安全標(biāo)準(zhǔn)以及持續(xù)監(jiān)控,企業(yè)可實(shí)現(xiàn)企業(yè)級(jí)安全防護(hù)。定期合規(guī)審計(jì)和漏洞評(píng)估確保對(duì)不斷演變的威脅提供持續(xù)保護(hù)。成功的關(guān)鍵在于將安全視為開發(fā)和部署流程的組成部分,而非事后補(bǔ)救。這需要安全團(tuán)隊(duì)與 DevOps 工程師協(xié)作,在保障安全的同時(shí)維持運(yùn)營(yíng)效率。