适用于转发规则的 Cloud IAM Conditions

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

如果与 Cloud Load Balancing 结合使用,Cloud IAM Conditions 允许您有条件地授予预定义角色(例如 Load Balancer Admin 或 Network Admin)或自定义角色,以便只能创建特定类型的负载平衡器。

Cloud IAM Conditions 支持使用条件表达式来检查转发规则的负载平衡方案。例如,您可以有条件地授予 IAM 成员创建内部负载平衡器的权限,但不能授予 IAM 成员创建外部负载平衡器的权限。如果该 Cloud 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 负载平衡器中使用 Cloud IAM Conditions

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

负载平衡方案 说明
EXTERNAL 外部 HTTP(S) 负载平衡
外部 SSL 代理和 TCP 代理负载平衡
外部 TCP/UDP 网络负载平衡
INTERNAL 内部 TCP/UDP 负载平衡
INTERNAL_MANAGED 内部 HTTP(S) 负载平衡
INTERNAL_SELF_MANAGED Traffic Director

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

指定 Cloud IAM Conditions

您可以使用与配置任何其他角色绑定相同的 setIamPolicy 方法来设置条件角色绑定。如需在项目中设置带有条件的角色绑定,您可以使用 REST API、gcloud 命令行工具或 Cloud Console 中的 Cloud IAM 页面。

如需了解详情,请参阅管理条件政策

用于负载平衡的条件表达式示例

只有在满足下述任一条件时,在 IAM 政策中可以使用的以下条件表达式才允许 API 请求:

  • 该请求不涉及创建转发规则。
  • 该请求是创建具有某个内部方案的转发规则。
!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
)

此政策的影响是:如果成员尝试创建具有 EXTERNAL 负载平衡方案的转发规则,则会导致系统出现权限错误消息,因为 EXTERNAL 负载平衡方案被省略。

政策示例

下述项目的 Cloud IAM 政策示例为 Cloud IAM 成员 jane@example.com 授予了 Load Balancer Admin 预定义角色,但不能创建外部负载平衡器(因为 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', 'INTERNAL_SELF_MANAGED'])
             )
          "
      }
    }
  ]
}

针对特定类型的转发规则授予 GKE 服务帐号权限

您还可以使用 Cloud IAM Conditions 来限制对 GKE 服务帐号的访问权限,从而仅创建特定类型的转发规则。

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

通过有条件地授权,GKE 服务帐号只能创建新的内部转发规则,但可以管理所有现有转发规则。

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-<project-ID>@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', 'INTERNAL_SELF_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

在缺少其他授权的情况下,如果没有内部 TCP/UDP 负载平衡器的注释,则尝试创建类型为 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

此外,在缺少其他授权的情况下,如果尝试使用 Cloud Load Balancing Ingress 控制器创建新的 Ingress 对象,会导致类似的错误消息,因为 Cloud Load Balancing Ingress 控制器需要创建外部 HTTP(S) 负载平衡器

在上述示例中,可使用 kubectl describekubectl get events -w 命令获取 GKE 错误消息。

后续步骤