Аутентификация и авторизация
Airlock выполняет и аутентификацию, и авторизацию:
- Аутентификация — подтверждение личности пользователя или сервиса.
- Авторизация — проверка прав доступа к ресурсу.
В этом документе описана авторизация пользователей и сервисов на основе RBAC.
Пользователи и роли
Airlock поддерживает несколько типов учётных записей:
- Интерактивные и неинтерактивные.
- Локальные и внешние.
После успешной аутентификации каждому пользователю назначается одна или несколько ролей.
Интерактивные пользователи
Интерактивные пользователи могут быть локальными или внешними. Локальные учётные записи хранят хеш пароля и данные MFA в бэкенде Airlock. Внешние учётные записи аутентифицируются через провайдер идентификации по протоколам SSO — OAuth 2.0, OIDC или SAML.
Внешние пользователи из SSO
При каждом входе пользователя SSO Airlock создаёт временную запись учётной записи, которая автоматически истекает вместе с SSO-сессией, и записывает события в журнал аудита. Это предотвращает конфликты имён с локальными пользователями.
Внешние пользователи из других кластеров
Пользователь может быть внешним по отношению к кластеру Airlock, если другой кластер или CA выдаёт сертификат, которому доверяет этот кластер. В этом случае Airlock применяет логику сопоставления ролей доверенных кластеров.
Локальные интерактивные пользователи
Локальные интерактивные пользователи имеют запись в бэкенде Airlock с учётными данными. Администратор создаёт учётные записи через airctl users add или API.
Каждый локальный пользователь Airlock должен быть связан с одной или несколькими ролями — это называется «сопоставлением ролей».
Неинтерактивные пользователи
Airlock поддерживает неинтерактивных пользователей для сервисов автоматизации (например, CI/CD или микросервисов). Локальные неинтерактивные пользователи имеют запись, сопоставляющую имя с ролями, но без учётных данных в базе данных.
Ролевое управление доступом (RBAC)
Каждому пользователю Airlock назначается одна или несколько ролей, которые определяют доступ к ресурсам и API Airlock.
Правила allow и deny
Каждая роль содержит два списка правил: allow и deny:
- По умолчанию всё запрещено.
- Правила
denyпроверяются первыми и имеют приоритет. - Правило состоит из ресурсов и глаголов (verbs).
Пример правила allow для просмотра списка записанных SSH- или Kubernetes-сессий:
allow:
- resources: [session]
verbs: [list]Principals
Роли определяют, какие principals (например, пользователи ОС Linux или группы Kubernetes) могут использовать пользователи с этой ролью:
spec:
allow:
logins: [ubuntu]
kubernetes_groups: [viewer]Если у пользователя несколько ролей, списки principals объединяются.
Метки
Метки ролей определяют, к каким ресурсам применяются правила. Пример доступа к SSH-узлам и кластерам Kubernetes:
spec:
allow:
node_labels:
'environment': '^test|staging$'
kubernetes_labels:
'region': 'us-west-*'
'cluster_name': '^us.*\.example\.com$'Правила применения меток:
- Для совпадения правила
allowдолжны совпасть все метки в правиле. - Для совпадения правила
denyдостаточно совпадения любой метки.
Пример: пользователь Alice имеет роли dev и prod. Роль dev разрешает SSH как root и полный доступ к Kubernetes как system:masters для ресурсов с метками test или stage. Роль prod разрешает SSH как ubuntu и доступ к Kubernetes как view для ресурсов с меткой prod.
- Alice может подключиться по SSH как
rootк серверу с меткойtestилиstage. - Alice не может подключиться как
rootк серверу с меткойprod— рольprodразрешает толькоubuntu.
Шаблоны ролей
Роли поддерживают переменные шаблонов:
spec:
allow:
logins: ['{{internal.logins}}']
kubernetes_groups: ['{{external.groups}}']Любая роль с интерполяцией переменных считается шаблоном роли.
Правила интерполяции:
- Если
external.groups— список["dev", "prod"], выражение["{{external.groups}}"]интерполируется в["dev", "prod"]. - Если переменная отсутствует, выражение
"{{external.groups}}"даёт пустую строку. - Недопустимые значения (например,
-fooкак Unix-логин) опускаются.
Шаблоны ролей вычисляются в момент доступа к ресурсу прокси или узлом. Переменные из провайдера идентификации кодируются в расширениях X.509-сертификата.
Условия ролей
Поле where ограничивает доступ по условиям. Пример — доступ только к собственным сессиям:
kind: role
metadata:
name: only-own-sessions
spec:
allow:
rules:
- resources: [session]
verbs: [list, read]
where: contains(session.participants, user.metadata.name)Параметры ролей
Помимо правил allow и deny, роли задают параметры подключения:
kind: role
version: v5
metadata:
name: relaxed
spec:
options:
max_session_ttl: 8h
lock: strictПри конфликте параметров из нескольких ролей Airlock выбирает наиболее строгое значение (например, меньший max_session_ttl или режим strict вместо best_effort).
Запросы доступа (Access Requests)
Роли могут разрешать запрос повышенных привилегий — других ролей или отдельных ресурсов. Роли определяют, кто может рассматривать запросы, и сколько одобрений или отклонений требуется. В Airlock эта возможность доступна через веб-интерфейс, airsh и предустановленные роли requester и reviewer.
spec:
allow:
review_requests:
roles: ['dbadmin']
request:
roles: ['common', 'dev-*']
thresholds:
- approve: 2
deny: 1