本指南适用于需要在包含没有 Google 身份且不属于 Google Workspace 的用户的项目中设置 Connect 网关的平台管理员。在本指南中,这些身份称为“第三方身份”。在阅读本指南之前,您应该先熟悉 Connect 网关概览中的概念。如需向个别 Google 账号授权,请参阅设置 Connect 网关。如需获取 Google 群组支持,请参阅使用 Google 群组设置 Connect 网关。
本指南中的设置允许用户使用 Google Cloud CLI、Connect 网关和 Google Cloud 控制台登录舰队集群。
支持的集群类型
您可以通过 Connect 网关为以下集群类型使用第三方身份设置访问权限控制:
- GKE on Google Cloud:所有可用版本。如需设置 Connect 网关,请为 RBAC 配置 Google 群组,然后向 Google 群组授予 IAM 角色。
- Google Distributed Cloud on VMware(纯软件)和 Google Distributed Cloud on Bare Metal(纯软件):所有可用版本。
- Google Distributed Cloud connected:所有可用版本。
- GKE 关联集群:版本为 1.28.0-gke.2 及更高版本。
GKE on AWS 和 GKE on Azure:所有可用版本。
如需在上述列表中的环境之外的其他环境中使用此功能,请联系 Cloud Customer Care 或 Connect Gateway 团队。
工作原理
如概览中所述,用户使用的身份提供方可能不是 Google Workspace 或 Cloud Identity。通过使用员工身份联合,用户可以使用第三方身份提供方(例如 Okta 或 Azure Active Directory),通过 Connect 网关访问其集群。与 Google 账号不同,第三方用户由具有以下格式的 Identity and Access Management (IAM) 主账号表示:
principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE
WORKFORCE_POOL_ID是包含相关第三方身份提供方的员工池的名称。SUBJECT_VALUE是第三方身份与 Google 主体的映射。
对于第三方群组,IAM 主账号采用以下格式:
principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_VALUE
下图显示了第三方用户向启用该服务的集群进行身份验证并对其运行命令的典型流程。为了成功执行此流程,需要为用户或群组在集群上应用基于角色的访问控制 (RBAC) 政策。
对于单个用户,集群上必须存在使用该用户的完整 IAM 主账号名称的 RBAC 政策。
如果使用群组功能,集群上必须存在使用群组的完整 IAM 主账号名称的 RBAC 政策,该群组必须:
包含用户
alice@example.com作为成员。包含在 Alice 的 Google Cloud 组织中的员工池中的身份提供方映射中。
- 用户
alice@example.com使用第三方基于浏览器的登录功能以第三方身份登录 gcloud CLI。为了从命令行使用集群,用户会获取集群的网关kubeconfig,如使用 Connect 网关中所述。 - 用户运行
kubectl命令或是在 Google Cloud 控制台中打开 Google Kubernetes Engine 工作负载或对象浏览器页面来发送请求。 - Connect 网关接收请求,并使用员工身份联合来处理第三方身份验证。
- Connect 网关使用 IAM 执行授权检查。
- Connect 服务会将请求转发到集群上运行的 Connect Agent。请求中随附了用户的凭据信息,可在集群上进行身份验证和授权。
- Connect Agent 将请求转发到 Kubernetes API 服务器。
- Kubernetes API 服务器将请求转发给集群中的身份服务组件,后者会验证请求。
- 身份服务组件将第三方用户和群组信息返回到 Kubernetes API 服务器。然后,Kubernetes API 服务器可以根据集群中已配置的 RBAC 政策,使用这些信息对请求进行授权。
准备工作
-
安装 Google Cloud CLI。
-
配置 gcloud CLI 以使用您的联合身份。
如需了解详情,请参阅使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init 启用 Connect Gateway、GKE Connect、GKE Hub、Anthos Identity Service 和 Cloud Resource Manager API:
启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予角色。gcloud services enable connectgateway.googleapis.com
gkeconnect.googleapis.com gkehub.googleapis.com anthosidentityservice.googleapis.com cloudresourcemanager.googleapis.com - 对于 Google Cloud之外的集群,集群中的身份验证组件必须调用 Cloud Identity API。检查您是否拥有要求集群的出站流量通过代理的网络政策。
所需的角色
如需获得配置连接网关和集群所需的权限,请让您的管理员为您授予项目的 Editor (roles/editor) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
使用员工身份联合设置第三方身份属性映射
确保按照与您的身份提供方对应的说明,为您的 Google Cloud 组织设置员工池和身份提供方:
配置群组支持
连接网关使用集群中的身份验证组件来检索群组成员资格信息。如需启用必需的组件,请根据您的集群类型参阅以下文档之一:
- Google Cloud上的 GKE:为 RBAC 配置 Google 群组,然后跳到向群组授予 IAM 角色部分。
- GKE 关联集群:
Google Distributed Cloud:通过更新集群中的 ClientConfig 自定义资源来启用对群组的支持。 Distributed Cloud 会在每个集群的
kube-public命名空间中自动创建一个名为default的 ClientConfig。如需验证此自定义资源是否存在,请运行以下命令:kubectl --kubeconfig CLUSTER_KUBECONFIG get ClientConfig default -n kube-public将
CLUSTER_KUBECONFIG替换为集群的 kubeconfig 的路径。
如果您的集群或舰队已配置为支持 Google 群组,则无需执行其他步骤,并且您可以跳到向第三方用户和群组授予 IAM 角色。
以下部分介绍了如何更新 ClientConfig 自定义资源以启用群组支持。以下部分仅适用于 Google Distributed Cloud 集群。对于其他类型的集群,例如 GKE onGoogle Cloud、GKE on AWS 和 GKE on Azure,请跳至向群组授予 IAM 角色部分。
对于 Distributed Cloud,您可以为各个集群或舰队配置群组支持。您使用的集群类型决定了您配置群组支持的方式,如下所示:
- Distributed Cloud connected:仅限单个集群。 不支持舰队级配置。
- Google Distributed Cloud on VMware 和 Google Distributed Cloud on Bare Metal(纯软件):单个集群或舰队。
使用 GKE Fleet API 配置群组支持
对于 Google Distributed Cloud on VMware(纯软件)和 Google Distributed Cloud on Bare Metal(纯软件),您可以在舰队级别配置群组支持。如果您之前配置了舰队级身份验证(例如针对其他身份提供方),则群组身份验证已处于启用状态。 不过,如果您的网络政策要求出站流量通过代理,您必须使用有关该代理的信息更新现有配置。
如需在车队级配置群组支持,请选择以下选项之一:
控制台
在 Google Cloud 控制台中,前往 GKE 身份认证服务 页面。
点击启用 Identity Service。
选择要配置的 Google Distributed Cloud on VMware(纯软件)集群和 Google Distributed Cloud on Bare Metal 集群。
点击更新配置。修改 Identity Service 集群配置窗格随即会打开。
在配置身份提供方部分中,您可以选择保留、添加、更新或移除身份提供方。
点击继续以进行下一个配置步骤。如果您为此设置选择了至少一个符合条件的集群,则此时会显示 Google 身份验证部分。
选择启用,为所选集群启用 Google 身份验证。如果您需要通过代理访问 Google 身份提供方,请输入代理详细信息。
点击更新配置。这会将身份配置应用于所选集群。
gcloud
- 启用舰队级身份服务功能并配置集群,如设置舰队级身份验证管理中所述。
在包含 ClientConfig 规范的
auth-config.yaml文件中,添加以下字段:spec: authentication: - name: google-authentication-method google: disable: falsegoogle.disable字段中的false值可启用群组支持。 如需停用群组支持,请将此值修改为true。可选:如果您需要通过代理访问 Google 身份提供方,请将
proxy字段添加到上述配置中:spec: authentication: - name: google-authentication-method google: disable: false proxy: PROXY_URL将
PROXY_URL替换为用于连接到 Google 身份的代理服务器地址。例如:http://user:password@10.10.10.10:8888将配置应用于舰队中的集群:
gcloud container fleet identity-service apply \ --membership=CLUSTER_NAME \ --config=/path/to/auth-config.yaml
将
CLUSTER_NAME替换为集群在舰队内的唯一成员资格名称。
在舰队级层设置群组支持后,舰队控制器会管理配置。舰队级配置会覆盖您对特定集群中的配置所做的任何本地更改。
为单个集群配置群组支持
对于所有 Distributed Cloud 集群(包括 Distributed Cloud Connected),请通过更新每个集群中的 default ClientConfig 来启用群组支持:
获取集群的成员资格详细信息:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get memberships membership -o yaml将
USER_CLUSTER_KUBECONFIG替换为集群的 kubeconfig 文件的路径。如果 kubeconfig 中有多个上下文,则会使用当前上下文。运行该命令之前,您可能需要将当前上下文重置为正确的集群。在响应中,请查看
spec.owner.id字段以检索集群的成员资格详细信息。会员标识符的格式为//gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/MEMBERSHIP。输出类似于以下内容:
id: //gkehub.googleapis.com/projects/123456789/locations/global/memberships/xy-ab12cd34ef打开集群中的
defaultClientConfig 进行修改:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default如需启用群组支持,请将
google字段添加到spec.authentication字段:spec: internalServer: https://kubernetes.default.svc authentication: - google: audiences: - "CLUSTER_IDENTIFIER" name: google-authentication-method将
CLUSTER_IDENTIFIER替换为集群的成员资格详细信息。确保
internalServer字段的值为https://kubernetes.default.svc。可选:如果您需要通过代理访问 Google 身份提供方,请将
proxy字段添加到上述配置中:spec: internalServer: https://kubernetes.default.svc authentication: - google: audiences: - "CLUSTER_IDENTIFIER" name: google-authentication-method proxy: PROXY_URL将
PROXY_URL替换为用于连接到 Google 身份的代理服务器地址。例如:http://user:password@10.10.10.10:8888
向第三方用户和群组授予 IAM 角色
第三方身份需要以下额外的 Google Cloud 角色才能通过网关与连接的集群进行交互:
roles/gkehub.gatewayAdmin。此角色允许用户访问 Connect 网关 API。- 如果用户只需要所连接集群的只读权限,则可以改用
roles/gkehub.gatewayReader。 - 如果用户需要所连接集群的读写权限,则可以改用
roles/gkehub.gatewayEditor。
- 如果用户只需要所连接集群的只读权限,则可以改用
roles/gkehub.viewer。此角色允许用户查看已注册的集群成员资格。
以下代码展示了如何向各个身份和映射群组添加必要的角色:
单个身份
如需向项目 PROJECT_ID 的单个身份授予必要的角色,请运行以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \
--role=GATEWAY_ROLE \
--member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
gcloud projects add-iam-policy-binding PROJECT_ID \
--role=roles/gkehub.viewer \
--member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
其中
PROJECT_ID是项目的 ID。GATEWAY_ROLE是roles/gkehub.gatewayAdmin、roles/gkehub.gatewayReader或gkehub.gatewayEditor中的一个。WORKFORCE_POOL_ID是员工身份池 ID。SUBJECT_VALUE是用户身份。
群组
如需向项目 PROJECT_ID 的特定群组中的所有身份授予必要的角色,请运行以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \
--role=GATEWAY_ROLE \
--member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
gcloud projects add-iam-policy-binding PROJECT_ID \
--role=roles/gkehub.viewer \
--member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
其中
PROJECT_ID是项目的 ID。GATEWAY_ROLE是roles/gkehub.gatewayAdmin、roles/gkehub.gatewayReader或gkehub.gatewayEditor中的一个。WORKFORCE_POOL_ID是员工池 ID。GROUP_ID是映射的google.groups声明中的群组。
在应用 RBAC 政策时,请参阅使用 Workforce Identity 设置第三方映射中针对您的身份提供方列出的设置,以了解更多自定义项(例如指定部门属性)。
如需详细了解如何授予 IAM 权限和角色,请参阅授予、更改和撤消对资源的访问权限。
配置基于角色的访问权限控制 (RBAC) 政策
最后,每个集群的 Kubernetes API 服务器必须能够对来自指定第三方用户和群组且通过网关的 kubectl 命令授权。对于每个集群,您需要添加 RBAC 权限政策,用于指定主体对集群拥有哪些权限。
RBAC 政策中的主体必须使用与 IAM 绑定相同的格式,第三方用户以 principal://iam.googleapis.com/ 开头,第三方群组以 principalSet://iam.googleapis.com/ 开头。如果集群未配置来自外部第三方身份的身份验证,则除了第三方用户的角色/集群角色之外,您还需要模拟政策。在这种情况下,请按照这些 RBAC 设置步骤操作,添加以 principal://iam.googleapis.com/ 开头的第三方主账号作为用户。
以下示例展示了如何向第三方群组的成员授予配置了外部第三方身份验证的集群的 cluster-admin 权限。然后,您可以将政策文件另存为 /tmp/admin-permission.yaml,并将其应用于与当前上下文关联的集群。
cat <<EOF > /tmp/admin-permission.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gateway-cluster-admin-group
subjects:
- kind: Group
name: "principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
EOF
# Apply permission policy to the cluster.
kubectl apply --kubeconfig=KUBECONFIG_PATH -f /tmp/admin-permission.yaml
如需详细了解如何指定 RBAC 权限,请参阅使用 RBAC 授权。
后续步骤
- 了解如何使用 Connect 网关通过命令行连接到集群。
- 如需了解如何将 Connect 网关用作 DevOps 自动化的一部分的示例,请参阅与 Cloud Build 集成教程。