Kubernetes集群如何配置安全策略

wen 网络安全 1

本文目录导读:

Kubernetes集群如何配置安全策略

  1. 集群层面的基础安全加固
  2. Pod 安全标准(Pod Security Standards, PSS)
  3. 网络安全策略(NetworkPolicy)
  4. 容器与Pod运行时的安全配置
  5. 镜像与供应链安全
  6. 机密管理与Secrets加密
  7. 服务网格与零信任网络(进阶)
  8. 推荐的基线配置清单

配置Kubernetes集群的安全策略是一个系统工程,需要从集群层面Pod层面以及网络层面等多个维度进行,以下是一套比较完整的安全策略配置指南:

集群层面的基础安全加固

在配置Pod和网络策略之前,首先要确保集群本身是安全的。

  1. RBAC(基于角色的访问控制)

    • 原则:最小权限原则。
    • 操作:禁止使用cluster-admin这类超级管理员角色给普通用户或ServiceAccount,为不同的团队、应用创建特定的Role(命名空间级别)或ClusterRole(集群级别),并通过RoleBindingClusterRoleBinding进行绑定。
    • 示例:只给某应用的CI/CD系统赋予在特定命名空间内createupdate Deployment的权限,而非整个集群。
  2. API Server 安全

    • 启用TLS:确保API Server使用经过CA签名的证书进行通信。
    • 禁用匿名访问:设置 --anonymous-auth=false
    • 审计日志:开启审计日志(--audit-policy-file),记录敏感操作(如创建Pod、访问Secret)。

Pod 安全标准(Pod Security Standards, PSS)

这是Kubernetes官方推荐用来取代PodSecurityPolicy(PSP,已在1.21弃用)的方案,通过准入控制器生效。

  1. 三种安全级别

    • Privileged(特权级):无限制,通常只用于系统级组件(如Ingress Controller、CNI)。
    • Baseline(基线级):默认安全配置,禁止已知的提权行为。
    • Restricted(严格级):最高限制,遵循Pod加固最佳实践,适用于大多数业务应用。
  2. 实施方式

    • 命名空间标签:为命名空间添加标签来定义策略。
      apiVersion: v1
      kind: Namespace
      metadata:
        name: my-workloads
        labels:
          # 在该命名空间下,Pod必须满足Restricted级别
          pod-security.kubernetes.io/enforce: restricted 
    • 策略模式
      • enforce:强制执行,拒绝不符合的Pod。
      • audit:记录审计事件,但不拒绝。
      • warn:向用户发出警告。

网络安全策略(NetworkPolicy)

默认情况下,Kubernetes允许所有Pod之间的通信,NetworkPolicy用于实现流量隔离。

  1. 基本规则

    • 默认拒绝:如果没有匹配到任何NetworkPolicy,则拒绝所有入站/出站流量。
    • 白名单:只允许明确指定的流量通过。
  2. 配置示例

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-frontend
      namespace: my-app
    spec:
      podSelector:
        matchLabels:
          app: backend   # 目标Pod是backend
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: frontend  # 只允许来自frontend Pod的流量
        ports:
        - port: 8080
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system  # 只允许访问kube-system内的DNS
        ports:
        - port: 53
          protocol: UDP
    • 注意:你的集群网络插件(如Calico、Cilium、Weave)必须支持NetworkPolicy。

容器与Pod运行时的安全配置

这些配置通常在Pod的securityContext中设置。

  1. 只读根文件系统

    • 将容器的根文件系统设置为只读,强制将所有写入数据挂载到临时或持久卷。
      securityContext:
      readOnlyRootFilesystem: true
  2. 禁止特权容器

    securityContext:
      allowPrivilegeEscalation: false
      privileged: false
      capabilities:
        drop: ["ALL"]  # 删除所有内核能力,然后按需添加
  3. 以非root用户运行

    securityContext:
      runAsNonRoot: true
      runAsUser: 1000    # 显式指定用户ID

镜像与供应链安全

  1. 使用私有镜像仓库:通过imagePullSecrets拉取镜像,避免使用公共仓库中存在漏洞的镜像。
  2. 容器镜像扫描:结合Trivy、Clair等工具,在CI/CD流水线中扫描镜像,阻止有高危漏洞的镜像部署。
  3. ImagePolicyWebhook:配置准入控制器,只允许来自受信仓库的镜像运行。

机密管理与Secrets加密

  1. 使用Secret而非ConfigMap存储敏感信息:Secret仅被Base64编码(不是加密),因此需要额外措施。

  2. 加密静态数据:在集群中启用 EncryptionConfiguration,对etcd中的Secret进行AES-GCM等算法加密。

    # 在API Server配置中启用
    apiVersion: apiserver.config.k8s.io/v1
    kind: EncryptionConfiguration
    resources:
      - resources:
          - secrets
        providers:
          - aescbc:
              keys:
                - name: key1
                  secret: c2VjdXJl... # 你的加密密钥
          - identity: {}
  3. 外部Secrets管理:使用External Secrets Operator或Sealed Secrets,将Secret管理职责从K8s集群内转移到外部Vault、AWS Secrets Manager等。

服务网格与零信任网络(进阶)

如果需要更细粒度的安全控制(如mTLS、服务间身份认证),可以考虑服务网格:

  • Istio / Linkerd:启用mTLS,强制所有服务间的通信都经过TLS加密和双向身份验证。
  • 证书管理:使用 cert-manager 自动签发和轮换TLS证书。

推荐的基线配置清单

策略名称 配置方式 建议级别
RBAC 角色绑定 必须
禁止匿名访问 API Server参数 必须
Pod安全标准(PSS)Restricted 命名空间标签 + 准入控制器 强烈建议
只读根文件系统 Pod Spec securityContext 建议
禁止特权容器且丢弃所有Capabilities Pod Spec securityContext 强烈建议
以非root运行 Pod Spec securityContext 强烈建议
默认拒绝网络策略 NetworkPolicy 建议
镜像签名/扫描 CI/CD + 准入控制器 建议
etcd静态加密 EncryptionConfiguration 必须(生产环境)

实施顺序建议:先通过RBAC和认证审计锁定集群大门,再通过PSS限制Pod行为,最后用NetworkPolicy隔离网络流量。

抱歉,评论功能暂时关闭!