Инструкция по настройке Single Sign-On аутентификации
Назначение документа
В данной инструкции представлено описание процесса настройки Single Sign-On аутентификации по протоколам SAML и OIDC, а также SSO-аутентификации по протоколу Kerberos в Microsoft Active Directory.
Документ предназначен для использования администраторами организации.
Дополнительная документация
Архитектура и описание системы — в документе представлена информация о сервисах VK Teams, обеспечивающих функциональность SSO-аутентификации, а также расположение log-файлов данных сервисов. Не является частью публичной документации, обратитесь к представителю VK Tech, чтобы ознакомиться с документом.
Предварительные условия для настройки SSO аутентификации
Клиентские платформы в рамках запроса аутентификации должны поддерживать аутентификацию через внешнего провайдера аутентификации, в результате которой сервер отдаст ответ, содержащий email и atoken (ключ, необходимый для инициализации сессии и получения идентификатора сессии — aimsid), используемые далее при старте сессии мессенджера.
Необходимо отключить блокировку всплывающих окон в браузере, так как поддержка OIDC реализована через всплывающие окна.
Функциональное описание
Внешний провайдер аутентификации (Identity Provider) — провайдер осуществляющий аутентификацию и поддерживающий протоколы аутентификации SAML и OpenID Connect. Провайдером является SAML IDP или OIDC Authentication server.
В процессе аутентификации пользователя сервер VK Teams перенаправляет пользователя на провайдера аутентификации. Клиент переходит по указанным redirect'ам, пользователь вводит аутентификационные данные. Далее клиент начинает новую сессию мессенджера и пользуется идентификатором сессии (aimsid) во всех запросах. При отзыве access_token'а aimsid инвалидируется.
На клиентских приложениях aimsid хранится во внутреннем хранилище ОС в зашифрованном виде (за исключением web-версии), в соответствии с таблицей:
Платформа | Технология для хранения aimsid |
---|---|
Web | Cookie |
MacOS | Симметрично зашифрован в локальном файле конфигурации |
Windows | Симметрично зашифрован в локальном файле конфигурации |
Linux | Симметрично зашифрован в локальном файле конфигурации |
iOS | Keychain |
Android | Encrypted Shared Preferences |
По окончании процесса аутентификации все управление токенами и взаимодействие с провайдером аутентификации осуществляется на стороне сервера VK Teams.
Хранением, обновлением, проверкой токенов занимается сервис Tokeeper. Сервис хранит данные, используя БД Tarantool. БД Tarantool отслеживает токены, период жизни которых истек, и автоматически удаляет их из базы.
Настройка взаимодействия Client — Server VK Teams представлена в разделе Шаг 1. Настройка подсистемы авторизации сервера VK Teams.
Настройка взаимодействия Server VK Teams — Identity Provider представлена в Шагах 2-5.
Ограничения Keycloak
Сервис Keycloak не взаимодействует с внешним провайдером аутентификации после авторизации. Соответственно, не сможет инвалидировать свою сессию при инвалидации сессии пользователя на внешнем провайдере аутентификации.
Однако, если инвалидировать сессию пользователя в сервисе Keycloak, клиент VK Teams разлогинит пользователя.
Одновременная работа с несколькими провайдерами аутентификации
SSO аутентификация поддерживает аутентификацию через несколько провайдеров.
Выбор нужного провайдера осуществляется на основе useragent'а, переданного параметром в начале процесса аутентификации. Процесс настройки провайдеров представлен ниже.
Secure Browser
- Для iOS — ASWebAuthenticationSession.
- Для Android — Android Custom Tab.
-
Для Web — Window.open.
-
Для Desktop — открытие в стандартном браузере.
Механизм аутентификации по протоколу OIDC
- Клиент из файла myteam-config.json получает auth-url для аутентификации (см. описание в разделе).
- Сервер VK Teams составляет запрос в Identity Provider на /auth endpoint и перенаправляет на него клиента.
-
Пользователь (в secure browser) вводит аутентификационные данные:
- если пользователем уже вошел в Систему, сработает SSO, и пользователю ничего вводить не потребуется;
- в случае ошибки логина/пароля — об этом пользователю сообщит Identity Provider внутри secure_browser в окне логина («Invalid username or password») и предложит ввести логин/пароль повторно.
-
Identity Provider перенаправляет на указанный сервером redirect_uri, находящийся на сервере.
-
Сервер VK Teams обрабатывает redirect от Identity Provider:
- в параметрах запроса получает:
- state;
- code.
- в параметрах запроса получает:
-
Сервер VK Teams составляет и отправляет запрос в Identity Provider на /token endpoint:
- в ответ получает необходимые токены и периоды их жизни (access_token, refresh_token, id_token и т.д.)
- сохраняет их, если ещё нет токенов для этого пользователя в хранилище сервера.
-
Сервер VK Teams завершает действия, необходимые для аутентификации, и осуществляет редирект на переданный redirect_uri, в параметрах передавая результат:
- code:
- 20000 – успех;
- 50000 - server error.
- reason — передается в случае ошибки;
- atoken;
- email;
- host_time.
- code:
Механизм аутентификации по протоколу SAML
- Клиент из файла myteam-config.json получает auth-url для аутентификации (см. описание в разделе).
- Сервер VK Teams составляет запрос в Identity Provider на /auth endpoint и перенаправляет на него клиента.
-
Пользователь (в secure browser) вводит аутентификационные данные:
- если пользователем уже вошел в Систему, сработает SSO, и пользователю ничего вводить не потребуется;
- в случае ошибки логина/пароля — об этом пользователю сообщит Identity Provider внутри secure_browser в окне логина («Invalid username or password») и предложит ввести логин/пароль повторно.
-
Identity Provider перенаправляет на указанный сервером redirect_uri, находящийся на сервере.
-
Сервер VK Teams обрабатывает redirect от Identity Provider:
- в параметрах запроса получает:
- state;
- code.
- в параметрах запроса получает:
-
Сервер VK Teams завершает действия, необходимые для аутентификации, и осуществляет редирект на переданный redirect_uri, в параметрах передавая результат:
- code:
- 20000 – успех;
- 50000 - server error.
- reason — передается в случае ошибки;
- atoken;
- email;
- host_time.
- code:
Настройка SSO аутентификации по протоколам OIDC и SAML
Необходимые шаги для включения SSO аутентификации представлены ниже:
Шаг 1. Настройка подсистемы авторизации сервера VK Teams
-
Перейти в веб-интерфейс сервиса Keycloak:
-
открыть доступ для домена mridme. <DOMAIN> и перейти в браузере на https://mridme.<DOMAIN>
Примечание
По умолчанию имя mridme не заведено в DNS, и в настройках nginx выставлено deny all. Не рекомендуется использовать этот способ доступа без крайней необходимости.
или
-
пробросить локальный порт на сервер:
и перейти в браузере http://127.0.0.1:8080/auth
-
-
Логин: admin
Пароль: пароль необходимо получить в службе технической поддержки
-
Перейти Manage → Clients → выбрать nomailcli → вкладка Settings → установить значения для полей:
- Valid redirect URIs — https://u.<DOMAIN_EXAMPLE.COM>/api/v87/rapi/auth/oidc/submitCode, где <DOMAIN_EXAMPLE.COM> — ваш домен;
-
Client authentication — On:
-
Вкладка Advanced → Advanced Settings → поле Proof Key for Code Exchange Code Challenge Method → указать S256:
-
Вкладка Credentials → поле Client Authenticator → указать Client Id and Secret:
-
Необязательные параметры:
-
Проставить поведение при первом логине:
Шаг 2. Добавление провайдера аутентификации
Протокол OIDC
Ниже представлено добавление провайдера аутентификации при использовании протокола OIDC. Если Вы используете протокол SAML, перейдите к разделу Протокол SAML.
-
Проверить доступность адреса mridme.<DOMAIN_TEAMS>.
-
Создать и настроить провайдера аутентификации:
Перейти Identity Providers → выбрать необходимый протокол: -
Указать следующие значения полей:
-
Alias — задать Alias провайдера;
-
Display name — задать имя провайдера:
-
Use discovery endpoint — Off;
-
Authorization URL — запросить у администратора Authentication server;
-
Token URL — запросить у администратора Authentication server;
-
Logout URL — запросить у администратора Authentication server;
-
User Info URL — запросить у администратора Authentication server;
-
Issuer — запросить у администратора Authentication server:
-
Validate Signatures — On;
-
Use JWKS URL — On;
-
JWKS URL — запросить у администратора Authentication server;
-
Client authentication — Client secret sent as post;
-
Client ID — запросить у администратора Authentication server;
-
Client Secret — запросить у администратора Authentication server:
Примечание
Данные поля также можно заполнить, импортировав файл конфигурации. Запросить Import External Config можно у администратора Authentication server.
-
Перетащить файл в поле Import config from file
или
-
В поле Import config from file нажать Browse → выбрать файл <Import External Config>:
-
-
Нажать Save.
Протокол SAML
Ниже представлено добавление провайдера аутентификации при использовании протокола SAML. Если Вы используете протокол OIDC, перейдите к разделу Шаг 3. Регистрация провайдеров аутентификации в сервисах VK Teams.
-
Проверить доступность адреса mridme.<DOMAIN_TEAMS>.
-
Создать и настроить провайдера аутентификации:
Перейти Identity Providers → выбрать необходимый протокол: -
Указать следующие значения полей:
-
Alias — задать Alias провайдера;
-
Display name — задать имя провайдера;
-
Use entity descriptor — Off:
-
Single Sign-On service URL — запросить у администратора IDP-сервера;
-
Single logout service URL — запросить у администратора IDP-сервера;
-
NameID policy format — Unspecified;
-
HTTP-POST binding response — On;
-
HTTP-POST binding for AuthnRequest — On;
-
HTTP-POST binding logout — On:
-
Allowed clock skew — 30:
Примечание
Данные поля также можно заполнить, импортировав файл конфигурации. Запросить Import External Config можно у администратора IDP-сервера.
-
Перетащить файл в поле Import config from file
или
-
В поле Import config from file нажать Browse → выбрать файл <Import External Config>:
-
-
Нажать Save.
Шаг 3. Регистрация провайдеров аутентификации в сервисах VK Teams
Провайдеры регистрируются в сервисе Stdb. Оттуда информацию о них получают сервисы Front и Tokeeper.
SSO аутентификация поддерживает аутентификацию через несколько провайдеров.
Возможна поддержка нескольких провайдеров в двух форматах:
Вариант 1. Сервис Keycloak подключается к провайдеру аутентификации в режиме посредника, все взаимодействие с провайдером лежит на сервисе Keycloak.
Настроить выбор провайдера для различных вариантов подключения:
-
Подключиться к сервису Stdb:
-
Далее добавить таблицу с данными провайдеров:
stdb_table_add idp_configurations issuer@string addr@string client_id@string scope@string client_secret@string platforms_and_auth_extra_params@string need_register_user@string stdb_row_add idp_configurations KK https://kc.<DOMAIN_EXAMPLE.COM>/auth/realms/myteam/.well-known/openid-configuration nomailcli openid use_secrets_luke '{ "web": "kc_idp_hint=<Alias_1>", "desktop": "kc_idp_hint=<Alias_2>", "default": "kc_idp_hint=<Alias_3>" }' false
, где
<Alias_1>
,<Alias_2>
,<Alias_3>
— значение поля Alias для провайдеров в Keycloak (см. Шаг 2. Добавление провайдера аутентификации).
Для разграничения платформ используется поле platforms_and_auth_extra_params таблицы сервиса Stdb. Уточнения значения поля platforms_and_auth_extra_params:
-
default — переходим на базовую страницу авторизации сервиса Keycloak;
-
kc_idp_hint=<Alias провайдера в настройках Keycloak>.
Доступные платформы:
- Web;
- Android;
- Desktop;
- IOS.
Внимание
Если одну и ту же платформу указать для нескольких провайдеров, сервис Stdb сообщит об этом в лог, SSO аутентификация работать не будет.
Примечание
Полезные команды в rlwrap:
-
get //получить список:
-
del // удалить:
-
set // изменить:
Вариант 2. Отдельная регистрация каждого провайдера: в таблицу каждый провайдер добавляется новой строкой.
Шаг 4. Настройка внешней аутентификации
-
Добавить в /usr/local/nginx-im/html/myteam/myteam-config.json указанное содержимое:
-
Применить:
, где: * — уникальное имя пода. Имя пода необходимо получить с помощью вывода команды:
Шаг 5. Настройка protocol mappers
Необходимо настроить по три mapper’a для каждого провайдера — email, lastName и firstName.
-
Перейти Identity Providers → выбрать провайдера → вкладка Mappers → нажать Add mapper:
-
Указать следующие значения полей:
- Name — задать имя mapper’a;
- Sync mode override — Inherit;
- Mapper type — Attribute Importer;
- Claim — маска для поиска атрибута в токене (запросить у администратора IDP-сервера);
- User Attribute Name — прописать один из вариантов — email; lastName или firstName:
-
Нажать Save.
-
Повторить шаги 1-4 для создания остальных двух mappers.
Настройка SSO аутентификации по протоколу Kerberos в Microsoft Active Directory
Предварительная настройка на сервере Active Directory
На контроллере домена необходимо зарегистрировать учетную запись.
В разделе Account ввести в поле User logon name HTTP/<почтовый домен>
.
В окне Account options внутри того же раздела отметьте чекбосы:
- User cannot change password.
- Password never expires.
- This account supports Kerberos AES 128 bit encryption.
- This account supports Kerberos AES 256 bit encryption.
- Do not require Kerberos preauthentication.
Затем в разделе управления групповыми политиками перейдите к настройке политики Configure encryption types allowed for Kerberos.
Во вкладке Security Policy Setting отметьте следующие политики:
- RC4_HMAC_MD5.
- AES128_HMAC_SHA1.
- AES256_HMAC_SHA1.
Шаг 1. Создание файла .keytab
В зависимости от выбранного типа шифрования — RC4-HMAC-NT или AES128-SHA1, AES256-SHA1 — выполните шаги, представленные ниже:
При использовании шифрования RC4-HMAC-NT
-
На Windows Server сгенерировать файл .keytab для Kerberos аутентификации в Active Directory :
ktpass -princ HTTP/computer.contoso.com@CONTOSO.COM -mapuser keycloak -pass "z7A&piloNu" -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out mcs.keytab
, где:
-
-princ
—FQDN сервера Keycloak в формате HTTP/computer.contoso.com@CONTOSO.COM для организации связи между сервисом Keycloak и Active DirectoryПримечание
Данный параметр учитывает регистр.
-
-mapuser
— пользователь, для которого регистрируется SPN и генерируется файл .keytab; -
-pass
— пароль пользователя; -
-crypto
— тип шифрования. Чтобы сгенерировать файл .keytab, поддерживающий все способы шифрования, укажите для ключа-crypto
значениеALL
; -
-ptype
— тип принципала; -
-out
— имя создаваемого файла .keytab.
-
-
Дополнительно включить шифрование RC4-HMAC-NT в контейнере с Keycloak (оно автоматически отключается, так как считается слабым):
-
создать файл через любой текстовый редактор (название указать любое, в примере использовано название файла allow-weak) со следующим содержимым:
-
создать configMap на основе файла, созданного на предыдущем шаге:
-
чтобы отредактировать deployments выполните команду:
-
добавить строки в секции
volumeMounts:
иvolumes:
-
При использование шифрования AES128-SHA1, AES256-SHA1
-
При использовании шифрования AES128-SHA1, AES256-SHA1 необходимы настройки для пользователей в Active Directory. В свойствах учетных записей пользователей необходимо установить поддержку типов шифрования AES128-SHA1, AES256-SHA1 — либо через групповые политики, либо вручную.
-
На Windows Server сгенерировать файл .keytab для Kerberos аутентификации в Active Directory :
ktpass -princ HTTP/computer.contoso.com@CONTOSO.COM -mapuser keycloak -pass "z7A&piloNu" -crypto AES128-SHA1 -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -out mcs2.keytab
, где:
-
-princ
—FQDN сервера Keycloak в формате HTTP/computer.contoso.com@CONTOSO.COM для организации связи между сервисом Keycloak и Active DirectoryПримечание
Данный параметр учитывает регистр.
-
-mapuser
— пользователь, для которого регистрируется SPN и генерируется файл .keytab; -pass
— пароль пользователя;-crypto
— тип шифрования. Чтобы сгенерировать файл .keytab, поддерживающий все способы шифрования, укажите для ключа-crypto
значениеALL
;-ptype
— тип принципала;-out
— имя создаваемого файла .keytab.
-
-
Создать секрет из файла .keytab и прокинуть его внутрь контейнера с Keycloak:
Шаг 2. Настройка realm
Перейти в веб-интерфейс сервиса Keycloak и настроить realm. Подробное описание представлено в разделе.
Шаг 3. Подключение пользователей из Keycloak через User Federation
-
Перейти в раздел Configure → User federation → нажать на кнопку Add Ldap providers:
-
Установить следующие значения полей:
- Vendor — Active Directory:
-
Connection URL – IP-адрес контроллера домена Active Directory.
При использовании защищенного соединения, указать протокол ldaps и сделать активными переключатели:
- Enable StartTLS – On;
- Connection pooling – On.
Для проверки настроенного соединения нажать на кнопку Test connection. При успешном соединении получаем сообщение «Successfully connected to LDAP».
-
Указать Bind DN и пароль пользователя, от имени которого планируется подключаться к Active Directory.
Для проверки подключения к Active Directory нажать на кнопку Test authentication. При успешном соединении получаем сообщение «Successfully connected to LDAP».
- Vendor — Active Directory:
-
В блоке с настройками поиска и обновления LDAP указать следующие значения полей:
- Edit mode — READ_ONLY;
- UsersDN — атрибут distinguishedName из Active Directory;
- Username LDAP attribute — cn;
- RDN LDAP attribute — cn;
- UUID LDAP attribute — objectGUID;
- User object classes — person, organizationalPerson, user;
- User LDAP filter — опциональный фильтр, который указывает, из какой группы в Active Directory брать пользователей;
- Search scope — Subtree для сквозного поиска пользователей согласно фильтру в поле User LDAP filter.
-
В блоке с настройками синхронизации указать следующие значения полей:
- Import users — On;
- Sync Registrations — On;
- Periodic full sync — On;
- Full sync period — указать период синхронизации в секундах;
-
Periodic changed users sync — On;
-
Changed users sync period — указать период синхронизации в секундах.
-
В блоке с настройками Kerberos указать следующие значения полей:
-
Нажать на кнопку Save.
-
Если в атрибуте cn приходит значение, отличное от username почтового адреса (без домена), нужно настроить маппинг поля username на тот атрибут, в котором приходит значение username.
Для этого в только что созданном провайдере - можно найти в User federation -> ldap:
- на вкладке Mappers открыть "username"
- в поле "LDAP Attribute" указать название атрибута, в котором приходит username
- нажать на кнопку Save.
Далее в настройке из п. 3, в блоке с настройками поиска и обновления LDAP, в поле "Username LDAP attribute" также указать название атрибута, в котором приходит username.
Шаг 4. Регистрация Keycloak в сервисе Stdb
Описание представлено в разделе.
Шаг 5. Настройка внешней аутентификации
Описание в разделе.
Распространенные проблемы
Надпись «Server error» в web-интерфейсе VK Teams, окно логина не открылось.
Отключите блокировку всплывающих окон в браузере.
Вместо окна логина отображается «Required parameter not found».
Проверьте, что в сервисе Stdb верно прописано поле addr в idp_configurations.
После логина появляется ошибка «Unexpected error when authenticating with identity provider», в логах сервиса Keycloak: «Failed to make identity provider oauth callback: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target».
Проверьте, что у сервиса Keycloak есть все сертификаты.