适用于转发规则的 IAM Conditions

Identity and Access Management (IAM) Conditions 让您可以通过有条件的授权定义 Cloud IAM 政策。您可以在资源的 IAM 政策的角色绑定中指定条件。如果条件存在,则仅当条件表达式的计算结果为 true 时系统才会授予该角色。每个条件表达式都是一组逻辑语句,允许您指定一个或多个特性。如需了解详情,请参阅 IAM Conditions 的特性参考

如果与 Cloud Load Balancing 结合使用,IAM Conditions 允许您有条件地授予预定义角色(例如 Load Balancer Admin 或 Network Admin)或自定义角色。

IAM Conditions 支持使用条件表达式来检查转发规则的负载均衡方案。例如,您可以有条件地授予 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 Conditions

转发规则的负载均衡方案决定哪种类型的负载均衡器可以使用转发规则。换句话说,负载均衡方案对应于负载均衡器类型,如下表所示。

负载均衡方案 说明
外部 传统应用负载平衡器
传统代理网络负载平衡器
外部直通式网络负载平衡器
EXTERNAL_MANAGED 全球外部应用负载平衡器
全球外部代理网络负载平衡器
区域级外部应用负载平衡器
区域级外部代理网络负载平衡器
INTERNAL 内部直通式网络负载均衡器
INTERNAL_MANAGED 区域级内部应用负载平衡器
区域级内部代理网络负载平衡器
跨区域内部应用负载平衡器
跨区域内部代理网络负载平衡器
INTERNAL_SELF_MANAGED Cloud Service Mesh

您可以在创建负载平衡器时指定 loadBalancingScheme 字段。通过选中 IAM 条件中的 loadBalancingScheme 字段,您可以授予主账号创建特定类型的负载均衡器的权限。

指定 IAM Conditions

您可以使用与配置任何其他角色绑定相同的 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 Conditions 来限制对 GKE 服务账号的访问,以便仅创建特定类型的转发规则。

以下 JSON 示例演示了用于为 GKE 服务账号 (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) 授予 Kubernetes Engine Service Agent 角色的完整的 IAM 政策。此角色允许服务账号创建、修改和删除除外部转发规则之外的其他负载平衡器组件。

通过有条件地授权,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 错误消息。

后续步骤