為應用程式負載平衡器設定授權政策

本頁面說明如何設定應用程式負載平衡器的授權政策。

事前準備

設定負載平衡器

如果您尚未建立負載平衡器,請參閱下列頁面,設定偏好的應用程式負載平衡器:

建立授權政策

如要建立授權政策,請建立定義目標和規則的 YAML 檔案,然後使用 gcloud network-security authz-policies 指令匯入檔案。

本節說明如何建立附加至應用程式負載平衡器轉送規則的授權政策。

如要進一步瞭解如何為使用 Service Extensions 委派授權的 Agent Gateway 建立授權政策,請參閱「使用 Service Extensions 委派授權」。

如要進一步瞭解如何建立 Secure Web Proxy 的授權政策,請參閱「設定 Secure Web Proxy 的授權政策」。

拒絕要求的授權政策

本節提供授權政策範例,說明如何根據特定要求屬性拒絕要求。

依據 IP 位址範圍拒絕要求

本節提供授權政策範例,說明如何根據特定 IP 位址範圍來源的要求,拒絕要求。

全域和跨區域

  1. 在 YAML 檔案中定義授權政策。

    下列範例會為 global 位置中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-deny.yaml 檔案。這項政策會拒絕 IP 位址在 10.0.0.0/24 範圍內的用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
    - to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=global
    

地區性

  1. 在 YAML 檔案中定義授權政策。

    以下範例會為Google Cloud 區域中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-deny.yaml 檔案。這項政策會拒絕 IP 位址在 10.0.0.0/24 範圍內的用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
    - to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:您的 Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=LOCATION
    

根據用戶端憑證主體拒絕要求

本節提供授權政策範例,說明如何根據用戶端憑證主體拒絕要求。

全域和跨區域

  1. 在 YAML 檔案中定義授權政策。

    下列範例會為 global 位置中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-deny.yaml 檔案。如果用戶端憑證 DNS 名稱 SAN 含有 www.example.com,這項政策會拒絕用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - principals:
          - principalSelector: CLIENT_CERT_DNS_NAME_SAN
            principal:
              exact: "www.example.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=global
    

地區性

  1. 在 YAML 檔案中定義授權政策。

    以下範例會為Google Cloud 區域中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-deny.yaml 檔案。如果用戶端憑證 DNS 名稱 SAN 含有 www.example.com,政策會拒絕用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - principals:
          - principalSelector: CLIENT_CERT_DNS_NAME_SAN
            principal:
              exact: "www.example.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:您的 Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=LOCATION
    

允許要求的授權政策

本節提供授權政策範例,允許來自特定 IP 位址範圍的要求。

全域和跨區域

如果您使用的是全域外部應用程式負載平衡器,或跨區域內部應用程式負載平衡器,請按照下列步驟建立授權政策:

  1. 在 YAML 檔案中定義授權政策。

    下列範例會為 global 位置中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-allow.yaml 檔案。這項政策允許 IP 位址在 10.0.0.0/24 範圍內的用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=global
    

地區性

如果您使用的是區域性外部應用程式負載平衡器或區域性內部應用程式負載平衡器,請按照下列步驟建立及匯入授權政策:

  1. 在 YAML 檔案中定義授權政策。

    以下範例會為特定 Google Cloud 區域中的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-allow.yaml 檔案。這項政策允許 IP 位址在 10.0.0.0/24 範圍內的用戶端存取 /api/payments 網址路徑。

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:您的 Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=LOCATION
    

依據服務帳戶或標記設定授權政策

您可以根據附加至各種 Google Cloud 資源的服務帳戶或安全標記,套用授權政策。

本範例假設您已完成下列事項:

服務帳戶

  1. 在 YAML 檔案中定義授權政策。

    下列範例會為區域性內部應用程式負載平衡器的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-deny.yaml 檔案。這項政策設為拒絕來自 Google Cloud 資源 (例如 Compute Engine VM) 的要求,該資源使用服務帳戶my-sa-123@PROJECT_ID.iam.gserviceaccount.com連至/api/payments路徑。

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - resources:
           - iamServiceAccount:
               exact: "my-sa-123@PROJECT_ID.iam.gserviceaccount.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性內部應用程式負載平衡器和跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:您的 Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=LOCATION
    

    將 LOCATION 替換為您的 Google Cloud 區域。

標記

  1. 在 YAML 檔案中定義授權政策。

    以下範例會為區域性內部應用程式負載平衡器的轉送規則 LB_FORWARDING_RULE 建立 authz-policy-allow.yaml 檔案。這項政策只允許來自 Google Cloud 資源 (例如 Compute Engine VM) 的要求,且該資源必須具有安全標記值TAG_VALUE_PERMANENT_ID,才能存取/api/payments網址路徑。

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
      sources:
        resources:
        - tagValueIdSet:
          - ids: "TAG_VALUE_PERMANENT_ID"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性內部應用程式負載平衡器和跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION:您的 Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
    • TAG_VALUE_PERMANENT_ID:標記值的永久 ID。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=LOCATION
    

    更改下列內容:

    • LOCATION:您的 Google Cloud 區域。

委派授權決策的授權政策

本節中的範例會建立授權政策,透過 Service Extensions 將授權決策委派給下列服務:

將授權決策委派給使用者管理的代管服務

您可以設定授權政策,透過 Service Extensions (具體來說是授權擴充功能),將授權決策委派給使用者代管服務。

  • 如果是全域和跨區域負載平衡器,授權擴充功能可以在使用者自行管理的 Google Cloud 後端服務上執行。

  • 如果是區域性負載平衡器,授權擴充功能可在使用者管理的 Google Cloud 後端服務和 FQDN 型服務上執行。

這個範例設定假設您已建立使用者自行管理的 Google Cloud 後端服務 (也稱為呼叫後端服務),名稱為 authz-service。如要進一步瞭解如何建立,請參閱「設定使用者自行管理的呼叫後端服務」。

如果是以 FQDN 為基礎的服務,這個範例設定會假設自訂服務部署在您自己的虛擬私有雲中、支援 ext_authz 通訊協定,且可透過完整網域名稱 mycustomauthz.internal.net 存取。

全域和跨區域

如果您使用的是全域外部應用程式負載平衡器,或跨區域內部應用程式負載平衡器,請按照下列步驟,將授權決策委派給使用者自行管理的服務。

  1. 在 YAML 檔案中定義授權擴充功能。授權擴充功能會在後端服務 (authz-service) 上執行,並支援 ext_authz 通訊協定。

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    authority: ext11.com
    loadBalancingScheme: LB_SCHEME
    service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/authz-service
    forwardHeaders:
      - Authorization
    failOpen: false
    timeout: "0.1s"
    wireFormat: EXT_AUTHZ_GRPC
    EOF
    
  2. 使用 gcloud service-extensions authz-extensions import 指令匯入授權擴充功能 YAML 檔案,建立授權擴充功能。

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=global
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
  3. 在 YAML 檔案中定義授權政策。授權政策會將授權委派給 customProvider 欄位中的授權擴充功能。

    當要求包含非空白的 Authorization 標頭時,政策會針對傳送至 example.com/api/payments 網址路徑的所有流量,呼叫 my-authz-ext 授權擴充功能。

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - to:
        operations:
        - hosts:
          - exact: "example.com"
        - paths:
          - exact: "/api/payments"
      when: 'request.headers["Authorization"] != ""'
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/global/authzExtensions/my-authz-ext"
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  4. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=global
    

地區性

如果您使用的是區域性外部應用程式負載平衡器,或區域性內部應用程式負載平衡器,請按照下列步驟,將授權決策委派給使用者自行管理的服務。

  1. 在 YAML 檔案中定義授權擴充功能。授權擴充功能可以在後端服務或 FQDN 服務上執行。

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    authority: ext11.com
    loadBalancingScheme: LB_SCHEME
    service: BACKEND_SERVICE_URI_OR_FQDN
    forwardHeaders:
      - Authorization
    failOpen: false
    timeout: "0.1s"
    wireFormat: EXT_AUTHZ_GRPC
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • BACKEND_SERVICE_URI_OR_FQDN:服務可以是下列任一項:
      • 區域性後端服務資源 URI,格式為 https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/backendServices/authz-service。
      • Cloud DNS 可解析的完整網域名稱 (例如 mycustomauthz.extension.net)。
  2. 使用 gcloud service-extensions authz-extensions import 指令匯入授權擴充功能 YAML 檔案,建立授權擴充功能。

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=LOCATION
    

    將 LOCATION 替換為設定呼叫後端服務的 Google Cloud區域。

  3. 在 YAML 檔案中定義授權政策。授權政策會將授權委派給 customProvider 欄位中的授權擴充功能。

    當要求包含非空白的 Authorization 標頭時,政策會針對傳送至 example.com/api/payments 網址路徑的所有流量,呼叫 my-authz-ext 授權擴充功能。

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - to:
        operations:
        - paths:
          - exact: "/api/payments"
      when: 'request.headers["Authorization"] != ""'
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION: Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  4. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=LOCATION
    

    將 LOCATION 替換為設定負載平衡器的 Google Cloud區域。

如要進一步瞭解授權擴充功能,請參閱「設定授權擴充功能」。

將授權決策委派給 Model Armor

您可以設定授權政策,將授權決策委派給 Model Armor。

開始之前,請先建立 Model Armor 範本。在這個範例設定中,授權政策會指向授權擴充功能,而授權擴充功能會指向 Model Armor。

如果您使用的是區域性外部應用程式負載平衡器,或區域性內部應用程式負載平衡器,請按照下列步驟將授權決策委派給 Model Armor。

地區性

  1. 在 YAML 檔案中定義授權擴充功能。授權擴充功能會指向 Model Armor 要求和回覆範本。

    cat >authz-extension.yaml <<EOF
    name: my-authz-extension
    loadBalancingScheme: INTERNAL_MANAGED
    service: modelarmor.LOCATION.rep.googleapis.com
    metadata:
      model_armor_settings: '[
        {
        "response_template_id": "projects/PROJECT_ID/locations/LOCATION/templates/RESPONSE_TEMPLATE_ID",
        "request_template_id": "projects/PROJECT_ID/locations/LOCATION/templates/REQUEST_TEMPLATE_ID"
        }
      ]'
    failOpen: true
    EOF
    

    更改下列內容:

    • LOCATION:範本的位置
    • PROJECT_ID:範本所屬專案的 ID
    • RESPONSE_TEMPLATE_ID:回覆範本的 ID
    • REQUEST_TEMPLATE_ID:要求範本的 ID
  2. 使用 gcloud service-extensions authz-extensions import 指令匯入授權擴充功能 YAML 檔案,建立授權擴充功能。

    gcloud service-extensions authz-extensions import my-authz-ext \
      --source=authz-extension.yaml \
      --location=LOCATION
    

    將 LOCATION 替換為負載平衡器所在的 Google Cloud區域。

  3. 在 YAML 檔案中定義授權政策。授權政策會將授權委派給 customProvider 欄位中的授權擴充功能。

    policyProfile 的值為 CONTENT_AUTHZ。

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: INTERNAL_MANAGED
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: CONTENT_AUTHZ
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    更改下列內容:

    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION: Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  4. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-custom \
      --source=authz-policy-custom.yaml \
      --location=LOCATION
    

    將 LOCATION 替換為設定負載平衡器的 Google Cloud區域。

將授權決策委派給 Identity-Aware Proxy

如果是全域外部應用程式負載平衡器和跨區域內部應用程式負載平衡器,您無法透過授權擴充功能將授權決策委派給 IAP。對於這些負載平衡器,您可以透過授權政策資源上的 customProvider 欄位,將授權決策委派給 IAP。

如果是區域性外部應用程式負載平衡器和區域性內部應用程式負載平衡器,您可以設定授權政策,透過授權擴充功能將授權決策委派給 IAP。

全域和跨區域

在以下範例中,所有來自 10.0.0.0/24 IP 位址區塊的要求,其授權決策都會委派給 IAP。如果要求來自 10.0.0.0/24 以外的任何 IP 位址,則不符合這項政策,IAP 也不會根據這項特定規則評估。

  1. 在 YAML 檔案中定義授權政策。授權政策會透過 customProvider 欄位將授權委派給 IAP。

    cat >authz-policy-iap.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
      - from:
          sources:
          - ipBlock:
            - prefix: "10.0.0.0"
              length: 24
    action: CUSTOM
    customProvider:
      cloudIap: {}
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是全域外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是跨區域內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  2. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-iap.yaml \
        --location=global
    

地區性

如果您使用的是區域性外部應用程式負載平衡器,或區域性內部應用程式負載平衡器,請按照下列步驟操作,使用授權擴充功能將授權決策委派給 IAP。

  1. 在 YAML 檔案中定義授權擴充功能。授權擴充功能指向 IAP。

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    loadBalancingScheme: LB_SCHEME
    service: iap.googleapis.com
    failOpen: false
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
  2. 使用 gcloud service-extensions authz-extensions import 指令匯入授權擴充功能 YAML 檔案,建立授權擴充功能。

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=LOCATION
    

    將 LOCATION 替換為設定授權擴充功能的 Google Cloud區域。

  3. 在 YAML 檔案中定義授權政策。授權政策會將授權委派給 customProvider 欄位中的授權擴充功能。

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    更改下列內容:

    • LB_SCHEME:負載平衡配置。如果是區域性外部應用程式負載平衡器,請將配置設為 EXTERNAL_MANAGED。如果是區域性內部應用程式負載平衡器,請將配置設為 INTERNAL_MANAGED。
    • PROJECT_ID: Google Cloud 專案的 ID。
    • LOCATION: Google Cloud 區域。
    • LB_FORWARDING_RULE:負載平衡器的轉送規則名稱。
  4. 使用 gcloud network-security authz-policies import 指令匯入授權政策 YAML 檔案,建立授權政策。

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=LOCATION
    

    將 LOCATION 替換為設定負載平衡器的 Google Cloud區域。

瞭解 Cloud Logging 中的授權政策記錄

如要瞭解要求允許或拒絕時,授權政策的記錄方式,請參閱下列各節。

要求不符合 ALLOW 和 DENY 政策

如果要求不符合 ALLOW 和 DENY 政策,DENY 政策會允許要求,並將其記錄為 allowed_as_no_deny_policies_matched_request。相反地,ALLOW 政策會拒絕要求,並將其記錄為 denied_as_no_allow_policies_matched_request。由於其中一項政策拒絕要求,因此要求遭拒。

  • 如果您使用的是全域外部應用程式負載平衡器,記錄中的 statusDetails 會設為 denied_by_authz_policy。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "denied_as_no_allow_policies_matched_request"
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          statusDetails: "denied_by_authz_policy"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 如果您使用的是區域性內部應用程式負載平衡器、區域性外部應用程式負載平衡器,或跨區域內部應用程式負載平衡器,記錄中的 proxyStatus 會設為 error=\"http_request_error\"; details=\"denied_by_authz_policy\"。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "denied_as_no_allow_policies_matched_request"
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          proxyStatus: "error=\"http_request_error\"; details=\"denied_by_authz_policy\""
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

要求符合「DENY」政策

如果要求符合 DENY 政策,就會遭到拒絕,系統也會記錄拒絕要求的政策。

  • 如果您使用的是全域外部應用程式負載平衡器,記錄中的 statusDetails 會設為 denied_by_authz_policy,而拒絕要求的政策名稱會記錄在 policies 中。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "name: "projects/12345567/locations/global/authzPolicies/deny-authz-policy-test""
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
          statusDetails: "denied_by_authz_policy"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 如果您使用的是區域性內部應用程式負載平衡器、區域性外部應用程式負載平衡器,或跨區域內部應用程式負載平衡器,proxyStatus 會設為 error=\"http_request_error\"; details=\"denied_by_authz_policy\",且政策名稱會記錄在 policies 中。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "name: "projects/12345567/locations/$REGION/authzPolicies/deny-authz-policy-test""
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          proxyStatus: "error=\"http_request_error\"; details=\"denied_by_authz_policy\""
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

要求不符合 DENY 政策,但符合 ALLOW 政策

如果要求不符合 DENY 政策,但符合 ALLOW 政策,則會允許該要求。在記錄中,這項動作會記錄為 DENY 政策的 allowed_as_no_deny_policies_matched_request。系統也會記錄允許要求的政策。

  • 如果使用全域外部應用程式負載平衡器,記錄中不會有 statusDetails。允許要求的政策也會記錄在 policies 中。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "name: "projects/12345567/locations/global/authzPolicies/allow-authz-policy-test""
                result: "ALLOWED"
              }
            ]
            result: "ALLOWED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 如果您使用的是區域性內部應用程式負載平衡器、區域性外部應用程式負載平衡器,或跨區域內部應用程式負載平衡器,記錄中就不會有 proxyStatus 欄位。允許要求的政策也會記錄在 policies 中。請參閱以下範例:

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "name: "projects/12345567/locations/$REGION/authzPolicies/allow-authz-policy-test""
                result: "ALLOWED"
              }
            ]
            result: "ALLOWED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

後續步驟