Управление доступом пользователей
В SALT.BOX управление доступом к объектам приложения осуществляется с использованием Open Policy Agent (OPA) и системы пермишенов (permissions).
OPA принимает решение о предоставлении доступа к ресурсу на основании данных о пользователе, выполняемом действии и объекте доступа.
Дополнительные ограничения на доступ к конкретным объектам задаются с помощью пермишенов.
Общая схема проверки доступа выглядит следующим образом:
- Пользователь выполняет запрос к сервису приложения.
- Шлюз SALT.BOX формирует для OPA структуру
input, содержащую сведения о пользователе, выполняемом действии и запрашиваемом ресурсе. - OPA применяет соответствующую политику и определяет, разрешено ли выполнение операции.
- При использовании частичного запроса (partial query) OPA дополнительно формирует условия, которые используются для фильтрации доступных пользователю объектов.
- При проверке пермишенов учитываются условия, заданные для пользователя (subject) и объекта доступа (object).
Интеграция сервисов SALT.BOX с OPA
Для каждого эндпоинта сервиса в OPA определяется конфигурация, включающая:
- policy — политику, определяющую правила проверки доступа;
- action — выполняемое действие, например read или create;
- partial-query — запрос для формирования ограничений на выборку объектов;
- unknowns — параметры, значения которых не известны на этапе первоначальной проверки политики.
При выполнении запроса Шлюз SALT.BOX передаёт в OPA следующие основные сведения:
- subject — содержит идентификатор пользователя, его основные атрибуты и роли;
- action — определяет выполняемую операцию;
- resource — содержит сведения о ресурсе, к которому пользователь обращается.
Пример структуры input, передаваемой OPA:
{
"subject": {
"sub": "user_id",
"email": "user@example.com",
"roles": ["tasks_admin"]
},
"action": {
"method": "GET",
"name": "read"
},
"resource": {
"service_name": "core",
"path": ["tasks", "123"],
"query_params": {},
"body": null
}
}
Политика OPA
Политика OPA определяет базовые правила предоставления доступа.
Например, доступ к ресурсу может быть предоставлен пользователю с административной ролью либо в результате проверки соответствующего пермишена.
Пример политики OPA:
package core.tasks.read
import data.utils
default allow := false
allow if utils.base.is_admin
allow if utils.base.is_tasks_admin
allow if utils.conditions.check_user_permissions(
data.permissions,
input.resource.service_name,
"tasks",
"read",
input.subject,
object_from_api
)
В данном примере доступ разрешается (решение allow), если:
- пользователь имеет общие административные полномочия
(условиеif utils.base.is_admin) - либо пользователь имеет административные полномочия по управлению задачами
(условиеif utils.base.is_tasks_admin) - либо для пользователя выполняется соответствующий пермишен
(условиеif utils.conditions.check_user_permissions(...)).
Пермишены
Пермишен определяет, при каких условиях конкретному пользователю разрешено выполнять определённое действие над объектами ресурса.
Пермишен связывает:
- сервис;
- тип ресурса;
- действие;
- условия для объекта доступа;
- условия для пользователя.
Например, следующий пермишен разрешает пользователям с ролью test_common выполнять действие read над коллекциями с определёнными значениями slug:
{
"is_active": true,
"service": "core",
"resource": "collections",
"action": "read",
"object_conditions": {
"slug": { "$in": ["linux", "alt"] }
},
"subject_type": "user",
"subject_conditions": {
"roles": { "$in": ["test_common"] }
},
"created": "2024-07-28T12:00:00Z",
"modified": "2024-07-28T12:00:00Z"
}
Структура пермишена
| Ключ | Описание | Пример |
|---|---|---|
is_active | Флаг активности пермишена | false | true |
service | Имя сервиса, к которому относится пермишен | core |
resource | Тип ресурса | collections |
action | Действие над ресурсом | read, create |
object_conditions | Условия, которым должен соответствовать объект доступа | slug входит в заданный список |
subject_type | Тип субъекта доступа | user |
subject_conditions | Условия, которым должен соответствовать пользователь | наличие определённой роли |
created | Дата и время создания пермишена | |
modified | Дата и время последнего изменения пермишена |
Условия пермишена
Условия задаются в полях object_conditions и subject_conditions. Они определяют ограничения соответственно для объекта доступа и пользователя.
Для задания условий используются операторы, например:
$eq— значение поля должно соответствовать указанному значению;$in— значение поля должно входить в заданный список;$lt— значение поля должно быть меньше указанного значения;$and— одновременное выполнение нескольких условий;$or— выполнение хотя бы одного из условий.
Пример 1:
"roles": { "$in": ["test_common"] }— пользователь должен иметь одну из указанных ролей.
Пример 2:
"slug": { "$in": ["linux", "alt"] }— объект должен иметь slug из списка.
Условие для пользователя
Следующее условие в составе пермишена означает, что у пользователя должна быть роль test_common:
...
"subject_conditions": {
"roles": {
"$in": ["test_common"]
}
}
...
При этом в структуре subject пользователя должна присутствовать соответствующая роль:
"subject": {
"sub": "26b9a3e6-2e80-40c7-8f84-a993a1282169",
"email": "master@example.com",
"email_verified": false,
"name": "Petr Petrov",
"roles": [
"test_common"
]
}
Условие для объекта
Следующее условие в составе пермишена ограничивает доступ объектами, значение slug которых равно linux или alt:
...
"object_conditions": {
"slug": {
"$in": ["linux", "alt"]
}
}
...
Таким образом, наличие роли test_common само по себе не предоставляет пользователю доступ ко всем коллекциям. Пользователь получает доступ только к объектам, соответствующим заданному условию.
Совместное использование пермишенов и политик OPA обеспечивает:
- Гибкость — сложные правила доступа на основе ролей, атрибутов пользователя и характеристик объектов задаются без изменения кода приложения.
- Гранулярность контроля доступа — точно определяются пользователи, которым разрешены определённые действия, и конкретные объекты, к которым эти действия применимы.
- Поддержка ABAC — правила могут учитывать произвольные атрибуты субъекта, объекта и контекста запроса.
- Централизованный и единообразный контроль доступа — правила доступа для различных сервисов и ресурсов проверяются по единым принципам с использованием централизованного механизма OPA.
- Разделение логики сервисов и правил доступа — правила авторизации выносятся из бизнес-логики сервисов и задаются независимо от их реализации.
- Расширяемость — единый механизм управления доступом позволяет применять политики и пермишены при увеличении количества сервисов, ресурсов, пользователей и правил доступа.
- Аудируемость и управляемость — правила доступа представлены в явном виде, что упрощает их анализ, изменение и контроль.