环境网络安全和授权政策

本页介绍了如何在环境网络上创建授权政策。

前提条件

在完成本文档中的步骤之前,您必须满足以下条件:

  • 已启用 Cloud Service Mesh 环境网络功能的正在运行的 GKE 集群。
  • 已部署示例客户端和服务器工作负载的已注册到环境网络的命名空间(例如 ambient-test)。
  • 通过使用 GCPServerTLSPolicy(含 mtlsMode: Strict)和 GCPClientTLSPolicy,在客户端和服务器工作负载之间启用双向 TLS (mTLS)。匹配 CLIENT_CERT_URI_SAN 的基于身份的 GCPAuthzPolicy 规则需要有效的 mTLS 才能提取客户端的 SPIFFE 身份。

如需详细了解环境设置,请参阅准备 GKE 环境网络。

默认拒绝政策

默认情况下,GKE Ambient Authorization Policy API 允许所有流量,除非受到政策限制,这与标准 Kubernetes NetworkPolicy 行为一致。

借助 DENY_BY_DEFAULT 操作,您可以更改此默认行为。当应用于命名空间时,此政策会阻止该命名空间中工作负载的所有流量,除非 ALLOW 政策明确允许。

本页介绍了如何在 Cloud Service Mesh 中配置和使用 DENY_BY_DEFAULT,以便为工作负载建立默认安全态势。

限制

在应用 DENY_BY_DEFAULT 政策之前,请注意以下限制:

  • 每个命名空间只能创建一项 DENY_BY_DEFAULT 政策。
  • 包含 DENY_BY_DEFAULT 操作的政策不能定义任何规则。
  • 使用此操作可设置命名空间范围的基准 matchLabels: {},以定位所有 Pod。您无法使用 DENY_BY_DEFAULT 来设置每个 Pod 的限制。

设置默认拒绝授权政策

如需在命名空间中建立默认拒绝基准,并选择性地允许访问特定工作负载,请按以下步骤操作:

  1. 创建并应用一个 GCPAuthzPolicy,并将操作设置为 DENY_BY_DEFAULT。

    cat <<EOF > deny-by-default-policy.yaml && kubectl apply -f deny-by-default-policy.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: deny-by-default-authz
      namespace: ambient-test
    spec:
      action: DENY_BY_DEFAULT
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels: {}
    EOF
    

    输出类似于以下内容:

     gcpauthzpolicy.networking.gke.io/deny-by-default-authz created
    

    此政策默认会阻止 ambient-test 命名空间中工作负载的所有入站流量(东西向流量和入站流量)。它不会限制命名空间中工作负载的出站流量。

  2. 如需选择性地允许流量,请创建并应用 ALLOW 政策:

    cat <<EOF > allow-policy.yaml && kubectl apply -f allow-policy.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: allow-client-to-server
      namespace: ambient-test
    spec:
      action: ALLOW
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
      rules:
      - from:
          sources:
          - principals:
          - principalSelector: CLIENT_CERT_URI_SAN
            principal:
              type: Exact
              value: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client
    EOF
    

    将 PROJECT_ID 替换为您的项目 ID。

    在控制器接受后,政策传播最多可能需要三分钟。等待 3 分钟,然后再继续操作。

  3. 测试从客户端到服务器的连接。它应该会成功,因为它符合 ALLOW 政策。

    kubectl exec -it deploy/client -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  4. 测试从服务器到自身(或任何其他没有明确许可政策的工作负载)的连接。它应该会因 DENY_BY_DEFAULT 政策而失败。

    kubectl exec -it deploy/server -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

    输出类似于以下内容:

    curl: (52) Empty reply from server.
    

日志记录

如果请求被授权政策拒绝,GKE Ambient Proxy 访问日志的 JSON 载荷中会包含以下字段:

  • jsonPayload.error_details:设置为 - rbac_access_denied_matched_policy[none]

您可以使用 Cloud de Confiance 控制台中的 Logs Explorer 查看被拒绝连接的访问日志条目。请参阅验证流量是否已通过身份验证和授权。

出站流量安全政策

如需检查和控制从 Ambient Networking 工作负载到外部端点或互联网的出站流量,您可以通过 Secure Web Proxy (SWP) 路由出站流量。

如需了解如何配置 GCPBackend 和 GCPEgressRouting 资源,请参阅通过 Secure Web Proxy 路由环境出站流量。