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" }
]
}
Первый аутентификатор, способный обработать предоставленные учетные данные, будет использован. Остальные аутентификаторы игнорируются.
Если аутентификатор может обработать учетные данные, но они невалидны, другие аутентификаторы также игнорируются и запрос отклоняется.
Типы аутентификаторов
-
Основные аутентификаторы Spirit IAM — поддерживает все методы аутентификации Spirit IAM:
- Session cookie;
- Opaque access tokens;
- JWT-токены, включая системные JWT;
- Делегированные токены (token exchange).
ПримечаниеЕдиный аутентификатор Spirit IAM работает со всеми токенами и всеми поддерживаемыми методами аутентификации.
-
Специальные аутентификаторы:
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 для браузеров.