Аутентификация с помощью Keycloak
С помощью федерации удостоверений вы можете использовать Keycloak для аутентификации пользователей в организации.
Настройка аутентификации состоит из следующих этапов:
Перед началом
Чтобы воспользоваться инструкциями в этом разделе, вам понадобятся:
-
Платформа Docker. Если у вас не установлен Docker, установите его. Убедитесь, что Docker Engine запущен.
-
Локальный IdP-сервер Keycloak. Чтобы установить Keycloak, выполните команды:
git clone https://github.com/keycloak/keycloak-containers.git cd ./keycloak-containers/docker-compose-examples docker-compose -f keycloak-postgres.yml up
Примечание
Чтобы сотрудники в корпоративной сети или интернете могли использовать Keycloak для аутентификации в вашем приложении, разверните IdP-сервер Keycloak в сети и настройте публичный адрес. Подробнее читайте в документации Keycloak.
-
Действующий сертификат, который используется для подписи в службе Keycloak. Чтобы его получить:
-
Войдите в аккаунт администратора Keycloak по адресу:
http://keycloak.example.com:8080/auth/admin
. Вместоkeycloak.example.com
должен быть указан адрес вашего локального сервера, например:http://localhost:8080/auth/admin
.
Параметры входа по умолчанию:- User name or email :
admin
. - Password :
pa55w0rd
.
- User name or email :
-
В разделе Realm Settings выберите вкладку Keys.
-
В строке RS256 нажмите Certificate и скопируйте значение сертификата.
-
Сохраните сертификат в текстовом файле с расширением
.cer
в следующем формате:
-----BEGIN CERTIFICATE----- <значение X509Certificate> -----END CERTIFICATE-----
Вы также можете получить сертификат по прямой ссылке:
http://keycloak.example.com:8080/auth/realms/master/protocol/saml/descriptor
. Значение сертификата хранится в теге<ds:X509Certificate>...</ds:X509Certificate>
. -
Создание и настройка федерации в Yandex Cloud Organization
Создайте федерацию
-
Перейдите в сервис Yandex Cloud Organization.
-
На панели слева выберите раздел Федерации .
-
Нажмите кнопку Создать федерацию.
-
Задайте имя федерации. Имя должно быть уникальным в каталоге.
-
При необходимости добавьте описание.
-
В поле Время жизни cookie укажите время, в течение которого браузер не будет требовать у пользователя повторной аутентификации.
-
В поле IdP Issuer вставьте ссылку вида:
http://<хост>:8080/auth/realms/master
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master
-
В поле Ссылка на страницу для входа в IdP вставьте ссылку вида:
http://<хост>:8080/auth/realms/master/protocol/saml
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master/protocol/saml
-
Включите опцию Автоматически создавать пользователей, чтобы пользователь после аутентификации автоматически добавлялся в организацию. Если опция отключена, федеративных пользователей потребуется добавить вручную.
-
Чтобы все запросы аутентификации от Yandex Cloud содержали цифровую подпись, включите опцию Подписывать запросы аутентификации. Для завершения настройки потребуется скачать и установить сертификат Yandex Cloud. Скачать сертификат можно в поле Подписывать запросы аутентификации сразу после сохранения федерации.
-
Нажмите кнопку Создать федерацию.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды создания федерации:
yc organization-manager federation saml create --help
-
Создайте федерацию:
yc organization-manager federation saml create --name my-federation \ --organization-id <ID организации> \ --auto-create-account-on-login \ --encrypted-assertions \ --cookie-max-age 12h \ --issuer "http://<хост>:8080/auth/realms/master" \ --sso-binding POST \ --sso-url "http://<хост>:8080/auth/realms/master/protocol/saml"
Где:
-
name
— имя федерации. Имя должно быть уникальным в каталоге. -
organization-id
— идентификатор организации. -
auto-create-account-on-login
— флаг, который активирует автоматическое создание новых пользователей в облаке после аутентификации на IdP-сервере.
Опция упрощает процесс заведения пользователей, но созданный таким образом пользователь не сможет выполнять никаких операций с ресурсами в облаке. Исключение — те ресурсы, на которые назначены роли системной группеallUsers
илиallAuthenticatedUsers
.Если опцию не включать, то пользователь, которого не добавили в организацию, не сможет войти в консоль управления, даже если пройдет аутентификацию на вашем IdP-сервере. В этом случае вы можете управлять списком пользователей, которым разрешено пользоваться ресурсами Yandex Cloud.
-
encrypted-assertions
— флаг, который включает цифровую подпись запросов аутентификации. Для завершения настройки потребуется скачать и установить сертификат Yandex Cloud. -
cookie-max-age
— время, в течение которого браузер не должен требовать у пользователя повторной аутентификации. -
issuer
— идентификатор IdP-сервера, на котором должна происходить аутентификация:http://<хост>:8080/auth/realms/master
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master
-
sso-url
— URL-адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации:http://<хост>:8080/auth/realms/master/protocol/saml
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master/protocol/saml
-
sso-binding
— укажите тип привязки для Single Sign-on. Большинство поставщиков поддерживают тип привязкиPOST
.
-
-
Получите идентификатор каталога, в котором вы будете создавать федерацию.
-
Создайте файл с телом запроса, например
body.json
:{ "folderId": "<ID каталога>", "name": "my-federation", "organizationId": "<ID организации>", "autoCreateAccountOnLogin": true, "cookieMaxAge":"43200s", "issuer": "http://<хост>:8080/auth/realms/master", "ssoUrl": "http://<хост>:8080/auth/realms/master/protocol/saml", "securitySettings": { "encryptedAssertions": true }, "ssoBinding": "POST" }
Где:
-
folderId
— идентификатор каталога. -
name
— имя федерации. Имя должно быть уникальным в каталоге. -
organizationId
— идентификатор организации. -
autoCreateAccountOnLogin
— флаг, который активирует автоматическое создание новых пользователей в облаке после аутентификации на IdP-сервере.
Опция упрощает процесс заведения пользователей, но созданный таким образом пользователь не сможет выполнять никаких операций с ресурсами в облаке. Исключение — те ресурсы, на которые назначены роли системной группеallUsers
илиallAuthenticatedUsers
.Если опцию не включать, то пользователь, которого не добавили в организацию, не сможет войти в консоль управления, даже если пройдет аутентификацию на вашем IdP-сервере. В этом случае вы можете управлять списком пользователей, которым разрешено пользоваться ресурсами Yandex Cloud.
-
cookieMaxAge
— время, в течение которого браузер не должен требовать у пользователя повторной аутентификации. -
issuer
— идентификатор IdP-сервера, на котором должна происходить аутентификация:http://<хост>:8080/auth/realms/master
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master
-
ssoUrl
— URL-адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации:http://<хост>:8080/auth/realms/master/protocol/saml
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master/protocol/saml
-
encryptedAssertions
— флаг, который включает цифровую подпись запросов аутентификации. Для завершения настройки потребуется скачать и установить сертификат Yandex Cloud. -
ssoBinding
— укажите тип привязки для Single Sign-on. Большинство поставщиков поддерживают тип привязкиPOST
.
-
-
Создайте федерацию с помощью метода create:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <IAM-токен>" \ -d '@body.json' \ https://organization-manager.api.cloud.yandex.net/organization-manager/v1/saml/federations { "done": true, "metadata": { "@type": "type.googleapis.com/yandex.cloud.organization-manager.v1.saml.CreateFederationMetadata", "federationId": "ajeobmje4dgj0belagb9" }, ...
В ответе в свойстве
federationId
будет указан идентификатор созданной федерации: сохраните его. Этот идентификатор понадобится на следующих шагах.
Если у вас ещё нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
В конфигурационном файле опишите параметры федерации:
-
name
— имя федерации. Имя должно быть уникальным в каталоге. -
description
— описание федерации. -
organization_id
— идентификатор организации. -
labels
— набор пар меток ключ/значение, которые присвоены федерации. -
issuer
— идентификатор IdP-сервера, на котором должна происходить аутентификация:http://<хост>:8080/auth/realms/master
Если для IdP-сервера настроен публичный адрес, укажите его идентификатор. Например:
http://keycloak.example.com:8080/auth/realms/master
-
sso_binding
— укажите тип привязки для Single Sign-on. Большинство поставщиков поддерживают тип привязкиPOST
. -
sso_url
— URL-адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации:http://<хост>:8080/auth/realms/master/protocol/saml
Если для IdP-сервера настроен публичный адрес, укажите его URL. Например:
http://keycloak.example.com:8080/auth/realms/master/protocol/saml
-
cookie_max_age
— время в секундах, в течение которого браузер не должен требовать у пользователя повторной аутентификации. Значение по умолчанию8 часов
. -
auto_create_account_on_login
— флаг, который активирует автоматическое создание новых пользователей в облаке после аутентификации на IdP-сервере.
Опция упрощает процесс заведения пользователей, но созданный таким образом пользователь не сможет выполнять никаких операций с ресурсами в облаке. Исключение — те ресурсы, на которые назначены роли системной группеallUsers
илиallAuthenticatedUsers
.Если опцию не включать, то пользователь, которого не добавили в организацию, не сможет войти в консоль управления, даже если пройдет аутентификацию на вашем сервере. В этом случае вы можете управлять списком пользователей, которым разрешено пользоваться ресурсами Yandex Cloud.
-
case_insensitive_name_ids
— зависимость имен пользователей от регистра.
Если опция включена, идентификаторы имен федеративных пользователей будут нечувствительны к регистру. -
security_settings
— настройки безопасности федерации:encrypted_assertions
— подписывать запросы аутентификации.
Если включить опцию, то все запросы аутентификации от Yandex Cloud будут содержать цифровую подпись. Вам потребуется скачать и установить сертификат Yandex Cloud.
Пример структуры конфигурационного файла:
resource "yandex_organizationmanager_saml_federation" federation { name = "my-federation" organization_id = "<ID организации>" auto_create_account_on_login = "true" issuer = "http://<хост>:8080/auth/realms/master" sso_url = "http://<хост>:8080/auth/realms/master/protocol/saml" sso_binding = "POST" security_settings { encrypted_assertions = "true" } }
-
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
$ terraform plan
Если конфигурация описана верно, в терминале отобразятся параметры федерации. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Создайте федерацию.
-
Если в конфигурации нет ошибок, выполните команду:
$ terraform apply
-
Подтвердите создание федерации.
После этого в указанной организации будет создана федерация. Проверить появление федерации и ее настроек можно в организации в разделе Федерации.
-
Добавьте сертификаты
При аутентификации у сервиса Organization должна быть возможность проверить сертификат IdP-сервера. Для этого добавьте сертификат в федерацию:
-
На панели слева выберите раздел Федерации .
-
Нажмите имя федерации, для которой нужно добавить сертификат.
-
Внизу страницы нажмите кнопку Добавить сертификат.
-
Введите название и описание сертификата.
-
Выберите способ добавления сертификата:
-
Чтобы добавить сертификат в виде файла, нажмите Выбрать файл и укажите путь к нему.
-
Чтобы вставить скопированное содержимое сертификата, выберите способ Текст и вставьте содержимое.
-
-
Нажмите кнопку Добавить.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды добавления сертификата:
yc organization-manager federation saml certificate create --help
-
Добавьте сертификат для федерации, указав путь к файлу сертификата:
yc organization-manager federation saml certificate create \ --federation-id <ID федерации> \ --name "my-certificate" \ --certificate-file certificate.cer
Воспользуйтесь методом create для ресурса Certificate:
-
Сформируйте тело запроса. В свойстве
data
укажите содержимое сертификата:{ "federationId": "<ID федерации>", "name": "my-certificate", "data": "-----BEGIN CERTIFICATE..." }
-
Отправьте запрос на добавление сертификата:
$ export IAM_TOKEN=CggaATEVAgA... $ curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${IAM_TOKEN}" \ -d '@body.json' \ "https://organization-manager.api.cloud.yandex.net/organization-manager/v1/saml/certificates"
Совет
Чтобы аутентификация не прерывалась в тот момент, когда у очередного сертификата закончился срок действия, рекомендуется добавлять в федерацию несколько сертификатов — текущий и те, которые будут использоваться после текущего. Если один сертификат окажется недействительным, Yandex Cloud попробует проверить подпись другим сертификатом.
Получите ссылку для входа в консоль
Когда вы настроите аутентификацию с помощью федерации, пользователи смогут войти в консоль управления по ссылке, в которой содержится идентификатор федерации.
Получите ссылку:
-
Скопируйте идентификатор федерации:
-
На панели слева выберите раздел Федерации .
-
Скопируйте идентификатор федерации, для которой вы настраиваете доступ.
-
-
Сформируйте ссылку с помощью полученного идентификатора:
https://console.cloud.yandex.ru/federations/<ID федерации>
Создание и настройка SAML-приложения в Keycloak
В роли поставщика удостоверений (IdP) выступает SAML-приложение в Keycloak. Чтобы создать и настроить SAML-приложение:
-
Войдите в аккаунт администратора Keycloak по адресу
http://keycloak.example.com:8080/auth/admin
. Вместоkeycloak.example.com
должен быть указан адрес вашего локального сервера, например:http://localhost:8080/auth/admin
.Параметры входа по умолчанию:
- User name or email :
admin
. - Password :
pa55w0rd
.
- User name or email :
-
Создайте SAML-приложение:
-
На панели слева выберите Clients. Нажмите кнопку Create.
-
В поле Client ID введите полученную ранее ссылку для входа в консоль.
-
В поле Client Protocol выберите вариант saml.
-
Нажмите Save.
-
-
Настройте параметры SAML-приложения на вкладке Settings:
-
Введите полученную ранее ссылку для входа в консоль в полях:
- Valid Redirect URIs;
- Base URL;
- IDP Initiated SSO Relay State.
-
Включите опции:
- Include AuthnStatement;
- Sign Assertions;
- Force POST Binding;
- Front Channel Logout.
-
В поле Signature Algorithm выберите RSA_SHA256.
-
В поле SAML Signature Key Name выберите CERT_SUBJECT.
-
В качестве Name ID Format выберите подходящий вариант из списка. Чтобы выбранный вариант передавался вне зависимости от настроек Yandex Cloud Organization, включите опцию Force Name ID format.
-
Нажмите кнопку Save.
-
-
Если при создании федерации в Yandex Cloud Organization вы включили опцию Подписывать запросы аутентификации, настройте в SAML-приложении проверку цифровой подписи:
-
В настройках SAML-приложения включите опции Encrypt Assertions и Client Signature Required и сохраните приложение, чтобы обновить доступные вкладки.
-
На вкладке Keys SAML-приложения в разделе Signing Key нажмите кнопку Import.
-
В поле Archive Format выберите Certificate PEM.
-
Нажмите кнопку Select file и выберите сертификат для подписи запросов аутентификации. Сертификат доступен на странице сведений о федерации в Yandex Cloud Organization в поле Подписывать запросы аутентификации.
-
Нажмите Import.
-
-
Добавьте пользователей:
-
На панели слева выберите Users.
-
Нажмите Add user и введите данные пользователя.
-
Нажмите кнопку Save.
-
На вкладке Credentials задайте пароль и нажмите Set Password.
-
Добавление пользователей в Yandex Cloud Organization
Если при создании федерации вы не включили опцию Автоматически создавать пользователей, федеративных пользователей нужно добавить в организацию вручную.
Для этого вам понадобятся пользовательские Name ID. Их возвращает IdP-сервер вместе с ответом об успешной аутентификации.
Добавить пользователя может администратор (роль organization-manager.admin
) или владелец (роль organization-manager.organizations.owner
) организации. Как назначить роль пользователю, читайте в разделе Роли.
-
Войдите в аккаунт администратора или владельца организации.
-
Перейдите в сервис Yandex Cloud Organization.
-
На левой панели выберите раздел Пользователи .
-
В правом верхнем углу нажмите на стрелку возле кнопки Добавить пользователя. Выберите пункт Добавить федеративных пользователей.
-
Выберите федерацию, из которой необходимо добавить пользователей.
-
Перечислите Name ID пользователей, разделяя их переносами строк.
-
Нажмите кнопку Добавить. Пользователи будут подключены к организации.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды добавления пользователей:
yc organization-manager federation saml add-user-accounts --help
-
Добавьте пользователей, перечислив их Name ID через запятую:
yc organization-manager federation saml add-user-accounts --id <ID федерации> \ --name-ids=alice@example.com,bob@example.com,charlie@example.com
Где:
-
id
— идентификатор федерации. -
name-ids
— Name ID пользователей.
-
Чтобы добавить пользователей федерации в облако:
-
Сформируйте файл с телом запроса, например
body.json
. В теле запроса укажите массив Name ID пользователей, которых необходимо добавить:{ "nameIds": [ "alice@example.com", "bob@example.com", "charlie@example.com" ] }
-
Отправьте запрос, указав в параметрах идентификатор федерации:
$ curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <IAM-токен>" \ -d '@body.json' \ https://organization-manager.api.cloud.yandex.net/organization-manager/v1/saml/federations/<ID федерации>:addUserAccounts
Настройка сопоставления атрибутов пользователей
После аутентификации пользователя IdP-сервер отправит в Yandex Cloud SAML-сообщение, которое будет содержать:
-
информацию об успешной аутентификации;
-
атрибуты пользователя, такие как список ролей, имя, фамилия и адрес электронной почты.
Вы можете настроить сопоставление между атрибутами SAML-сообщения и персональными данными, которые хранятся на IdP-сервере. Для этого:
-
Включите опцию сопоставления ролей поставщика удостоверений и Yandex Cloud Organization:
-
На панели слева выберите Client Scopes → role_list.
-
Перейдите на вкладку Mappers и выберите role list.
-
Включите опцию Single Role Attribute.
-
-
Настройте атрибуты, которые будут передаваться в Yandex Cloud:
-
На панели слева выберите Clients и откройте настройки вашего SAML-приложения.
-
На вкладке Mappers нажмите кнопку Add Builtins.
-
Отметьте атрибуты в списке и нажмите кнопку Add selected. В Keycloak по умолчанию доступны атрибуты пользователя:
X500 email
— адрес электронной почты;X500 surname
— фамилия;X500 givenName
— имя;role list
— перечень ролей.
-
Вы можете создать дополнительные атрибуты для пользователей, например номер телефона. Для этого нажмите Create, в поле Mapper Type выберите опцию User Attribute и введите параметры атрибута.
-
Настройте синхронизацию атрибутов Keycloak и Yandex Cloud Organization: откройте атрибут и измените значение SAML Attribute Name. Значения SAML Attribute Name, которые поддерживаются в Yandex Cloud Organization, приведены ниже.
-
-
Если вы создали дополнительные атрибуты, добавьте их в параметры пользователя:
-
На панели слева выберите Users, откройте параметры пользователя и перейдите на вкладку Attributes.
-
В поле Key укажите значение Name, которые было присвоено дополнительному атрибуту.
-
В поле Value введите данные пользователя, которые будут передаваться в атрибуте.
Примечание
По умолчанию для поля Value установлено ограничение в 256 символов. Атрибуты могут содержать большее количество символов — например, аватар в кодировке Base64. Чтобы добавить такое значение, измените тип данных поля во внутреннем хранилище Keycloak в таблице
user_attribute
. -
Нажмите Add и затем Save.
-
Данные пользователя | Комментарий | SAML Attribute Name |
---|---|---|
Почта | Используется для отправки уведомлений из сервисов Yandex Cloud. Пример: ivanov@example.com |
email |
Фамилия | Используется для поиска в сервисах Yandex Cloud. | lastName |
Имя | Используется для поиска в сервисах Yandex Cloud. | firstName |
Полное имя | Отображается в сервисах Yandex Cloud. | name |
Телефон | Используется для отправки уведомлений из сервисов Yandex Cloud. Пример: +71234567890 |
phone |
Аватар | Отображается в сервисах Yandex Cloud. Изображение должно быть представлено в символьном формате Base64. | thumbnailPhoto |
Пример сопоставления атрибутов:
Проверка аутентификации
Когда вы закончили настройку SSO, протестируйте, что все работает:
-
Откройте браузер в гостевом режиме или режиме инкогнито.
-
Перейдите по ссылке для входа в консоль, полученной ранее. Браузер должен перенаправить вас на страницу аутентификации в Keycloak.
-
Введите данные для аутентификации и нажмите кнопку Sign in.
После успешной аутентификации IdP-сервер перенаправит вас обратно по ссылке для входа в консоль, а после — на главную страницу консоли управления. В правом верхнем углу вы сможете увидеть, что вошли в консоль от имени федеративного пользователя.