尝试锁定命名空间时 RBAC 未按预期工作
RBAC not working as expected when trying to lock namespace
我正在尝试使用 RBAC 锁定 kubernetes 中的命名空间,所以我遵循了这个 tutorial.
我正在使用 baremetal 集群(没有 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
这个 应该 返回 "No" 但我得到 "Yes" :-(
我做错了什么?
谢谢
几种可能性:
- 你 运行 "can-i" 检查安全端口或不安全端口(添加 --v=6 以查看)。针对不安全(非 https)端口发出的请求始终得到授权。
- RBAC 是附加的,因此如果存在向该服务帐户(或 system:serviceaccounts:lockdown、system:serviceaccounts 或 system:authenticated),那么该服务帐户将具有该权限。您无法通过绑定更严格的角色
获得"ungrant"权限
我终于找到问题所在了。
角色和角色绑定必须在目标命名空间内创建。
我通过直接在 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-lockdown get、 watch 和 list 命名空间 lockdown[=] 中的 pods 44=].
现在,如果我要求获取 pods:kubectl auth can-i get pods --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown
,它将 return 是 。
相反,如果要求获取部署:kubectl auth can-i get deployments --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown
它将return否。
您也可以保留问题中的文件,然后使用 kubectl create -f <file> -n lockdown
.
创建它们
我正在尝试使用 RBAC 锁定 kubernetes 中的命名空间,所以我遵循了这个 tutorial.
我正在使用 baremetal 集群(没有 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
这个 应该 返回 "No" 但我得到 "Yes" :-(
我做错了什么?
谢谢
几种可能性:
- 你 运行 "can-i" 检查安全端口或不安全端口(添加 --v=6 以查看)。针对不安全(非 https)端口发出的请求始终得到授权。
- RBAC 是附加的,因此如果存在向该服务帐户(或 system:serviceaccounts:lockdown、system:serviceaccounts 或 system:authenticated),那么该服务帐户将具有该权限。您无法通过绑定更严格的角色 获得"ungrant"权限
我终于找到问题所在了。
角色和角色绑定必须在目标命名空间内创建。
我通过直接在 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-lockdown get、 watch 和 list 命名空间 lockdown[=] 中的 pods 44=].
现在,如果我要求获取 pods:kubectl auth can-i get pods --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown
,它将 return 是 。
相反,如果要求获取部署:kubectl auth can-i get deployments --namespace lockdown --as system:serviceaccount:lockdown:sa-lockdown
它将return否。
您也可以保留问题中的文件,然后使用 kubectl create -f <file> -n lockdown
.