SecurityFlow Кабинет лицензий , откроется в новой вкладке

Документация / Руководство администратора / Доступ

Вход через SSO

Обновлено 20 октября 2026

Core принимает вход через внешнего провайдера по OAuth 2.0 и OpenID Connect. Поддержаны три типа приложения: "Универсальный" (любой провайдер OpenID Connect), GitHub и GitLab. Функция требует платной лицензии.

Раздел: "Аккаунты и роли" → "Интеграции SSO". Настраивает роль с правом "Роли и пользователи": "Изменение".

Как проходит вход

  1. На экране входа пользователь нажимает "Войти через SSO" и выбирает интеграцию по названию.
  2. Core перенаправляет его к провайдеру.
  3. Провайдер возвращает пользователя на адрес обратного вызова Core с кодом авторизации.
  4. Core получает токены, читает почту из ID-токена и проверяет домен почты.
  5. Core находит пользователя по почте или создаёт нового и назначает ему роли.
  6. 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.

На стороне провайдера:

  1. Создайте конфиденциальный клиент с потоком Authorization Code.
  2. Укажите адрес обратного вызова Core.
  3. Включите в 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:

  1. Откройте "Аккаунты и роли" → "Интеграции SSO" → "Создать SSO интеграцию".
  2. Выберите "Тип приложения" "Универсальный".
  3. Заполните "Название", "Домен", "ID клиента", "Секрет клиента", "URL сервера метаданных".
  4. Укажите "Ключ JSON в JWT токене со списком внешних групп", если сопоставляете группы.
  5. Выберите "Роли" и "Разрешенные email домены". Сохраните.
  6. Откройте интеграцию снова, проверьте поле "Скопы", укажите openid email profile и сохраните.

После каждого сохранения интеграции типа "Универсальный" проверяйте поле "Скопы". Без скопа openid провайдер не выдаёт ID-токен, и вход завершается ошибкой "The provided scope is invalid, unknown, or malformed".

GitLab

Подходит для GitLab.com и своего экземпляра GitLab.

На стороне GitLab:

  1. Создайте приложение OAuth в разделе Applications: группы, экземпляра или пользователя.
  2. Укажите адрес обратного вызова Core.
  3. Отметьте скопы openid, profile, email. Для ролей из проектов добавьте read_api.

В Core:

  1. Выберите "Тип приложения" GitLab.
  2. В поле "Домен" укажите хост GitLab, например gitlab.example.ru. Метаданные Core запросит по адресу https://<Домен>/.well-known/openid-configuration.
  3. Заполните "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:

  1. Выберите "Тип приложения" GitHub.
  2. В поле "Домен" укажите хост: github.com или хост GitHub Enterprise.
  3. Заполните "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:

  1. Создаёт роль <логин>_<название интеграции>, если её нет. Права роли - как у новой роли: "Продукты" и "Уязвимости" - "Просмотр", остальное - "Нет".
  2. Получает от системы список репозиториев пользователя, кроме архивных.
  3. Добавляет в область роли продукты, где эти репозитории уже заведены ассетами.
  4. Заводит остальные репозитории ассетами в продукте по умолчанию и добавляет этот продукт в роль.

Импорт идёт в фоне и при большом числе репозиториев занимает до нескольких минут. Для GitHub выдайте OAuth App доступ к организациям в её настройках, иначе список репозиториев будет пустым.

Продукт по умолчанию

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

Пользователи SSO

  • Пользователя Core ищет по почте из ID-токена.
  • Новый пользователь создаётся с именем, равным части почты до @, и методом входа "SSO". Если такое имя уже занято, вход отклоняется: "User <имя> already exists".
  • Пользователь с методом "Пароль" через SSO не войдёт: "SSO is not available for this email". Переведите его на SSO: Метод входа.
  • Пользователь с методом "SSO" не войдёт по паролю.
  • Если заданы "Разрешенные email домены", домен почты должен совпасть с одним из них полностью.

Проверка

  1. Выйдите из Core. На экране входа нажмите "Войти через SSO": в списке должна быть интеграция с вашим названием.
  2. Войдите тестовой учётной записью провайдера.
  3. Проверьте в "Аккаунты и роли" → "Пользователи", что пользователь создан с методом "SSO" и нужными ролями.
  4. Откройте интеграцию и назначьте роли группам, которые появились в сопоставлении.

Удаление интеграции

"Удалить интеграцию" удаляет настройки и сопоставления. Пользователи, созданные через неё, и их роли остаются. Чтобы они снова могли войти, создайте новую интеграцию или переведите их на вход по паролю.

Ошибки

Сообщение Причина Что сделать
"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