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

Identity & Access Proxy

Identity & Access Proxy (IAP) — центральный компонент контроля доступа в Spirit IAM, берет на себя все функции по контролю доступа. Построен на базе Ory Oathkeeper.

Основные функции​

  • Может защищать любые ресурсы, доступные по протоколу HTTP(S).
  • Производит аутентификацию входящих HTTP-запросов.
  • Производит авторизацию HTTP-запросов путем выполнения политик.
  • Может работать как обратный прокси-сервер перед API или веб-сервером в режиме Policy Enforcement Point (PEP).
  • Может быть подключен к API-шлюзам (Kong, Nginx, Envoy, AWS API Gateway и т.д.) в режиме Policy Decision Point (PDP).
  • Использует PBAC (ABAC) модель доступа и поддерживает MtRBAC — модель доступа.

Режимы работы​

Policy Enforcement Point (PEP)​

@startuml
actor Client
participant "Sidecar Proxy (PEP)" as sidecar
participant "Service" as service

Client --> sidecar : Request (JWT)
activate Client
activate sidecar

sidecar -> sidecar : Verify policy

alt Access allowed
sidecar --> service : Forward request
activate service
service --> sidecar : Response
deactivate service
sidecar --> Client : 200 OK
else Access denied
sidecar --> Client : 403 Forbidden
end

deactivate sidecar
deactivate Client
@enduml

Policy Decision Point (PDP)​

@startuml
actor Client
participant "API Gateway (PEP)" as gateway
participant "PDP" as pdp
participant "Application" as app

Client --> gateway : Request (JWT, API Key)
activate Client
activate gateway

gateway --> pdp : Is access allowed?
activate pdp

pdp --> gateway : Permit / Deny
deactivate pdp

alt Permit
gateway --> app : Forward request
activate app
app --> gateway : Response
deactivate app
gateway --> Client : 200 OK
else Deny
gateway --> Client : 403 Forbidden
end

deactivate gateway
deactivate Client
@enduml

Пайплайн обработки запроса​

Пайплайн обработки запроса — это последовательность этапов, через которые проходит каждый HTTP-запрос в Identity & Access Proxy (IAP).

IAP построен на базе Ory Oathkeeper Zero Trust Proxy. Архитектура прокси следует оригинальной архитектуре Oathkeeper с некоторыми отличиями в реализации отдельных компонентов.

Внутри IAP запрос проходит через следующие этапы в строгом порядке:

1. Обработка правил доступа (Access Rule Matching)
↓
2. Аутентификация (Authentication)
↓
3. Авторизация (Authorization)
↓
4. Мутация (Mutation)
↓
5. Обработка ошибок (Error Handling)

Каждый этап может либо пропустить запрос дальше, либо прервать обработку с соответствующей ошибкой.

Этап 1. Обработка правил доступа (Access Rule Matching)​

На этом этапе IAP определяет, какое правило доступа (Access Rule) применить к входящему запросу.

Правила доступа содержат:

  • match — условия сопоставления (URL, HTTP-методы);
  • authenticators — список аутентификаторов для проверки;
  • authorizer — авторизатор для проверки прав доступа;
  • mutators — мутаторы для трансформации запроса;
  • errors — обработчики ошибок.
Важно!

На данный момент в правилах доступа поддерживаются только glob паттерны для сопоставления URL, в отличие от upstream-версии Oathkeeper, которая поддерживает regex.

Пример правила доступа:

- id: "my-rule"
match:
url: "https://my-app.com/api/<.*>"
methods: ["GET", "POST"]
authenticators:
- handler: spirit_iam
authorizer:
handler: opa_builtin
config:
policy: my_policy.rego
mutators:
- handler: header
config:
headers:
X-User: "{{ print .Subject }}"
errors:
- handler: json

Этап 2. Аутентификация (Authentication)​

Аутентификатор отвечает за проверку учетных данных запроса и извлечение информации о субъекте. Подробнее см. в статье Аутентификация.

Аутентификатор исследует HTTP-запрос (например, заголовок Authorization или cookies) и выполняет бизнес-логику, которая возвращает:

  • true (аутентификация успешна) или false (аутентификация не удалась);
  • subject — идентификатор субъекта (пользователь, сервис, система).

Конфигурация аутентификатора​

Каждый аутентификатор имеет два ключа:

  • handler (string, required) — определяет тип аутентификатора — например, spirit_iam, jwt, cookie_session.
  • config (object, optional) — конфигурация аутентификатора. Ключи конфигурации зависят от типа аутентификатора.
{
"authenticators": [
{
"handler": "spirit_iam",
"config": {
"spirit_iam_base_url": "https://<spirit-iam-host>"
}
}
]
}

Приоритет аутентификаторов​

В правиле доступа можно определить несколько аутентификаторов:

{
"authenticators": [
{ "handler": "spirit_iam" },
{ "handler": "jwt" },
{ "handler": "cookie_session" }
]
}
Важно

Первый аутентификатор, способный обработать предоставленные учетные данные, будет использован. Остальные аутентификаторы игнорируются.

Если аутентификатор может обработать учетные данные, но они невалидны, другие аутентификаторы также игнорируются и запрос отклоняется.

Типы аутентификаторов​

  1. Основные аутентификаторы Spirit IAM — поддерживает все методы аутентификации Spirit IAM:

    Примечание

    Единый аутентификатор Spirit IAM работает со всеми токенами и всеми поддерживаемыми методами аутентификации.

  2. Специальные аутентификаторы:

    • noop — пропускает все запросы без проверки учетных данных. Используйте для публичных ресурсов, health-check эндпоинтов или тестирования конфигурации IAP.
    • unauthorized — отклоняет все запросы с ошибкой 401 Unauthorized. Полезен для временного блокирования доступа к ресурсам или явного запрета доступа к определенным путям.
    • anonymous — проверяет наличие заголовка Authorization и устанавливает subject в anonymous (или другое заданное значение), если заголовок отсутствует. Подходит для сценариев с частично открытым доступом, где требуется отслеживание анонимных пользователей.

Этап 3. Авторизация (Authorization)​

Авторизатор отвечает за проверку прав субъекта на выполнение запрошенного действия над ресурсом. Подробнее см. в статье Авторизация.

Авторизатор получает информацию о субъекте от аутентификатора и определяет, имеет ли субъект необходимые разрешения для доступа к ресурсу.

Примечание

В отличие от аутентификаторов авторизатор может быть только один на правило доступа (соотношение 1:1).

Типы авторизаторов​

В Spirit IAM поддерживается только один основной авторизатор opa_builtin — встроенный движок на базе Open Policy Agent (OPA). Другие авторизаторы из Ory Oathkeeper не поддерживаются.

Для написания политик и правил доступа используется язык Rego. Подробнее см. в статье Разработка ABAC политик авторизации. Политики доступа хранятся рядом с инстансом IAP в виде файлов и подставляются как часть конфигурации.

Важно

Сейчас IAP использует OPA v0.35.0.

Этап 4. Мутация (Mutation)​

Мутатор трансформирует учетные данные из входящего запроса в формат, понятный вашему backend-приложению.

Например, заголовок Authorization: basic может быть трансформирован в X-User: <subject-id>. Это позволяет писать backend-приложения, которые не зависят от типа исходных учетных данных.

Типы мутаторов​

Поддерживаются стандартные мутаторы Ory Oathkeeper:

  • noop — не трансформирует запрос, пропускает заголовки как есть.
  • id_token — трансформирует информацию об аутентификации в подписанный JWT (OpenID Connect ID Token).
  • header — добавляет заголовки к запросу, например, X-User: <subject-id>.
  • cookie — добавляет cookies к запросу.
  • hydrator — получает дополнительные данные из внешних API для использования другими мутаторами.
Внимание!

Если вы обогащаете запрос данными, для которых в сервисе дополнительно выполняете контроль доступа, вы используете систему неправильно. Размазывание ответственности между IAP и защищенным приложением может привести к непредвиденным проблемам и снижает прозрачность системы.

Этап 5. Обработка ошибок (Error Handling)​

Обработчик ошибок выполняет логику после того, как аутентификация или авторизация не удалась.

Обработчик ошибок может быть сконфигурирован для выполнения при определенных условиях. Например, можно настроить JSON-ответ для клиентов, ожидающих application/json, или HTTP Redirect для браузеров.

Условия выполнения (Error Matching)​

Обработчики ошибок могут быть настроены на выполнение при определенных условиях:

  • error — тип ошибки (unauthorized, forbidden, internal_server_error и другие).
  • request.header.accept — ожидаемый MIME-тип клиента.
  • request.header.content_type — тип контента запроса.
  • request.remote_ip — IP-адрес клиента, поддерживает CIDR-нотацию.

Типы обработчиков ошибок​

  1. Поддерживаются стандартные обработчики ошибок Ory Oathkeeper:

    • json — возвращает ответ в формате application/json (включен по умолчанию).
    • redirect — возвращает HTTP 302/301 redirect с заголовком Location.
    • www_authenticate — возвращает HTTP 401 с заголовком WWW-Authenticate.
  2. Fallback-обработчик. Можно использовать, если ни один из обработчиков не подошел по условиям.

Схема процесса обработки запроса​

Подробная схема процесса обработки запроса
@startuml
actor User as user
box "Service Deployment"
participant "Oathkeeper \nsidecar" as gw
participant "Service" as os
end box

participant "Spirit IAM" as iam

user -> gw: API request /service/entity

activate gw

gw -> gw: run authenticators

opt Custom authenticator
gw -> iam: get authN context
activate iam
iam --> gw: authN context
deactivate iam

opt Bad credentials
gw --> user: 401 authN error
end opt

gw -> gw: render {input} for OPA
end opt

opt No matching authenticator
gw --> user: 401 authN error
end opt

gw -> gw: run authorizers


opt opa authorizer
gw -> gw: OPA run policies
opt NO allow policies
gw --> user: 403 access denied
end opt
gw -> gw: allowed request
end opt

gw -> os: user request

note over os
В общем случае защищаемый сервис
не должен реализовывать логику
аутентификации/авторизации.
Все дошедшие до него запросы
считаются авторизованными.
end note

activate os
os --> gw: response
deactivate os
gw -> user: response
deactivate gw
@enduml