RBAC и ACL
ACL — список, кому что можно с конкретным объектом; RBAC — выдача прав через роли, а не напрямую пользователю.
Что такое RBAC и ACL
Это две модели управления доступом, отвечающие на один вопрос — «кому что разрешено» — но с разных сторон.
ACL расшифровывается как Access Control List, список контроля доступа. Он привязан к объекту и перечисляет, кто и что может с ним делать: «на файл /data/report.csv: Иванов — чтение, Петров — чтение и запись».
RBAC — Role-Based Access Control, ролевая модель. Права привязаны к роли, а пользователю выдаётся роль: «роль analyst может читать отчёты; Иванов — analyst».
| ACL | RBAC | |
|---|---|---|
| Права висят на | Объекте | Роли |
| Ответ на вопрос | Кто имеет доступ к этому файлу? | Что может этот пользователь? |
| Масштабирование | Плохо: N пользователей × M объектов | Хорошо: роли переиспользуются |
| Гранулярность | Высокая, вплоть до объекта | Ниже, на уровне групп прав |
| Приход нового сотрудника | Правка прав на каждом объекте | Выдать роль |
| Типичное применение | Файловая система, сетевые ACL | Корпоративные системы, Kubernetes |
На практике их не противопоставляют, а сочетают: RBAC задаёт основу, ACL точечно уточняет исключения. Ошибка — строить всё на ACL: через год никто не сможет ответить, почему у подрядчика есть доступ к бухгалтерской папке.
Соседние модели
- DAC (Discretionary) — владелец объекта сам раздаёт права. Классический
chmodв Linux. - MAC (Mandatory) — права задаёт система по меткам секретности, владелец не может их изменить. SELinux, режимы гостайны.
- ABAC (Attribute-Based) — решение считается из атрибутов: «отдел = финансы И время рабочее И устройство корпоративное». Гибче RBAC, сложнее в отладке; вычисляется в PDP.
ACL в Linux и в сети
# POSIX ACL — права тоньше, чем владелец/группа/остальные
setfacl -m u:deploy:rx /opt/app
getfacl /opt/app
# сетевой ACL — то же понятие на уровне пакетов
iptables -A INPUT -s 203.0.113.0/24 -p tcp --dport 5432 -j ACCEPT
iptables -A INPUT -p tcp --dport 5432 -j DROP
Security groups в облаке и правила iptables — это тот же ACL, только объект здесь не файл, а сетевой порт.
RBAC в Kubernetes
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: { namespace: prod, name: pod-reader }
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: { namespace: prod, name: dev-can-read-pods }
subjects: [{ kind: User, name: ivanov, apiGroup: rbac.authorization.k8s.io }]
roleRef: { kind: Role, name: pod-reader, apiGroup: rbac.authorization.k8s.io }
Role действует в namespace, ClusterRole — во всём кластере. Выдача cluster-admin «чтобы не разбираться» — самая частая дыра в кластерах.
Что такое имперсонация
Имперсонация (impersonation) — выполнение действий от имени другого пользователя. Легитимный механизм: админ проверяет, что видит клиент, сервис действует от имени пользователя, техподдержка воспроизводит баг.
sudo -u www-data ls /var/www # Linux
kubectl get pods --as=ivanov -n prod # Kubernetes: проверить чужие права
Правило простое: имперсонация обязана логироваться с двумя субъектами — кто вошёл и от чьего имени действовал. Если в логе остаётся только «ivanov удалил запись», а сделал это админ через имперсонацию, вы потеряли и аудит, и возможность разобрать инцидент. Само право имперсонации — привилегия уровня root, выдаётся единицам.
Принципы, которые важнее модели
- Минимальные привилегии. Права ровно под задачу, а не «на всякий случай».
- Разделение обязанностей. Тот, кто выдаёт доступ, не должен им пользоваться.
- Регулярный пересмотр. Права накапливаются: человек меняет отделы, а старые роли остаются. Без ревью через два года у половины сотрудников доступ ко всему.
- Отзыв при увольнении — через IAM, а не вручную по системам.
Связанные термины
- IAM / IdP — где централизованно живут пользователи и роли
- Аутентификация — шаг, предшествующий авторизации
- PDP (Policy Decision Point) — компонент, принимающий решение о доступе
- Несанкционированный доступ — что происходит при провале модели
- Конфиденциальность — свойство, которое обеспечивает разграничение
Готовы запустить GPU-задачу?
Запустить GPU-сервер