Kubernetes 已成为容器编排的事实标准,但其复杂架构带来了诸多安全挑战,企业必须主动应对。保护 Kubernetes 集群需要采用多层防御策略,涵盖控制平面防护、强认证机制、网络分段、密钥管理和持续监控。本指南基于 CIS Kubernetes 基准和 NIST 网络安全框架等行业标准,提供 Kubernetes 环境中企业级安全防护的技术实现与最佳实践。
Part01
控制平面安全基础
Kubernetes 控制平面是集群的中枢神经系统,其安全性直接关系到整个集群的完整性。控制平面加固应从限制 API 服务器访问和实施全面加密策略开始。
API服务器加固
未经适当访问控制,kube-apiserver 绝不应直接暴露在互联网上。可通过简单 curl 命令测试 API 服务器的暴露情况:
curl https://my-control-plane-ip:6443/api
若获得响应,则表明 API 服务器可公开访问,需立即修复。建议通过防火墙规则或安全组将访问限制在内网或企业 VPN。
关键 API 服务器安全配置包括启用 TLS 加密和证书管理。CIS Kubernetes 基准要求为 kube-apiserver 设置以下参数:
# 关键 kube-apiserver 安全参数
--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
静态数据加密
Etcd 数据加密为敏感集群信息提供关键保护。通过创建 EncryptionConfiguration 对象配置加密:
apiVersion:apiserver.config.k8s.io/v1
kind:EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <32字节base64编码密钥>
- identity: {}
创建配置后,使用指向该文件的
--encryption-provider-config
参数重启 kube-apiserver。这将确保所有密钥在存入 etcd 前均被加密,防范备份泄露导致的数据暴露风险。
Part02
基于角色的访问控制实施
RBAC(Role-Based Access Control)是 Kubernetes 授权的基石,在集群资源上实施最小权限原则。正确配置 RBAC 可防止未授权访问并限制潜在安全事件的影响范围。
创建细粒度角色
首先定义符合组织职责的特定角色:
a
piVersion: rbac.authorization.k8s.io/v1
kind: R
ole
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 命名空间内 pod 的只读权限,体现了细粒度权限分配原则。除非绝对必要,否则应避免授予集群范围的管理权限,这会显著增加安全风险。
服务账户安全
为应用程序创建仅含必要权限的专用服务账户:
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"]
此方法确保应用程序仅以必要权限运行,从而减少潜在攻击面。
Part03
网络安全与分段
网络策略提供关键的微隔离能力,控制 Pod 间及与外部资源的流量。实施全面的网络策略可构建纵深防御,防范横向移动攻击。
默认拒绝网络策略
通过实施默认拒绝策略建立基线安全态势:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
该策略默认阻止所有流量,仅允许明确规则的必需通信。
选择性允许策略
为必要通信创建特定策略:
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 通过 8080 端口与 API 服务器通信,实现精确流量控制。
Part04
密钥管理与保护
Kubernetes 密钥需要谨慎处理,以防凭证泄露并确保应用生命周期中的安全完整性。
外部密钥管理集成
与外部密钥管理系统集成以增强安全性:
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"
外部密钥存储提供自动轮换、审计日志和集中管理等高级功能。
密钥轮换自动化
使用 kubectl 和自定义脚本实现密钥自动轮换:
# 自动密钥轮换脚本
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
此方法确保密钥定期更新而无需人工干预。
Part05
Pod 安全标准实施
Pod 安全标准取代已弃用的 PodSecurityPolicies,通过准入控制器提供全面的工作负载保护。
受限安全配置
为生产工作负载配置最严格的安全策略:
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
此配置强制执行受限策略,防止权限提升并实施安全最佳实践。
自定义安全上下文
定义显式安全上下文以增强保护:
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
这些设置可防止权限提升,并将容器能力限制在必需功能范围内。
Part06
安全监控与威胁检测
持续监控提供集群安全事件和潜在威胁的实时可见性。部署 Falco 进行运行时安全监控:
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 可检测异常行为,包括未授权系统调用、权限提升和可疑网络活动。
Part07
合规性与漏洞管理
定期合规审计确保符合安全框架要求并识别配置偏差。使用 Trivy 进行全面的漏洞扫描:
# 扫描集群漏洞和错误配置
trivy k8s --report=summary cluster
# 扫描特定命名空间
trivy k8s -n production --severity=CRITICAL --report=all
Trivy 可识别容器镜像漏洞、Kubernetes 配置问题以及违反 CIS 基准的情况。
Part08
总结
保护 Kubernetes 集群安全需要在所有架构组件上实施多层防护。通过加固控制平面、实施强健的 RBAC 策略、建立网络分段、安全管理密钥、执行 Pod 安全标准以及持续监控,企业可实现企业级安全防护。定期合规审计和漏洞评估确保对不断演变的威胁提供持续保护。
成功的关键在于将安全视为开发和部署流程的组成部分,而非事后补救。这需要安全团队与 DevOps 工程师协作,在保障安全的同时维持运营效率。
参考来源:
How to Secure Kubernetes Clusters – A Cybersecurity Perspectivehttps://cybersecuritynews.com/secure-kubernetes-clusters/
电台讨论![从网络安全视角看如何保护Kubernetes集群安全 从网络安全视角看如何保护Kubernetes集群安全]()
原文始发于微信公众号(FreeBuf):从网络安全视角看如何保护Kubernetes集群安全
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论