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 и защищенным приложением может привести к непредвиденным проблемам и снижает прозрачность системы.