尝试锁定命名空间时 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" :-(

我做错了什么?
谢谢

几种可能性:

  1. 你 运行 "can-i" 检查安全端口或不安全端口(添加 --v=6 以查看)。针对不安全(非 https)端口发出的请求始终得到授权。
  2. RBAC 是附加的,因此如果存在向该服务帐户(或 system:serviceaccounts:lockdown、system:serviceaccounts 或 system:authenticated),那么该服务帐户将具有该权限。您无法通过绑定更严格的角色
  3. 获得"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 watchlist 命名空间 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.

创建它们