環境網路安全和授權政策

本頁說明如何在環境網路中建立授權政策。

必要條件

如要完成本文中的步驟,必須符合下列條件:

  • 已啟用 Cloud Service Mesh 環境網路的 GKE 叢集。
  • 已註冊環境網路的命名空間 (例如 ambient-test),並部署範例用戶端和伺服器工作負載。
  • 啟用相互傳輸層安全標準 (mTLS) ,在用戶端和伺服器工作負載之間使用 GCPServerTLSPolicy (含 mtlsMode: Strict) 和 GCPClientTLSPolicy。如果符合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. 測試從用戶端到伺服器的連線。這次應該會成功,因為這項要求符合 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,查看遭拒連線的記錄項目。請參閱「確認流量已通過驗證和授權」。

輸出安全政策

如要檢查及控管從周邊網路工作負載流向外部端點或網際網路的輸出流量,您可以透過 Secure Web Proxy (SWP) 轉送輸出流量。

如要瞭解如何設定 GCPBackend 和 GCPEgressRouting 資源,請參閱「透過 Secure Web Proxy 轉送環境輸出流量」。