热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我有一组users(dev-team),他们只需要访问dev和qa命名空

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

服务帐户

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"]

集群角色绑定

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命名空间。我在这里想念东西吗?



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

但是我想您真正想要的是限制对命名空间中的资源的访问,而不是对命名空间对象本身(其中包含的信息不超过命名空间名称的信息)的限制)。

要实现这一点,必须在要授予用户访问权限的名称空间中创建Roles(或ClusterRole)和RoleBindings。

在这里,您可以为dev-teamdev命名空间中的qa用户授予对所有资源的访问权限,但拒绝对任何其他命名空间中的任何资源的访问。

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

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

devqa命名空间中创建RoleBinding:

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)。


推荐阅读
author-avatar
跟-着感觉走
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有