1. Kubernetes安全机制全景解读
在容器编排领域摸爬滚打多年后,我深刻体会到:Kubernetes集群的安全性不是某个独立功能点,而是一套环环相扣的防御体系。就像建造城堡需要城墙、护城河和哨兵协同工作一样,K8s的安全机制也需要从API访问控制到运行时防护形成完整闭环。最近帮某金融客户排查的一次安全事件就很典型——攻击者利用默认ServiceAccount权限横向移动,最终窃取了敏感数据。这促使我系统梳理了K8s的四大安全支柱:
- 认证(Authentication):解决"你是谁"的问题,包括客户端证书、Bearer Token、OpenID Connect等验证方式
- 授权(Authorization):明确"你能做什么",通过RBAC、ABAC等模型控制资源访问
- 准入控制(Admission Control):在请求持久化前进行拦截校验,如资源配额检查、Pod安全策略
- 运行时安全:保护实际运行的容器和节点,包括网络策略、Secrets加密、镜像签名验证等
关键认知:K8s安全是"默认拒绝"模式,所有请求必须通过认证授权链条。但危险往往来自过度宽松的默认配置,比如自动挂载的ServiceAccount令牌。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 认证机制深度拆解
2.1 客户端证书认证实战
生产环境最可靠的认证方式莫过于双向TLS认证。通过以下命令生成CA和客户端证书:
bash复制# 生成CA私钥和证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/CN=K8S-CA" -out ca.crt
# 生成admin用户证书
openssl req -new -nodes -newkey rsa:2048 -keyout admin.key -subj "/CN=admin/O=system:masters" -out admin.csr
openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out admin.crt -days 365
在kube-apiserver启动参数中需配置:
code复制--client-ca-file=/path/to/ca.crt
--tls-cert-file=/path/to/apiserver.crt
--tls-private-key-file=/path/to/apiserver.key
常见踩坑点:
- 证书CN字段必须符合K8s用户命名规范,组信息通过O字段设置
- system:masters组会绕过RBAC授权,仅限集群管理员使用
- 证书过期会导致API调用突然失败,建议用kubelet证书轮换机制
2.2 ServiceAccount令牌安全
每个Namespace下默认创建的ServiceAccount会自动挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount。通过这个令牌,容器内应用可以访问K8s API。危险之处在于:
- 默认令牌没有过期时间
- 令牌权限可能过大(取决于绑定的RBAC规则)
- 令牌泄露导致持久化后门
加固方案:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: restricted-sa
automountServiceAccountToken: false # 禁止自动挂载
同时建议:
- 为不同工作负载创建专属ServiceAccount
- 定期轮换令牌(K8s 1.21+支持Bound Service Account Tokens)
- 通过RBAC实施最小权限原则
3. RBAC授权模型精讲
3.1 角色与绑定实践
RBAC的核心资源包括:
- Role/ClusterRole:定义权限规则
- RoleBinding/ClusterRoleBinding:将角色绑定到主体
典型财务系统权限分离案例:
yaml复制# 定义只能读取财务Namespace的Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: finance
name: finance-reader
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
# 将Role绑定到特定组
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-finance
namespace: finance
subjects:
- kind: Group
name: "finance-auditors"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: finance-reader
apiGroup: rbac.authorization.k8s.io
3.2 权限提升风险防控
通过kubectl auth can-i命令可以检查权限:
bash复制kubectl auth can-i create deployments --as=system:serviceaccount:default:default
需要特别防范:
- create pods/exec权限可能逃逸到节点
- update secrets权限可能导致凭证泄露
- escalate动词允许角色权限提升
推荐使用RBAC可视化工具如RBAC Lens定期审计。
4. 准入控制实战策略
4.1 Pod安全策略替代方案
虽然PSP已在K8s 1.25弃用,但通过准入控制器仍可实现类似控制。例如使用OPA Gatekeeper定义约束:
yaml复制apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: require-cost-center
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels: ["cost-center"]
4.2 动态准入控制案例
开发环境需要强制添加资源限制的Webhook示例:
go复制func mutatePod(ar v1.AdmissionReview) *v1.AdmissionResponse {
pod := &corev1.Pod{}
if err := json.Unmarshal(ar.Request.Object.Raw, pod); err != nil {
return denyRequest(err)
}
patch := []map[string]interface{}{}
for i := range pod.Spec.Containers {
if pod.Spec.Containers[i].Resources.Limits == nil {
patch = append(patch, map[string]interface{}{
"op": "add",
"path": fmt.Sprintf("/spec/containers/%d/resources", i),
"value": map[string]interface{}{
"limits": map[string]string{"cpu": "500m", "memory": "512Mi"},
"requests": map[string]string{"cpu": "100m", "memory": "128Mi"},
},
})
}
}
patchBytes, _ := json.Marshal(patch)
return &v1.AdmissionResponse{
Allowed: true,
Patch: patchBytes,
PatchType: func() *v1.PatchType {
pt := v1.PatchTypeJSONPatch
return &pt
}(),
}
}
5. 运行时安全加固
5.1 网络策略精细化控制
隔离前端与数据库服务的NetworkPolicy示例:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-to-db
spec:
podSelector:
matchLabels:
role: frontend
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
role: db
ports:
- protocol: TCP
port: 5432
5.2 镜像安全扫描集成
在CI/CD流水线中集成Trivy扫描:
bash复制# 扫描镜像漏洞
trivy image --severity CRITICAL my-app:latest
# 检查敏感信息
trivy image --security-checks secret my-app:latest
建议将扫描结果与K8s准入控制联动,拒绝存在高危漏洞的镜像部署。
6. 安全监控与审计
启用API审计日志的kube-apiserver配置:
yaml复制apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
verbs: ["create", "update", "patch", "delete"]
- level: RequestResponse
resources:
- group: "rbac.authorization.k8s.io"
omitStages: ["RequestReceived"]
配合Falco实现异常行为检测:
yaml复制- rule: Unexpected K8s NodePort Connection
desc: Detect connections to NodePort services from outside expected subnets
condition: >
evt.type=connect and k8s.ns.name!="kube-system" and
fd.sport=30000-32767 and not cidr_match(fd.cip, "10.0.0.0/8")
output: Unexpected NodePort connection (user=%user.name pod=%k8s.pod.name)
priority: WARNING
在安全运营中,我发现最有效的策略是"纵深防御+持续监控"。曾经有次攻击者通过某应用的RCE漏洞进入了容器,但由于我们实施了网络策略隔离、文件系统只读挂载和系统调用限制,最终攻击者没能横向移动。这印证了K8s安全黄金法则:没有单一银弹,必须多层布防。
