我正试图使用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
两种可能性:
- 您是针对安全端口还是非安全端口运行"can-i"检查(添加--v=6查看(。针对不安全(非https(端口发出的请求总是经过授权的
- 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在命名空间locklockget、watch和listpods。
现在,如果我要求获得吊舱: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
创建即可。