RBAC Authorization

RBAC Authorization — один из способов распределения ролей между пользователями в кластере Kubernetes.

Распределить роли пользователей

  1. Подключите Service Account Token, так как без его использования после любого изменения ролей потребуется заново скачивать kubeconfig.
  2. Распределите роли.
    Пример манифеста, который создает два пространства имен и двух пользователей, каждый из которых сможет управлять подами только в своем пространстве имен:
apiVersion: v1
kind: Namespace
metadata:
    name: test-one
---
apiVersion: v1
kind: Namespace
metadata:
    name: test-two
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
    name: read-pods-one
    namespace: test-one
subjects:
- kind: ServiceAccount
    name: test-sa-one
    apiGroup: ""
roleRef:
    kind: Role
    name: pod-reader-one
    apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
    name: read-pods-two
    namespace: test-two
subjects:
- kind: ServiceAccount
    name: test-sa-two
    apiGroup: ""
roleRef:
    kind: Role
    name: pod-reader-two
    apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
    namespace: test-one
    name: pod-reader-one
rules:
- apiGroups: [""] # "" indicates the core API group
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
    namespace: test-two
    name: pod-reader-two
rules:
- apiGroups: [""] # "" indicates the core API group
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
    namespace: test-one
    name: test-sa-one
---
apiVersion: v1
kind: ServiceAccount
metadata:
    namespace: test-two
    name: test-sa-two
  1. Запустите манифест.
  2. Создайте токены:
kubectl get secret $(kubectl get serviceaccount test-sa-one -o jsonpath='{.secrets[0].name}' --namespace test-one) -o jsonpath='{.data.token}' --namespace test-one | base64 -d
<long and secure token for test-sa-one>

kubectl get secret $(kubectl get serviceaccount test-sa-two -o jsonpath='{.secrets[0].name}' --namespace test-two) -o jsonpath='{.data.token}' --namespace test-two | base64 -d
<long and secure token for test-sa-two>
  1. Вручную добавьте токены пользователям в файле kubeconfig.yaml для авторизации без пароля:
users:
...
- name: test-sa-one
  user:
    token: <long and secure token test-sa-one>
- name: test-sa-two
  user:
    token: <long and secure token test-sa-two>
...
  1. Проверьте работу распределения ролей:
kubectl config set-context --current --user=test-sa-two
Context "admin@kubernetes" modified.

kubectl get pods --namespace test-two
No resources found in test-two namespace.

kubectl get pods --namespace test-one
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:test-two:test-sa-two" cannot list resource "pods" in API group "" in the namespace "test-one"
________

kubectl config set-context --current --user=test-sa-one
Context "admin@kubernetes" modified.

kubectl get pods --namespace test-two
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:test-one:test-sa-one" cannot list resource "pods" in API group "" in the namespace "test-two"

kubectl get pods --namespace test-one
No resources found in test-one namespace.

Теперь пользователь test-sa-two имеет доступ к подам в пространстве имен test-two и не имеет доступа в пространстве имен test-one. Пользователь test-sa-one — наоборот.