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

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


前言

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


一、RBAC 最小权限配置

# 错误做法:给应用分配 cluster-admin
# 正确做法:按需分配最小权限

# 创建只能读取自己命名空间Pod的角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: production
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: production
subjects:
- kind: ServiceAccount
  name: myapp-sa
  namespace: production
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
# 审计现有的ClusterRoleBinding,找出权限过大的
kubectl get clusterrolebindings -o json | jq '.items[] | 
  select(.roleRef.name == "cluster-admin") | 
  {name: .metadata.name, subjects: .subjects}'

二、NetworkPolicy(网络隔离)

# 默认拒绝所有入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
---
# 只允许 frontend 访问 backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080
---
# 只允许 backend 访问数据库
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-backend-to-db
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: database
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - port: 5432

三、镜像安全扫描(Trivy)

# 安装 Trivy
wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_Linux-64bit.tar.gz
tar xf trivy_Linux-64bit.tar.gz && mv trivy /usr/local/bin/

# 扫描镜像(CRITICAL + HIGH漏洞)
trivy image --severity CRITICAL,HIGH myapp:1.0.0

# 扫描结果示例输出:
# Total: 3 (CRITICAL: 1, HIGH: 2)
# ...

# 集成到 CI 流水线(发现CRITICAL漏洞时阻断构建)
trivy image --exit-code 1 --severity CRITICAL myapp:latest

四、Pod 安全配置

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

五、Secret 安全管理

# 问题:Secret 以Base64存储在etcd,非加密
# 解决方案1:etcd加密
# 解决方案2:使用External Secrets Operator对接Vault

# Vault集成示例
kubectl apply -f vault-secret-store.yaml
# ExternalSecret会从Vault自动拉取,生成K8s Secret

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

更多推荐