Tenho os seguintes ClusterRoles definidos:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: deployer-system
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- list
- nonResourceURLs:
- '*'
verbs:
- list
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: deployer-nonsystem
rules:
- apiGroups:
- '*'
resources:
- secrets
- PersistentVolumes
- Role
- RoleBinding
verbs:
- list
- apiGroups:
- '*'
resources:
- deployments
- pods
verbs:
- get
- list
- watch
- create
- update
- patch
- nonResourceURLs:
- '*'
verbs:
- list
Eu uso os seguintes RoleBindings para atribuir a um usuário o ClusterRole acima:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: theuser-nonsystem-role-binding
namespace: nonsystem-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: deployer-nonsystem
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: theuser
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: theuser-kube-system-role-binding
namespace: system-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: deployer-system
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: theuser
No entanto, eles conseguem executar um kubectl -n [NAMESPACE] get secrets -o yaml
e ver todos os segredos. Eu esperaria que essa chamada fosse proibida com base nas especificações ClusterRole acima.
Estou esquecendo ou entendendo mal alguma coisa aqui? Por que o usuário pode "pegar" segredos?
ATUALIZAÇÃO: Observe: meu problema NÃO é que eles podem listar segredos. Meu problema aqui é que o usuário pode "obter" segredos (verbos diferentes!)
Porque os
list
verbos significam "get
aplicados a múltiplos recursos". Quando você executa akubectl get secret
operação sem especificar um segredo individual, você está executando umalist
operação.Considerando o RBAC em sua pergunta, posso perguntar sobre todos os segredos no
system-namespace
namespace:Mas não posso pedir um segredo específico :
Você deve pensar em
list
como uma versão mais poderosa deget
, já que permite a alguém a capacidade de enumerar e recuperar todos os segredos. Com apenasget
permissão, uma entidade deve saber o nome de um segredo específico para acessá-lo, e você pode, de fato, restringirget
o acesso a recursos específicos definindo oresourceNames
componente de uma regra.Supondo que
system-namespace
tenha segredossecret1
esecret2
, se eu tiver uma conta vinculada à seguinte função:Então só posso recuperar o segredo
secret1
: