Перейти к основному содержимому
Версия: Новая

Управление доступом пользователей

В SALT.BOX управление доступом к объектам приложения осуществляется с использованием Open Policy Agent (OPA) и системы пермишенов (permissions).

OPA принимает решение о предоставлении доступа к ресурсу на основании данных о пользователе, выполняемом действии и объекте доступа.
Дополнительные ограничения на доступ к конкретным объектам задаются с помощью пермишенов.

Общая схема проверки доступа выглядит следующим образом:

  1. Пользователь выполняет запрос к сервису приложения.
  2. Шлюз SALT.BOX формирует для OPA структуру input, содержащую сведения о пользователе, выполняемом действии и запрашиваемом ресурсе.
  3. OPA применяет соответствующую политику и определяет, разрешено ли выполнение операции.
  4. При использовании частичного запроса (partial query) OPA дополнительно формирует условия, которые используются для фильтрации доступных пользователю объектов.
  5. При проверке пермишенов учитываются условия, заданные для пользователя (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.
  • Разделение логики сервисов и правил доступа — правила авторизации выносятся из бизнес-логики сервисов и задаются независимо от их реализации.
  • Расширяемость — единый механизм управления доступом позволяет применять политики и пермишены при увеличении количества сервисов, ресурсов, пользователей и правил доступа.
  • Аудируемость и управляемость — правила доступа представлены в явном виде, что упрощает их анализ, изменение и контроль.