在 GKE 中启用 Google 云组 RBAC 后被禁止

Forbidden after enabling Google Cloud Groups RBAC in GKE

我们正在现有的 GKE 集群中启用 Google Cloud Groups RBAC。

为此,我们首先在 Workspace 中创建了所有组,并根据文档创建了所需的“gke-security-groups@ourdomain.com”。

这些组是在 Workspace 中创建的,与 Active Directory 集成以实现单点登录。

如文档所述,所有群组都是“gke-security-groups@ourdomain”的成员。并且所有群组都可以查看成员。

集群已更新为 Google Cloud Groups RBAC 启用标志,我们将值指定为“gke-security-groups@ourdomain.com”。

然后我们将其中一个组(我们称之为 group_a@ourdomain.com)添加到 IAM 并分配了一个自定义角色,该角色仅允许访问:

"container.apiServices.get",
"container.apiServices.list",
"container.clusters.getCredentials",
"container.clusters.get",
"container.clusters.list",

这只是用户能够登录 Kubernetes 集群并从那里能够应用 Kubernetes RBAC 的最低要求。

在 Kubernetes 中,我们应用了一个角色,它提供了特定命名空间中 pods 的列表,以及一个指定我们刚刚添加到 IAM 的组的角色绑定。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-role
  namespace: custom-namespace
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: test-rolebinding
  namespace: custom-namespace
roleRef:
  kind: Role
  name: test-role
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: Group
    name: group_a@ourdomain.com

到目前为止一切看起来都很好。但是,当尝试使用属于组“group_a@ourdomain.com”的用户列出此命名空间的 pods 时,我们得到:

Error from server (Forbidden): pods is forbidden: User "my-user@ourdomain.com" cannot list resource "pods" in API group "" in the namespace "custom-namespace": requires one of ["container.pods.list"] permission(s).

当然,如果我将 container.pods.list 赋予 group_a@ourdomain 分配的角色,我可以列出 pods,但它对所有命名空间开放,因为 GCloud 中的此权限是全局的.

我在这里错过了什么?

不确定这是否相关,但是我们在 gcloud 中的组织名为“my-company.io”,而 SSO 组名为“...@groups.my-company.io”,并且还使用“groups.my-company.io”域创建了 gke-security-groups 组。

此外,如果我直接指定用户而不是 RoleBinding 中的组,它会起作用。

您似乎正在尝试授予对扩展和应用程序 API 组中的部署的访问权限。这要求用户在您的角色规则中指定扩展和应用 api 组:

rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - '*'
- apiGroups:
  - extensions
  - apps
  resources:
  - deployments
  - replicasets
  verbs:
  - '*'

我也可以建议您重新创建角色和角色绑定。您也可以访问以下线程作为参考 RBAC issue : Error from server (Forbidden):

已编辑 012622:

能否确认您提供了凭据或配置文件(清单、YAML)?如您所知,此信息由 Kubernetes 和默认服务帐户提供。您可以通过 运行:

来验证
$ kubectl auth can-i get pods

告诉你,你的账户需要使用的账户类型是“服务账户”。要创建具有更广泛权限集的新服务帐户,以下是 YAML 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-read-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
 
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-read-sa
 
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-read-rolebinding
namespace: default
subjects:
- kind: ServiceAccount
name: pod-read-sa
apiGroup: ""
roleRef:
kind: Role
name: pod-read-role
apiGroup: ""

请使用以下线程作为参考。

原来是 case-sensitive 个字符串的问题,与 RBAC 中定义的实际规则无关,这些规则按预期工作。

组的名称是在 Azure AD 中使用驼峰命名法创建的。这些组名随后显示在 Google 工作区中,全部小写。

Azure AD 中的示例: thisIsOneGroup@groups.mycompany.com

在 RBAC 中配置的示例如 Google 工作区: thisisonegroup@groups.mycompany.com

我们从 Google 工作区 UI 复制了全部小写的名称,并将它们放入绑定中,这导致了问题。 Kubernetes GKE 区分大小写,它与绑定中配置的名称与 Google Workspace 中配置的电子邮件不匹配。

将 RBAC 绑定更改为具有相同格式后,一切都按预期工作。