Документация / Руководство администратора / Доступ
Вход через SSO
Core принимает вход через внешнего провайдера по OAuth 2.0 и OpenID Connect. Поддержаны три типа приложения: "Универсальный" (любой провайдер OpenID Connect), GitHub и GitLab. Функция требует платной лицензии.
Раздел: "Аккаунты и роли" → "Интеграции SSO". Настраивает роль с правом "Роли и пользователи": "Изменение".
Как проходит вход
- На экране входа пользователь нажимает "Войти через SSO" и выбирает интеграцию по названию.
- Core перенаправляет его к провайдеру.
- Провайдер возвращает пользователя на адрес обратного вызова Core с кодом авторизации.
- Core получает токены, читает почту из ID-токена и проверяет домен почты.
- Core находит пользователя по почте или создаёт нового и назначает ему роли.
- Core выдаёт сессию и открывает интерфейс.
Перед началом
- В Core активирована платная лицензия.
- Core доступен пользователям по HTTPS. Схему адреса обратного вызова Core берёт из параметра установки
DOMAIN: адрес начинается сhttps://, только еслиDOMAINзадан со схемойhttps. - Core может открыть HTTPS-соединение с провайдером: он запрашивает метаданные и обменивает код на токены.
- Провайдер возвращает в ID-токене почту (
email), а для сопоставления ролей - список групп.
Адрес обратного вызова
Адрес обратного вызова (redirect URI) для регистрации приложения у провайдера:
https://<адрес Core>/oauth2/callback
Адрес пишется без косой черты в конце и без префикса /api/v1/. Скопируйте его из формы интеграции, поле "URL обратного вызова": Core строит его по имени хоста, на котором открыта форма. То же значение возвращает GET /api/v1/oauth2/integration-info/ в поле callback_url.
Поля интеграции
| Поле | Что задаёт | Обязательно |
|---|---|---|
| "Тип приложения" | "Универсальный", GitHub или GitLab | да |
| "Название" | имя на экране входа; уникально | да |
| "Домен" | имя хоста провайдера без схемы, например sso.example.ru. Из него строятся адреса по умолчанию |
да |
| "ID клиента" | идентификатор приложения у провайдера; хранится зашифрованным | да |
| "Секрет клиента" | секрет приложения; хранится зашифрованным | да |
| "URL сервера метаданных" | адрес OpenID Connect discovery. Пусто - https://<Домен>/.well-known/openid-configuration |
нет |
| "Скопы" | запрашиваемые скопы через пробел | для "Универсального" |
| "Использовать самоподписанный сертификат" | отключает проверку TLS-сертификата провайдера | нет |
| "Ключ JSON в JWT токене со списком внешних групп" | имя claim со списком групп, например groups |
нет |
| "Роли" | роли, которые получает каждый пользователь этой интеграции. Пусто - default |
нет |
| "Разрешенные email домены" | домены почты, которым разрешён вход. Пусто - любые | нет |
| "Сопоставление внешних групп" | какие роли выдавать за группы провайдера | нет |
| "Создавать роли на основе проектов репозиториев" | только GitHub и GitLab, см. Роли из проектов репозиториев | нет |
Самоподписанный сертификат
Флажок "Использовать самоподписанный сертификат" не добавляет доверенный сертификат, а полностью выключает проверку TLS при обращении к провайдеру. Используйте его только в изолированной сети.
Универсальный OIDC
Тип "Универсальный" рассчитан на провайдер OpenID Connect с discovery.
На стороне провайдера:
- Создайте конфиденциальный клиент с потоком Authorization Code.
- Укажите адрес обратного вызова Core.
- Включите в ID-токен claim
emailи, если нужны роли по группам, claim со списком групп.
Адрес метаданных у разных провайдеров разный. Если он не совпадает с https://<Домен>/.well-known/openid-configuration, укажите его явно:
| Провайдер | "URL сервера метаданных" |
|---|---|
| Keycloak | https://<хост>/realms/<realm>/.well-known/openid-configuration |
| ADFS | https://<хост>/adfs/.well-known/openid-configuration |
В Core:
- Откройте "Аккаунты и роли" → "Интеграции SSO" → "Создать SSO интеграцию".
- Выберите "Тип приложения" "Универсальный".
- Заполните "Название", "Домен", "ID клиента", "Секрет клиента", "URL сервера метаданных".
- Укажите "Ключ JSON в JWT токене со списком внешних групп", если сопоставляете группы.
- Выберите "Роли" и "Разрешенные email домены". Сохраните.
- Откройте интеграцию снова, проверьте поле "Скопы", укажите
openid email profileи сохраните.
После каждого сохранения интеграции типа "Универсальный" проверяйте поле "Скопы". Без скопа openid провайдер не выдаёт ID-токен, и вход завершается ошибкой "The provided scope is invalid, unknown, or malformed".
GitLab
Подходит для GitLab.com и своего экземпляра GitLab.
На стороне GitLab:
- Создайте приложение OAuth в разделе Applications: группы, экземпляра или пользователя.
- Укажите адрес обратного вызова Core.
- Отметьте скопы
openid,profile,email. Для ролей из проектов добавьтеread_api.
В Core:
- Выберите "Тип приложения" GitLab.
- В поле "Домен" укажите хост GitLab, например
gitlab.example.ru. Метаданные Core запросит по адресуhttps://<Домен>/.well-known/openid-configuration. - Заполните "ID клиента" и "Секрет клиента".
Скопы Core проставляет сам: openid profile email, с ролями из проектов - openid profile email read_api. Ключ групп для GitLab всегда groups_direct: в нём GitLab передаёт группы, в которых пользователь состоит напрямую. В "Сопоставлении внешних групп" указывайте полный путь группы, как он записан в groups_direct.
GitHub
Подходит для GitHub.com и GitHub Enterprise.
На стороне GitHub создайте OAuth App и укажите адрес обратного вызова Core в Authorization callback URL.
В Core:
- Выберите "Тип приложения" GitHub.
- В поле "Домен" укажите хост:
github.comили хост GitHub Enterprise. - Заполните "ID клиента" и "Секрет клиента".
Как Core работает с GitHub:
- адреса авторизации и обмена кода:
https://<Домен>/login/oauth/authorizeиhttps://<Домен>/login/oauth/access_token; метаданные -https://<Домен>/login/oauth/.well-known/openid-configuration; - скопы:
user:email, с ролями из проектов -user:email read:org repo; - почта - основной адрес учётной записи GitHub, имя - логин GitHub;
- групп GitHub не передаёт: роли выдавайте через поле "Роли" и роли из проектов.
Сопоставление ролей
При каждом входе пользователь получает:
- роли из поля "Роли" интеграции;
- роли из "Сопоставления внешних групп" для каждой группы из ID-токена;
- роль из проектов репозиториев, если включена.
Группа, которой ещё нет в сопоставлении, добавляется в него автоматически без ролей при первом входе пользователя из этой группы. После первых входов откройте интеграцию и назначьте роли новым группам: "Название внешней группы" → "Роли для назначения".
Отзыв ролей
Роли из SSO назначаются при входе. Чтобы отозвать роль, снимите её в Core вручную. Это нужно, когда пользователя исключили из группы у провайдера или вы изменили сопоставление.
Рекомендации:
- при отзыве доступа у провайдера снимайте роли в Core ("Снять роли") или отключайте учётную запись: Блокировка;
- регулярно сверяйте роли пользователей SSO: в списке пользователей есть фильтр "Метод аутентификации";
- в поле "Роли" интеграции держите только роль без доступа к данным, например
default. Права выдавайте через группы.
Роли из проектов репозиториев
Флажок "Создавать роли на основе проектов репозиториев" работает для GitHub и GitLab. При входе Core:
- Создаёт роль
<логин>_<название интеграции>, если её нет. Права роли - как у новой роли: "Продукты" и "Уязвимости" - "Просмотр", остальное - "Нет". - Получает от системы список репозиториев пользователя, кроме архивных.
- Добавляет в область роли продукты, где эти репозитории уже заведены ассетами.
- Заводит остальные репозитории ассетами в продукте по умолчанию и добавляет этот продукт в роль.
Импорт идёт в фоне и при большом числе репозиториев занимает до нескольких минут. Для GitHub выдайте OAuth App доступ к организациям в её настройках, иначе список репозиториев будет пустым.
Продукт по умолчанию
Все новые репозитории попадают в продукт по умолчанию, и он открывается каждому пользователю с ролью из проектов. Переносите ассеты из продукта по умолчанию в рабочие продукты: Продукты и ассеты.
Пользователи SSO
- Пользователя Core ищет по почте из ID-токена.
- Новый пользователь создаётся с именем, равным части почты до
@, и методом входа "SSO". Если такое имя уже занято, вход отклоняется: "User <имя> already exists". - Пользователь с методом "Пароль" через SSO не войдёт: "SSO is not available for this email". Переведите его на SSO: Метод входа.
- Пользователь с методом "SSO" не войдёт по паролю.
- Если заданы "Разрешенные email домены", домен почты должен совпасть с одним из них полностью.
Проверка
- Выйдите из Core. На экране входа нажмите "Войти через SSO": в списке должна быть интеграция с вашим названием.
- Войдите тестовой учётной записью провайдера.
- Проверьте в "Аккаунты и роли" → "Пользователи", что пользователь создан с методом "SSO" и нужными ролями.
- Откройте интеграцию и назначьте роли группам, которые появились в сопоставлении.
Удаление интеграции
"Удалить интеграцию" удаляет настройки и сопоставления. Пользователи, созданные через неё, и их роли остаются. Чтобы они снова могли войти, создайте новую интеграцию или переведите их на вход по паролю.
Ошибки
| Сообщение | Причина | Что сделать |
|---|---|---|
| "Unable to perform the request. Are the URLs typed correctly?" | Core не получил метаданные провайдера | проверьте "Домен", "URL сервера метаданных", сеть и сертификат провайдера |
| "An error occured while authorizing access token" | провайдер не обменял код на токены | проверьте "Секрет клиента" и адрес обратного вызова у провайдера |
| "The provided scope is invalid, unknown, or malformed" | в ответе нет ID-токена или почты | проверьте "Скопы" (openid обязателен) и claim email |
| "SSO is not available for this email" | домен почты не в "Разрешенных email доменах" или у пользователя метод "Пароль" | проверьте список доменов и метод входа |
| "User <имя> already exists" | имя из почты занято другим пользователем | переименуйте существующего пользователя или смените его почту |
| "No OAuth app found" | сессия входа потеряна: вход начат на другом адресе Core или cookie заблокированы | начните вход заново на внешнем адресе Core |
| после возврата от провайдера снова открывается экран входа | запрос на адрес обратного вызова не дошёл до API Core | проверьте адрес обратного вызова у провайдера: https://<хост>/oauth2/callback |
| 403 "Paid feature only." | лицензия не платная | Активация лицензии в Core |