KubernetesSRE安全加固RBAC网络策略Pod安全
场景
某Ops团队管理的Kubernetes集群包含多个命名空间,开发人员反映部分用户能访问不应触及的资源。审计日志显示大量RBAC拒绝事件和未知的Pod创建操作。
症状
- 非管理员用户尝试列出集群级别资源(如Node、PersistentVolume)并被拒绝。
- 某个命名空间中出现非预期的高权限Pod(如privileged容器)。
- 网络策略未生效,跨命名空间流量异常。
诊断
1. 检查RBAC绑定
# 列出所有ClusterRoleBinding和RoleBinding
kubectl get clusterrolebinding -o wide
kubectl get rolebinding -A -o wide
# 查看特定用户或ServiceAccount的权限
export USER="john.doe@example.com" # 替换为实际用户
kubectl auth can-i --list --as=$USER --all-namespaces | grep -v "no"
2. 检查网络策略
# 列出所有命名空间的网络策略
kubectl get networkpolicy --all-namespaces
# 查看默认拒绝策略是否存在(缺乏时流量默认允许)
NAMESPACE="production"
kubectl describe networkpolicy -n $NAMESPACE
3. 检查Pod安全上下文
# 查找特权容器或允许提升权限的Pod
kubectl get pods --all-namespaces -o jsonpath="{range .items[*]}{.metadata.namespace}{' '}{.metadata.name}{' '}{.spec.containers[*].securityContext.privileged}{'\\n'}{end}" | grep true
# 查看PodSecurityAdmission配置(如果已启用)
kubectl get pods -n $NAMESPACE -o yaml | grep -A5 "pod-security.kubernetes.io/enforce"
风险控制与加固命令
1. 收紧RBAC
# 创建最小权限的Role和RoleBinding(示例:只读访问指定命名空间中的Pod)
kubectl create role pod-reader --verb=get,list,watch --resource=pods -n $NAMESPACE
kubectl create rolebinding $USER-pod-reader --role=pod-reader --user=$USER -n $NAMESPACE
# 删除不必要的ClusterRoleBinding
kubectl delete clusterrolebinding overpermissive-binding
2. 实施网络策略
# 默认拒绝所有入站和出站流量,然后显式允许必要通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: $NAMESPACE
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
kubectl apply -f default-deny-all.yaml
# 添加允许规则的策略,例如允许前端Pod访问后端Pod
3. 强制Pod安全标准
# 在命名空间级别启用Pod Security Admission(例如restricted级别)
kubectl label ns $NAMESPACE pod-security.kubernetes.io/enforce=restricted
kubectl label ns $NAMESPACE pod-security.kubernetes.io/warn=restricted
安全备份与回滚
在执行任何加固操作前,备份当前资源状态:
# 备份RBAC和网络策略
kubectl get clusterrolebinding -o yaml > clusterrolebinding-backup.yaml
kubectl get rolebinding -A -o yaml > rolebinding-backup.yaml
kubectl get networkpolicy -A -o yaml > networkpolicy-backup.yaml
如需回滚:
kubectl apply -f clusterrolebinding-backup.yaml
kubectl apply -f rolebinding-backup.yaml
kubectl apply -f networkpolicy-backup.yaml
kubectl label ns $NAMESPACE pod-security.kubernetes.io/enforce- # 移除标签
验证效果
重复诊断步骤,确认权限已收紧、网络策略生效、特权Pod不再创建。
kubectl auth can-i list pods --as=$USER -n $NAMESPACE # 应返回yes
kubectl auth can-i list nodes --as=$USER # 应返回no
kubectl get pods -n $NAMESPACE -o yaml | grep privileged # 无输出
何时提交OpsGlobal工单
- 内部团队无法解释审计日志中的复杂拒绝事件。
- 需要跨集群统一实施安全策略时。
- 面对法规合规(如PCI-DSS)要求但缺乏经验。
- 加固后出现意料之外的应用程序故障,需要专家协助调试。
OpsGlobal的SRE工程师可以远程快速诊断并实施银行级安全配置,确保集群符合行业标准。
适用场景
适合正在处理 Security、Kubernetes, SRE, 安全加固, RBAC 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
本文通过一个典型的Kubernetes集群权限泄漏场景,逐步演示如何诊断RBAC、网络策略和Pod安全上下文中的安全漏洞,并给出加固、回滚与验证的具体命令和最佳实践。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。