Погляд на керування доступом на основі ролей (RBAC) у Kubernetes

RBAC

1. Метафора

  • Обліковий запис служби (Service Account, SA): “Cheedge” — це працівник (ідентифікаційна картка).
  • Роль/ClusterRole: “Тільки для читання доступ до кожного банківського сейфу” (дозволи/авторизація).
  • RoleBinding/ClusterRoleBinding: Контракт, що надає цьому чоловіку дозвіл на доступ до банківського сейфу.

Отже, згідно з вищенаведеним, цей чоловік може доступати банківський сейф щодня, але тільки для читання…

2. Визначення та використання

Після того, як ми розібрали базове значення цих понять, давайте розглянемо простий приклад, щоб контролювати операції create, delete, get і list для cm у поді:

Сценарій:

Надайте обліковому запису служби можливість створювати, видаляти, отримувати та перераховувати ConfigMaps у просторі імен default.

1. Створити Роль:

Визначте дозволи (отримати, перерахувати, створити, видалити cm у просторі імен default).

apiVersion: rbac.authorization.k8s.io/v1  
kind: Role  
metadata:  
 namespace: default  
 name: configmap-manager  
rules:  
- apiGroups: [""]  
 resources: ["configmaps"]  
 verbs: ["create", "delete", "get", "list"]

2. Створити Обліковий запис служби:

Представляє ідентичність пода.

apiVersion: v1  
kind: ServiceAccount  
metadata:  
 name: configmap-sa  
 namespace: default

3. Створити RoleBinding:

Надайте обліковому запису служби роль configmap-manager.

apiVersion: rbac.authorization.k8s.io/v1  
kind: RoleBinding  
metadata:  
 name: configmap-binding  
 namespace: default  
subjects:  
- kind: ServiceAccount  
 name: configmap-sa  
 namespace: default  
roleRef:  
 kind: Role  
 name: configmap-manager  
 apiGroup: rbac.authorization.k8s.io

4. Перевірити Налаштування:

Розгорніть под, який використовує обліковий запис служби, та перевірте дозволи:

apiVersion: v1  
kind: Pod  
metadata:  
 name: configmap-tester  
 namespace: default  
spec:  
 serviceAccountName: configmap-sa  
 containers:  
 - name: tester  
 image: bitnami/kubectl  
 command: ["sleep", "3600"]

Далі, виконайте команду в поді та спробуйте виконати команди:

kubectl exec -it configmap-tester -- /bin/sh  
kubectl create configmap test-config --from-literal=version=1  
kubectl get configmaps  
kubectl delete configmap test-config

Обліковий запис служби зможе виконувати лише ті дії, які дозволені роллю.

А якщо ми видалимо операцію create для cm, редагуючи role, тоді перевіримо ще раз і побачимо:

$ kubectl create configmap test-config --from-literal=version=1  
error: failed to create configmap: configmaps is forbidden: User "system:serviceaccount:default:configmap-sa" cannot create resource "configmaps" in API group "" in the namespace "default"

Тут ми бачимо повідомлення, яке говорить, що sa не може створювати cm.

5. Використовувати auth can-i для перевірки

Ми також можемо використовувати команду kubectl auth can-i для швидкої перевірки, чи можемо ми виконати певну дію з ресурсом.

kubectl auth can-i VERB RESOURCE --as=[USER|SA] -n NAMESPACE  
# наприклад  
$ k auth can-i create deploy --as=system:serviceaccount:ns1:view-sa -n ns1  
yes  
$ k auth can-i create deploy --as=new_user -n ns2  
no

Більше Деталей

Є ще деякі деталі, можливо, тривіальні, але краще їх роз'яснити.

1. Ролі ТІЛЬКИ Контролюють Ресурси Kubernetes

Role/ClusterRole стосується доступу до API:

  • Ролі Kubernetes і ClusterRoles спеціально призначені для управління доступом до ресурсів API Kubernetes. Вони не поширюються на контроль за не-Kubernetes ресурсами, такими як файли, каталоги або системні процеси.
  • Ці дозволи не "автоматично нічого не роблять", поки щось у поді не використовує їх, наприклад, kubectl, SDK Kubernetes (наприклад, client-go для Go), або інший інструмент, який взаємодіє з API Kubernetes.

Це означає, що якщо ви запустите под busybox з обліковим записом служби, який має дозволи на API, то под НЕ зможе нічого зробити з цими дозволами (якщо ви явно не встановите і не використовуватимете інструменти на кшталт kubectl або не напишете скрипт/застосунок, що робить API виклики).

Про користувача

Ми також можемо використовувати rolebinding (або clusterrolebinding), щоб прив'язати роль до користувача:

kubectl create rolebinding admin-binding \  
 --clusterrole=admin \  
 --user=user1 \  
 --user=user2 \  
 --group=group1 \  
 --namespace=default

Але для цього потрібна додаткова конфігурація, така як клієнтські сертифікати для автентифікації користувачів або створення контексту Kubernetes для користувача. Оскільки ми хочемо лише швидко поглянути на RBAC, як працюють sa, role, rolebinding разом, ми не будемо обговорювати випадок з користувачем. Якщо ви хочете більше деталей, зверніться до офіційної документації, тут.

3. Роль проти ClusterRole

  • Використовуйте Roles: Коли вам потрібні дозволи, обмежені конкретним простором імен. Це безпечніше і більш обмежене.
  • Використовуйте ClusterRoles: Коли вам потрібні дозволи для всього кластера (наприклад, для керування вузлами або ресурсами в кількох просторах імен).

Кращі практики:

  • Використовуйте Roles де можливо, щоб зменшити область дії та потенційний ризик.
  • Використовуйте ClusterRoles помірковано і тільки для завдань, які потребують дозволів на рівні всього кластера.

На практиці Roles є більш поширеними в багатокористувацьких кластерах, де простори імен ізолюють робочі навантаження. ClusterRoles використовуються для адміністративних завдань або операторами, які мають керувати ресурсами через простори імен.

4. Порівняння з концепціями хмарних сервісів

| **Kubernetes** | **AWS** | **Azure** |  
|------------------------------|-----------------------------------------|-------------------------------------|  
| **Service Account** | IAM Role/Instance Profile | Managed Identity |  
| **Role** | IAM Policy | Azure Role Definition |  
| **ClusterRole** | IAM Policy (with global permissions) | Azure Role Definition (global) |  
| **RoleBinding** | IAM Role Assignment (specific resource) | Role Assignment (specific resource) |  
| **ClusterRoleBinding** | IAM Role Assignment (global scope) | Role Assignment (global scope) |

Ключова різниця:

  • У AWS та Azure концепції автентифікації та авторизації поєднуються в одну сутність (наприклад, IAM Role/Managed Identity), тоді як у Kubernetes ці процеси розділені (обліковий запис служби для автентифікації, роль для авторизації).

Оригінально опубліковано на https://notes-renovation.hashnode.dev 6 січня 2025.

Перекладено з: A glance of Kubernetes Role-Based-Access-Control (RBAC)

Leave a Reply

Your email address will not be published. Required fields are marked *