轉送規則的 IAM 條件

您可以使用身分與存取權管理 (IAM) 條件,透過條件式核准來定義 IAM 政策。您可以在資源的 IAM 政策「角色繫結」中指定條件。如果存在條件,只有在條件運算式評估為 true 時,才會授予角色。每個條件運算式都是一組邏輯陳述式,可讓您指定一或多個屬性。詳情請參閱 IAM 限制條件屬性參考資料

搭配使用 Cloud Load Balancing 時,IAM 條件可讓您依條件授予預先定義的角色 (例如 Load Balancer 管理員或網路管理員) 或自訂角色。

IAM 條件支援條件運算式,可用於檢查轉送規則的負載平衡配置方案。舉例來說,您可以有條件地授予 IAM 使用者主體建立內部負載平衡器的權限,但不授予建立外部負載平衡器的權限。如果該 IAM 使用者嘗試為外部負載平衡器建立轉送規則,Google Cloud 會拒絕該動作,並傳回類似以下的錯誤:

ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource:

 - Required 'compute.forwardingRules.create' permission for
 'projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME'

在 Google Cloud 負載平衡器上使用 IAM 條件

轉送規則的負載平衡架構會決定哪種或哪些負載平衡器可以使用轉送規則。換句話說,負載平衡配置會對應到負載平衡器類型,如下表所示。

負載平衡架構 說明
EXTERNAL 傳統版應用程式負載平衡器
傳統版 Proxy 網路負載平衡器
外部直通式網路負載平衡器
EXTERNAL_MANAGED 全域外部應用程式負載平衡器
全域外部 Proxy 網路負載平衡器
區域性外部應用程式負載平衡器
區域性外部 Proxy 網路負載平衡器
INTERNAL 內部直通式網路負載平衡器
INTERNAL_MANAGED 區域性內部應用程式負載平衡器
區域性內部 Proxy 網路負載平衡器
跨區域內部應用程式負載平衡器
跨區域內部 Proxy 網路負載平衡器
INTERNAL_SELF_MANAGED Cloud Service Mesh

建立負載平衡器時,您需要指定 loadBalancingScheme 欄位。只要在 IAM 條件中勾選 loadBalancingScheme 欄位,即可授予主體建立特定類型負載平衡器的權限。

指定 IAM 條件

您可以使用用於設定其他角色繫結的相同 setIamPolicy 方法,設定條件式角色繫結。如要在專案中設定包含條件的角色繫結,您可以使用 REST API、gcloud 指令列工具或 Google Cloud 主控台中的「IAM」頁面。

詳情請參閱「管理條件式政策」。

負載平衡的條件運算式範例

下列可用於 IAM 政策的條件運算式,只會在下列任一條件為真時允許 API 要求:

  • 這項要求不涉及建立轉送規則。
  • 要求是建立含有其中一個內部負載平衡配置的轉送規則。

    !compute.isForwardingRuleCreationOperation() || (
      compute.isForwardingRuleCreationOperation() &&
      compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
    )
    

省略負載平衡架構 EXTERNAL。如果主體嘗試使用 EXTERNAL 負載平衡配置建立轉送規則,系統會顯示權限錯誤訊息。

範例政策

這個專案的 IAM 政策範例會將負載平衡器管理員預先定義的角色授予 IAM 主體 jane@example.com,但不包括建立外部負載平衡器的功能 (因為負載平衡器架構 EXTERNAL 已省略)。jane@example.com 可以建立內部負載平衡器,並管理、修改及刪除任何負載平衡器。

{
  "bindings": [
    {
      "role": "roles/compute.loadBalancerAdmin",
      "members": ["user:jane@example.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB creation only permitted",
          "expression": "
             !compute.isForwardingRuleCreationOperation() || (
                compute.isForwardingRuleCreationOperation() &&
                compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
             )
          "
      }
    }
  ]
}

為特定類型的轉送規則授予 GKE 服務帳戶權限

您也可以使用 IAM 條件限制對 GKE 服務帳戶的存取權,只建立特定類型的轉送規則。

以下 JSON 範例示範完整的 IAM 政策,可授予 GKE 服務帳戶 (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) Kubernetes Engine 服務代理人角色。這個角色可讓服務帳戶建立、修改及刪除負載平衡器元件 (外部轉送規則除外)。

使用這項條件式授權後,GKE 服務帳戶只能建立的內部轉送規則,但可以管理所有現有的轉送規則。

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-<var>PROJECT_ID</var>@container-engine-robot.iam.gserviceaccount.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB Creation Only Permitted",
          "expression": "(
                 compute.isForwardingRuleCreationOperation()
                      &&
                  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

在沒有其他授權的情況下,如果嘗試建立 LoadBalancer 類型的新 GKE 服務,但沒有內部直通式網路負載平衡器的註解,系統會傳送類似以下的錯誤訊息:

Error creating load balancer (will retry): failed to ensure load balancer for
service default/SERVICE-NAME: failed to create forwarding rule for load balancer
(a01d427111c7011ea96e142010a80006(default/SERVICE-NAME)): googleapi: Error 403:
Required 'compute.forwardingRules.create' permission for
'projects/PROJECT_ID/regions/[region]/forwardingRules/FORWARDING_RULE_NAME',
forbidden

此外,如果沒有其他授權,嘗試建立新的 Ingress 物件也會導致類似的錯誤訊息,因為 Cloud Load Balancing Ingress 控制器需要建立外部應用程式負載平衡器

您可以使用 kubectl describekubectl get events -w 指令查看 GKE 錯誤訊息。

後續步驟