環境網路安全和授權政策

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

必要條件

您必須符合下列條件,才能完成本文件中的步驟:

  • 已啟用 Cloud Service Mesh 環境網路的 GKE 叢集。
  • 已註冊周邊網路的命名空間 (例如 ambient-test),並部署範例用戶端和伺服器工作負載。
  • 啟用相互傳輸層安全標準 (mTLS),在用戶端和伺服器工作負載之間使用 GCPServerTLSPolicy (含 mtlsMode: Strict) 和 GCPClientTLSPolicy。如果符合GCPAuthzPolicy規則,系統會要求啟用 mTLS,以擷取用戶端的 SPIFFE 身分。CLIENT_CERT_URI_SAN

如需詳細的環境設定,請參閱「準備 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.
    

記錄

如果授權政策拒絕要求,節點 Proxy 會將存取記錄項目寫入 Cloud Logging,記錄名稱為 gke-ambient-node-proxy-accesslog。JSON 酬載中的項目包含下列欄位:

  • jsonPayload.error_details:- rbac_access_denied_matched_policy[none]

您可以在 Cloud de Confiance 控制台使用 Logs Explorer,查看遭拒連線的存取記錄項目:

resource.type="k8s_container"
logName="projects/PROJECT_ID/logs/gke-ambient-node-proxy-accesslog"
jsonPayload.error_details=~"rbac_access_denied"

詳情請參閱「確認流量已通過驗證和授權」。

輸出安全性政策

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

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