在 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 绑定更改为具有相同格式后,一切都按预期工作。
我们正在现有的 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 绑定更改为具有相同格式后,一切都按预期工作。