【安全与故障排查】05-K8s安全加固:RBAC+网络策略+镜像扫描实践

K8s 安全加固:RBAC + 网络策略 + 镜像扫描实践

专栏:安全 & 故障排查
难度:进阶
标签:Kubernetes安全RBACNetworkPolicy镜像扫描容器安全


前言

K8s 默认配置安全性较弱,一个被攻陷的 Pod 可能横向移动到整个集群。本文从RBAC、网络策略、镜像安全三个维度建立纵深防御。


一、RBAC 最小权限配置

# 错误做法:给应用分配 cluster-admin# 正确做法:按需分配最小权限# 创建只能读取自己命名空间Pod的角色apiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:name:pod-readernamespace:productionrules:-apiGroups:[""]resources:["pods","pods/log"]verbs:["get","list","watch"]---apiVersion:rbac.authorization.k8s.io/v1kind:RoleBindingmetadata:name:read-podsnamespace:productionsubjects:-kind:ServiceAccountname:myapp-sanamespace:productionroleRef:kind:Rolename:pod-readerapiGroup:rbac.authorization.k8s.io
# 审计现有的ClusterRoleBinding,找出权限过大的kubectl get clusterrolebindings-ojson|jq'.items[] | select(.roleRef.name == "cluster-admin") | {name: .metadata.name, subjects: .subjects}'

二、NetworkPolicy(网络隔离)

# 默认拒绝所有入站流量apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:default-deny-ingressnamespace:productionspec:podSelector:{}policyTypes:-Ingress---# 只允许 frontend 访问 backendapiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:allow-frontend-to-backendnamespace:productionspec:podSelector:matchLabels:app:backendpolicyTypes:-Ingressingress:-from:-podSelector:matchLabels:app:frontendports:-protocol:TCPport:8080---# 只允许 backend 访问数据库apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:allow-backend-to-dbnamespace:productionspec:podSelector:matchLabels:app:databaseingress:-from:-podSelector:matchLabels:app:backendports:-port:5432

三、镜像安全扫描(Trivy)

# 安装 Trivywgethttps://github.com/aquasecurity/trivy/releases/latest/download/trivy_Linux-64bit.tar.gztarxf trivy_Linux-64bit.tar.gz&&mvtrivy /usr/local/bin/# 扫描镜像(CRITICAL + HIGH漏洞)trivy image--severityCRITICAL,HIGH myapp:1.0.0# 扫描结果示例输出:# Total: 3 (CRITICAL: 1, HIGH: 2)# ...# 集成到 CI 流水线(发现CRITICAL漏洞时阻断构建)trivy image --exit-code1--severityCRITICAL myapp:latest

四、Pod 安全配置

# 安全的 Pod 配置模板spec:securityContext:runAsNonRoot:true# 禁止以root运行runAsUser:1000fsGroup:2000seccompProfile:type:RuntimeDefault# 启用默认seccompcontainers:-name:myappsecurityContext:allowPrivilegeEscalation:false# 禁止权限提升readOnlyRootFilesystem:true# 根文件系统只读capabilities:drop:-ALL# 去掉所有capabilitiesadd:-NET_BIND_SERVICE# 只添加需要的

五、Secret 安全管理

# 问题:Secret 以Base64存储在etcd,非加密# 解决方案1:etcd加密# 解决方案2:使用External Secrets Operator对接Vault# Vault集成示例kubectl apply-fvault-secret-store.yaml# ExternalSecret会从Vault自动拉取,生成K8s Secret

结语:K8s 安全是一个纵深防御的体系:RBAC 控制权限,NetworkPolicy 控制流量,镜像扫描控制来源,Pod 安全限制运行时。四层防御都要有。