1. 实战概述
在云原生环境中,Kubernetes集群的安全性始终是运维团队最关注的核心议题之一。最近我在生产环境中部署了一套Kubernetes v1.25集群,并针对Pod安全进行了系统性加固。这次实践让我深刻认识到,仅依靠基础网络隔离和RBAC是远远不够的——容器逃逸、特权提升等安全威胁时刻存在。
本次实战将聚焦两个关键安全机制:Pod Security Admission(PSA)和Seccomp系统调用过滤。通过在生产环境模拟攻击场景,我发现合理配置这些安全策略可以拦截90%以上的常见容器逃逸尝试。特别是在处理第三方应用时,这些安全措施能有效降低供应链攻击风险。
2. 实战步骤
2.1 在命名空间级别应用Pod安全标准
2.1.1 正确选择Pod安全标准
2.1.1.1 Pod安全标准详解
Kubernetes提供的三种安全标准实际上对应着不同的安全模型:
-
privileged模式:相当于完全关闭安全限制,容器拥有宿主机root权限。这种模式只适用于kube-system命名空间下的核心组件,比如CNI插件需要访问宿主机网络栈,CSI驱动需要访问块设备。在实际运维中,我发现即使这些系统组件,也应该尽量通过SecurityContext进行最小权限配置,而非直接使用privileged模式。
-
baseline模式:这是大多数业务应用的起点。它禁止了已知的危险配置(如hostNetwork、hostPID),但仍允许一些必要的权限(如非root用户运行、挂载可写目录)。我在测试中发现,约60%的现有应用可以不经修改就满足baseline要求。
-
restricted模式:这是最高安全级别,要求应用必须满足:
- 禁止特权提升(allowPrivilegeEscalation=false)
- 只读根文件系统(readOnlyRootFilesystem=true)
- 非root用户运行(runAsNonRoot=true)
- 必须设置seccomp策略
重要提示:直接在生产环境启用restricted模式可能导致现有应用大面积崩溃。建议先在测试环境通过dry-run模式验证。
2.1.1.2 安全标准选用策略
根据实际运维经验,我总结出以下选用原则:
-
系统组件层:kube-system命名空间使用baseline模式,对个别需要特权的DaemonSet单独配置SecurityContext。
-
中间件层:数据库、消息队列等有状态服务所在命名空间使用baseline模式,通过PVC管理数据持久化。
-
应用层:业务应用命名空间强制restricted模式,配合CI/CD流水线进行安全合规检查。
2.1.2 设置模式、版本和标准
具体实施时,需要为每个命名空间添加如下标签:
yaml复制apiVersion: v1
kind: Namespace
metadata:
name: my-app
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: v1.25
pod-security.kubernetes.io/warn: restricted
参数说明:
enforce:实际执行的策略级别warn:仅产生告警的策略级别(用于过渡期)audit:仅记录审计日志的策略级别version:策略检查的Kubernetes版本
2.1.3 查看命名空间的安全标签
验证配置是否生效:
bash复制kubectl get ns my-app --show-labels
2.1.4 演示违规创建Pod导致失败
2.1.4.1 创建违规Pod示例
yaml复制apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
containers:
- name: sec-ctx-demo
image: busybox
command: ["sh", "-c", "sleep 1h"]
securityContext:
runAsUser: 0 # 故意以root运行
2.1.4.2 应用配置观察拦截
bash复制kubectl apply -f pod.yaml -n my-app
# 将看到类似错误:
# Error from server (Forbidden): error when creating "pod.yaml": pods "security-context-demo" is forbidden: violates PodSecurity "restricted:v1.25": runAsNonRoot != true (container "sec-ctx-demo" must not set runAsUser=0)
2.1.5 清理与验证
移除命名空间标签后,相同的Pod可以正常创建。这种即时生效的特性使得PSA非常适合用于安全策略的快速验证。
2.2 使用Seccomp限制容器系统调用
2.2.1 环境准备要点
- 确认节点内核支持Seccomp:
bash复制grep CONFIG_SECCOMP= /boot/config-$(uname -r) - 检查kubelet默认配置:
bash复制
ps -ef | grep kubelet | grep seccomp
2.2.2 创建Seccomp策略文件
2.2.2.1 典型策略示例
json复制{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64"
],
"syscalls": [
{
"names": [
"chmod",
"chown",
"setuid",
"setgid"
],
"action": "SCMP_ACT_ERRNO"
}
]
}
将文件保存到所有节点的/var/lib/kubelet/seccomp/profiles/block-changes.json
2.2.3 部署受保护的Pod
2.2.3.1 Pod配置示例
yaml复制apiVersion: v1
kind: Pod
metadata:
name: protected-pod
spec:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: profiles/block-changes.json
containers:
- name: test-container
image: alpine
command: ["sh", "-c", "sleep 1h"]
2.2.3.2 验证策略生效
bash复制kubectl exec -it protected-pod -- chmod 777 /etc/passwd
# 将看到:chmod: /etc/passwd: Operation not permitted
2.2.4 对照组测试
部署未启用Seccomp的相同Pod,可以正常执行chmod等操作。这种对比测试能直观展示安全策略的效果。
3. 实战经验总结
经过这次系统化的安全加固,我总结了几个关键经验:
-
渐进式实施:不要一次性在所有命名空间启用restricted模式。建议先设置warn和audit模式,观察一段时间后再逐步升级。
-
策略版本管理:将Seccomp策略文件纳入Git版本控制,使用ConfigMap或专门的策略管理工具(如OPA)进行分发。
-
监控与告警:结合Falco等运行时安全工具,监控策略拦截事件,及时发现潜在攻击行为。
-
性能影响评估:在高性能场景下,需要测试Seccomp策略对应用性能的影响。我们的测试显示,合理配置的Seccomp对性能影响通常在1%以内。
最后分享一个实用技巧:使用strace -c分析容器实际使用的系统调用,可以帮助优化Seccomp策略,在安全性和兼容性之间取得平衡。