環境網路安全和授權政策

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

必要條件

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

  • 執行中的 GKE 叢集,已啟用 Cloud Service Mesh 周邊網路。
  • 已註冊周邊網路的命名空間 (例如 ambient-test),並已部署範例用戶端和伺服器工作負載。
  • 使用 GCPServerTLSPolicy (搭配 mtlsMode: Strict) 和 GCPClientTLSPolicy,在用戶端和伺服器工作負載之間啟用相互傳輸層安全標準 (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 設定個別廣告連播限制。

設定預設拒絕授權政策

如要在命名空間中建立預設拒絕基準,並選擇性允許存取特定工作負載,請按照下列步驟操作:

  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.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]

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

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

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

輸出安全性政策

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

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