Настройка Token Exchange#
Blitz Identity Provider поддерживает технологию обмена маркеров доступа OAuth 2.0 Token Exchange. Стандартным применением данной технологии в Blitz Identity Provider является взаимодействие шлюза безопасности Blitz Keeper с сервисом авторизации для получения доступа к защищаемым сервисам.
Для настройки Token Exchange выполните описанную ниже последовательность действий.
Шаг 1. Создание правила доступа к сервисам#
Правила доступа по Token Exchange к защищаемым сервисам создаются в директории /usr/share/identityblitz/blitz-config/token_exchange/rules/
. Каждое правило создается как отдельный текстовый файл без расширения.
Пример файла с правилом доступа (тип specialize
):
{
"name": "rule-name",
"type": "specialize",
"desc": "",
"subjectTokenCond": {
"clientRights": [],
"userRights": [],
"scopes": ["openid"],
"userClaims": {},
"userGroups": []
},
"issue": {
"ttlInSec": 3600,
"allowedScopes": ["openid","profile"],
"allowedClaims": ["sub","global_role","org_id","rights"],
"addingScopes": [],
"addingClaims": []
}
}
Пример файла с правилом доступа (тип impersonate
):
{
"name": "rule-name",
"type": "impersonate",
"desc": "",
"subjectTokenCond": {
"clientRights": [],
"userRights": [],
"scopes": ["openid"],
"userClaims": {},
"userGroups": []
},
"authClientCond": {
"requiredRights":[
{
"rights": ["right1"],
"target": {
"type": "its",
"name": "app1"
}
}
},
"issue": {
"ttlInSec": 3600,
"allowedScopes": ["openid","profile"],
"allowedClaims": ["sub","global_role","org_id","rights"],
"addingScopes": [],
"addingClaims": []
}
}
Нужно заполнить следующие атрибуты правила доступа:
name
– имя правила, которое должно совпадать с именем файла с правилом доступа;type
– тип правила. Поддерживаются следующие типы правил:specialize
– по такому правилу приложение запрашивает обмен маркера доступа, выданного этому же приложению. Обмен выполняется с целью специализации маркера доступа – замены в нем разрешений (scope
), атрибутов (claims
) и списка получателей (audience
,aud
), формат маркера (jwt
илиopaque
);impersonate
– по такому правилу приложение запрашивает обмен маркера доступа, выданного другому приложению. Обмен выполняется при условии, что в предоставленном на обмен маркере доступа запрашивающее обмен приложение присутствует в списке получателей (audience, aud). Обмен используется в сценариях, когда приложение А получило исходно маркер доступа, подготовило его для передачи приложению Б (через обмен по типу правилаspecialize
), передало приложению Б, так, что приложение Б выпустило на основе полученного маркера доступа свой собственный (через обмен по типу правилаimpersonate
).
desc
– описание правила. Можно ввести любую текстовую информацию;subjectTokenCond
– условия выполнения правила. Если все указанные в правиле условия будут выполняться, то правило считается выполненным. Если хотя бы одно из условий в правиле не будет выполнено, то все правило считается невыполненным. Условия выполнения правил могут быть следующие:clientRights
– проверка наличия у приложения указанных прав доступа;Пример правила:
"clientRights": [ { "rights": ["right1"], "target": { "type": "its", "name": "app1" } } ]
В указанном примере проверяется наличие у вызывающего приложения права доступа
right1
в отношении другого приложения (app1
). Параметрits
в настройкеtarget
указывает тип объекта, в отношении которого проверяется наличие права доступа. Возможные значения:its
– право на приложение;grps
– право на группу доступа; отсутствиеtype
– право на учетную запись пользователя.userRights
– проверка наличия у пользователя указанных прав доступа.Пример 1 правила:
"userRights": [ { "rights": ["right2"], "target": { "type": "grps", "name": "org1", "ext": "orgs" } } ]
В указанном примере проверяется наличие у пользователя права доступа
right2
в отношении группы пользователей (org1
). В случае типа объекта группы доступа указывается дополнительный параметрext
, определяющий профиль группы доступа (см. Включение отображения групп в blitz.conf).Пример 2 правила:
"userRights": [ { "rights": ["security_administrator"], "target": { "type": "grps", "name": "${org_id}", "ext": "orgs" } } ]
В указанном правиле проверяется наличие у пользователя права доступа
security_administrator
в отношении группы пользователей из профиляorgs
, имеющей идентификатор, совпадающий со значением атрибутаorg_id
из состава исходного маркера доступа. В отличии от примера 1 в данном примере иллюстрируется возможность в качестве имени объекта права доступа указывать не конкретное значение объекта, а ссылаться на объект на основе значений из присланного маркера доступа ($org_id
).Пример 3 правила:
"userRights": [ { "rights": ["right3"], "target": { "type": "its", "name": "app1" } } ]
В данном примере проверяется наличие у пользователя права доступа
right3
в отношении приложенияapp1
.scopes
– проверка присутствия в маркере доступа требуемых разрешений (см. Общие настройки OAuth 2.0);Пример правила:
"scopes": ["scope1"]
В данном примере проверяется наличие в исходном маркере доступа разрешения с именем
scope1
.userClaims
– проверка, что у учетной записи пользователя атрибуты имеют указанные значения.Пример правила:
"userClaims": {"role":"FIN"}
В данном примере проверяется наличие у пользователя в учетной записи атрибута
role
с заполненным значениемFIN
. Допустимо использовать только атрибуты с типомString
.userGroups
– проверка, что учетная запись пользователя входит в указанные группы доступа.Пример правила:
"userGroups": [ { "name": "admin", "profile": "roles" } ]
В данном примере проверяется, что пользователь входит в группу доступа
admin
с профилемroles
.
authClientCond
– условия заменыclient_id
. Эти условия проверяются только для правил с типомimpersonate
. В правиле проверяется, что новое приложение имеет права доступа для обмена маркера доступа. Поддерживается условиеrequiredRights
.Пример правила:
"requiredRights":[ { "rights": ["right1"], "target": { "type": "its", "name": "app1" } } ]
В указанном примере проверяется наличие у вызывающего приложения права доступа
right1
в отношении другого приложения (app1
). Параметрits
в настройкеtarget
указывает тип объекта, в отношении которого проверяется наличие права доступа. Возможные значения:its
– право на приложение;grps
– право на группу доступа; отсутствиеtype
– право на учетную запись пользователя.issue
– правила выпуска нового маркера доступа, применяемые в случае, если правило было успешно выполнено. Правила выпуска нового маркера доступа состоят из:ttlInSec
– время жизни (в секундах) выпускаемого маркера доступа;allowedScopes
– разрешения, которые можно оставить в выпускаемом маркере доступа;allowedClaims
– атрибуты пользователя, которые можно оставить в выпускаемом маркере доступа;addingScopes
– добавляемые в маркер доступа разрешения;addingClaims
– добавляемые в маркер доступа атрибуты пользователя.
Шаг 2. Настройка обмена маркеров доступа#
Чтобы определить, как будет происходить обмен маркеров доступа по Token Exchange, а именно для каких защищаемых сервисов какие правила доступа будут применяться, необходимо в конфигурационном файле blitz.conf
добавить блок настроек blitz.prod.local.idp.token-exchange
следующего вида:
"token-exchange" : {
"resources" : [
{
"uri" : "http://secured_service_host/api/service1",
"methods" : ["GET","POST"],
"rules" : [
"rule1",
"rule2"
]
},
{
"audience" : "secured-api",
"rules" : [
"rule3"
]
},
…
]
}
В блоке resources
нужно для каждого сервиса заполнить настройки:
rules
– перечислить имена правил доступа к сервису. Каждому правилу соответствует свой файл настроек. Доступ к сервису разрешается, если хотя бы одно из правил из этого списка будет выполненным. Если все перечисленные правила не будут выполнены, то тогда доступ к сервису будет запрещен;uri
– необязательный параметр, может задавать адрес защищаемого сервиса. В задании адреса сервиса допустимо использовать звездочку (*
) для пропуска одного компонента пути адреса и двойную звездочку (**
) для пропуска оставшейся части пути адреса сервиса;methods
– необязательный параметр, указывает перечень HTTP-методов вызываемого сервиса;audience
– необязательный параметр, может задавать имя приложения. Данное значение будет включено в выпущенный новый маркер доступа в атрибутaud
. Обязательно должен быть указан один из параметровuri
илиaudience
.