尝试锁定命名空间时,RBAC未按预期工作



我正试图使用RBAC锁定kubernetes中的命名空间,所以我遵循了本教程
我正在开发裸机集群(没有minikube,没有云提供商(,并使用Ansible安装了kubernetes。

我创建了以下命名空间:

apiVersion: v1
kind: Namespace
metadata:
name: lockdown

服务帐户:

apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-lockdown
namespace: lockdown

角色:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: lockdown
rules:
- apiGroups: [""] # "" indicates the core API group
resources: [""]
verbs: [""]

角色绑定:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rb-lockdown
subjects:
- kind: ServiceAccount
name: sa-lockdown
roleRef:
kind: Role
name: lockdown
apiGroup: rbac.authorization.k8s.io

最后,我使用下一个命令测试了授权

kubectl auth can-i get pods --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown

这个应该返回"否",但我得到了"是":-(

我做错了什么
Thx

两种可能性:

  1. 您是针对安全端口还是非安全端口运行"can-i"检查(添加--v=6查看(。针对不安全(非https(端口发出的请求总是经过授权的
  2. RBAC是可添加的,因此,如果有一个现有的集群角色绑定或角色绑定向该服务帐户(或其中一个组system:serviceaccounts:locked、system:servicesaccounts或system:authenticated(授予"获取pods"权限,则该服务帐户将具有该权限。不能通过绑定更严格的角色来"取消授予"权限

我终于找到了问题所在。

角色绑定必须在目标命名空间内创建。

通过直接在yaml中指定名称空间,我更改了以下角色和角色绑定类型。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: lockdown
namespace: lockdown
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- watch
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rb-lockdown
namespace: lockdown
subjects:
- kind: ServiceAccount
name: sa-lockdown
roleRef:
kind: Role
name: lockdown
apiGroup: rbac.authorization.k8s.io

在本例中,我允许用户sa locklock在命名空间locklockgetwatchlistpods


现在,如果我要求获得吊舱:kubectl auth can-i get pods --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown,它将返回

相反,如果要求获取部署:kubectl auth can-i get deployments --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown,它将返回no


您也可以像问题中那样保留文件,只需使用kubectl create -f <file> -n lockdown创建即可。

相关内容

  • 没有找到相关文章

最新更新