gpt4 book ai didi

kubernetes - 通过访问限制列出的 Kubernetes 命名空间

转载 作者:行者123 更新时间:2023-12-02 11:34:08 28 4
gpt4 key购买 nike

我有一套users(dev-team)谁只需要访问 devqa命名空间。我创建了一个服务帐户、集群角色和集群角色绑定(bind),如下所示。

服务帐号

apiVersion: v1
kind: ServiceAccount
metadata:
name: dev-team

集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: dev-team-users
rules:
- apiGroups: ["rbac.authorization.k8s.io",""]
resources: ["namespaces"]
resourceNames: ["dev","qa"]
verbs: ["get","list","create"]

集群角色绑定(bind)
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: dev-team-user-bindings
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dev-team-users
subjects:
- kind: User
name: dev-team
namespace: kube-system
apiGroup: rbac.authorization.k8s.io

当我尝试验证访问权限时 kubectl get namespaces --as=dev-team
我收到以下错误消息
Error from server (Forbidden): namespaces is forbidden: User "dev-team" cannot list resource "namespaces" in API group "" at the cluster scope

我只希望看到 devqa要显示的 namespace 。我在这里错过了什么吗?

最佳答案

列表操作失败,因为您使用的是 resourceNames ClusterRole 中的字段以限制命名空间对象也授予访问权限,但列表将返回所有命名空间对象。

但我猜你真正想要的是限制对命名空间中资源的访问,而不是命名空间对象本身(它包含的信息不多于命名空间的名称)。

为此,您必须在要授予用户访问权限的命名空间中创建角色(或 ClusterRole)和 RoleBindings。

以下是授予 dev-team 的所有资源访问权限的方法。 dev 中的用户和 qa命名空间,但拒绝访问任何其他命名空间中的任何资源。

创建一个 ClusterRole(您也可以在 devqa 命名空间中创建一个角色,但是使用 ClusterRole 允许您只定义一次权限,然后从多个 RoleBindings 中引用它):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dev-team-users
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'

dev 中创建 RoleBinding和 qa命名空间:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: dev-team-user-bindings
namespace: dev
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dev-team-users
subjects:
- kind: User
name: dev-team
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: dev-team-user-bindings
namespace: qa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dev-team-users
subjects:
- kind: User
name: dev-team
apiGroup: rbac.authorization.k8s.io

测试访问:
kubectl get pods -n qa --as=dev-team           # Succeeds
kubectl get pods -n dev --as=dev-team # Succeeds
kubectl get pods -n default --as=dev-team # Fails
kubectl get pods -n kube-system --as=dev-team # Fails

Kubernetes RBAC documentation .

编辑

1. 识别用户创建的命名空间

RBAC 无法做到这一点。您需要某种形式的 auditing .

2. 识别用户有权访问的命名空间

使用 RBAC 也无法轻松做到这一点。但是您可以遍历所有命名空间并测试给定用户是否具有访问权限:

for n in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
echo -n "$n: "
kubectl auth can-i get pods -n "$n" --as=dev-team
done

您可以根据需要改变动词/资源部分(例如 get pods )。

关于kubernetes - 通过访问限制列出的 Kubernetes 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59062716/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com