![](https://habrastorage.org/webt/0g/c3/so/0gc3sov8r4ceognunzjp1fmjguw.png)
Привет! Я Максим Филимонов, ведущий инженер команды администрирования сервисов в Selectel. Для доступа в аккаунты с инфраструктурой, которую мы сопровождаем, приходится хранить множество паролей, контролировать их соответствие парольным политикам, проводить ротацию учетных записей в панелях для каждого аккаунта отдельно. В какой-то момент менеджмент учетных записей стал проблемой. Для примера: чтобы три сотрудника могли администрировать 100 клиентских панелей, нужно создать 300 учеток.
В этой статье расскажу, как мы решили проблему благодаря федеративному доступу, поделюсь опытом его использования и дам инструкцию по настройке. Статья будет полезна всем, кому нужны «врата» к управлению сервисами и ресурсами Selectel через одну учетную запись — для себя или сотрудников компании.
Используйте навигацию, если не хотите читать текст полностью:
→ Что такое федеративный доступ
→ Деплой облачного сервера с Keycloak из образа
→ Проверка работы Keycloak
→ Создание и настройка федерации в панели Selectel
→ Настройка клиента keycloak
→ Создание первого пользователя и проверка работы
→ Заключение
С решением проблемы менеджмента учетных записей помогли коллеги из команды IAM. Они запустили федеративный доступ, благодаря которому с одной учетной записью можно попадать в неограниченное количество панелей.
Что такое федеративный доступ
Федерации удостоверений позволяют пользователям авторизоваться в панели управления Selectel с помощью технологии единого входа Single Sign-On (SSO). Другими словами, пользователь попадает в разные сервисы через одну и ту же учетную запись от поставщика удостоверений (IdP), например Keycloak или ADFS. Это упрощает вход в систему и повышает безопасность, так как не требует создания дополнительных паролей.
Кроме того, федеративный доступ синхронизирует информацию и настройки между различными сервисами. Скажем, если пользователь меняет пароль в одной учетной записи, эти изменения автоматически применяются ко всем остальным, которые с ней связаны.
На данный момент в федерациях Selectel используется открытый стандарт Security Assertion Markup Language (SAML). Он нужен для обмена аутентификационной и авторизационной информацией между IdP и сервис-провайдером (SP). Благодаря SAML пользовательская информация и авторизационные данные передаются между сервисами с использованием защищенных токенов, обеспечивая безопасность и удобство входа в систему. Для работы с федерациями IdP должен поддерживать SAML 2.0.
Далее на конкретном примере разберем, как работает федеративный доступ. В большинстве случаев все шаги можно воспроизвести в своей панели управления.
![](https://habrastorage.org/webt/nb/lo/t_/nblot_ve1t3hcw5bluwc_-did08.png)
Деплой облачного сервера с Keycloak из образа
Вот как выглядит функционал образа с Keycloak для быстрого развертывания сервера:
- Keycloak 22.0.1,
- реверс-прокси на nginx,
- выпуск и автопродление сертификатов Let’s Encrypt,
- бэкапирование БД,
- базовая настройка сервера (firewall, ssh-hardening).
Структурная схема выглядит так:
![](https://habrastorage.org/getpro/habr/post_images/42f/c2e/0e4/42fc2e0e4b9d032ce8c8389edb1b0e3a.png)
Рассмотрим, за что отвечают отдельные ее компоненты.
- Контейнер nginx-http отвечает за редирект всех запросов на порт https, а также предоставляет URL для выпуска и автопродления сертификатов. Подключен к сети nginx-net.
- Контейнер certbot отвечает за первичный выпуск сертификата и его автопродление. Подключен к сети nginx-net.
- Контейнер nginx-https принимает запросы по доменному имени на 443 порту и передает их в контейнер с keycloak. Подключен к сети nginx-net.
- Контейнер keycloak поднят в production-моде. Настроены Keystore и Truststore. Подключен к сети nginx-net и postgres-net.
- Контейнер postgres хранит в себе данные keycloak, например пользователей, realms и т. д. Подключен к сети postgres-net.
- Две cron-задачи отвечают за перевыпуск сертификата и бэкапирование базы данных.
Для создания сервера необходимо перейти в панель управления, выбрать Облачную платформу, проект и нажать кнопку Создать сервер. В пункте Источник кликаем на Выбрать другой источник, а затем в разделе Ubuntu выбираем образ Cloud Keycloak 22.0.1 64-bit.
![](https://habrastorage.org/getpro/habr/post_images/64f/58a/8d6/64f58a8d68b0dfef59035f365390e2b0.png)
Конфигурацию сервера можно выбрать на свое усмотрение. Рекомендую начать с двух vCPU и 4 ГБ RAM. В качестве диска можно использовать Универсальный SSD на 30 ГБ.
![](https://habrastorage.org/getpro/habr/post_images/a01/eee/e44/a01eeee440fcbab5af37e77dd110ffef.png)
В пункте Сеть выбираем Новый публичный IP-адрес. Обратите внимание: если планируете отправлять письма с этого сервера (например, приглашения новым пользователям), нужно выбрать публичную подсеть. Это связано с тем, что отправка почты с плавающего IP, закрепленного за виртуальной машиной, заблокирована.
Можете выбрать SSH-ключ или добавить новый для зашифрованного подключения. Подключение с помощью пароля по умолчанию отключено в целях безопасности сервера.
Далее в разделе Автоматизация, нужно заполнить поле User data следующим образом:
#cloud-config
write_files:
- path: "/opt/gomplate/values/user-values.yml"
permissions: "0644"
content: |
keycloakDomain: "<your_domain>"
keycloakAdminEmail: "<your_mail>"
keycloakAdminUser: "<username>"
keycloakAdminPassword: "example_admin_pwd_odVhfbpFcpomRH8UtkuK"
keycloakAdminIP: "<your_allowed_IP>"
keycloakPostgresDB: "keycloak"
keycloakPostgresUser: "keycloak"
keycloakPostgresPassword: "example_bd_pwd_bhznRrXKL5GPGUC0kYSQ"
- keycloakDomain — укажите домен, по которому Keycloak будет доступен из сети.
- keycloakAdminEmail — email администратора. Будет использоваться для восстановления админского доступа к Keycloak и выпуска SSL-сертификатов.
- keycloakAdminUser — имя пользователя для входа в админ-панель Keycloak.
- keycloakAdminPassword — пароль для входа в админ-панель Keycloak.
- keycloakAdminIP — IP-адрес, для которого будет доступна админ-панель Keycloak. Подразумевается, что здесь будет указан IP-адрес вашего VPN или текущий IP. Узнать его можно, например, на 2ip.ru. Если нужно разрешить доступ всем IP-адресам, можно указать 0.0.0.0/0.
- keycloakPostgresDB — имя БД для Keycloak. Можно оставить неизменным.
- keycloakPostgresUser — имя пользователя БД для Keycloak. Можно оставить неизменным.
- keycloakPostgresPassword — пароль БД для Keycloak.
После заполнения всех полей можно нажать на кнопку Создать внизу страницы. Спустя несколько минут (в зависимости от выбранной конфигурации) сервер запустится, инициализирует проект и будет готов к работе.
Проверка работы Keycloak
Первый логин
Открываем домен, который указали в User data при создании сервера. В моем случае это https://keycloak-test.sre-team.space/. Нажимаем на Administration Console и вводим логин/пароль, которые ранее передали в User data. Доступ в Administration Console будет только с IP-адресов, указанных в keycloakAdminIP.
Если на этом этапе столкнулись с какими-либо проблемами, напишите обращение в техподдержку. Наши инженеры помогут разобраться с созданием сервера.
Настройка realm
Realm в Keycloak — это область, которая включает в себя учетные записи пользователей, роли, группы и настройки авторизации. Каждый Keycloak в состоянии управлять несколькими такими областями. Важно, что один и тот же набор данных не может находиться сразу в нескольких realm. Благодаря этому можно изолировать пользователей и их информацию в зависимости от контекста.
В рамках этой статьи дальнейшая настройка будет проведена для realm-а master, но вы можете создать отдельный realm.
На данном этапе рекомендую включить логирование событий. Чтобы это сделать, перейдите в раздел Realm Settings → Events. Здесь во вкладках User event settings и Admin event settings включите тумблеры и укажите ротацию логов, например семь дней.
Получение сертификата
1. В панели управления Keycloak перейдите в раздел Realm settings.
![](https://habrastorage.org/getpro/habr/post_images/a69/4f5/c5f/a694f5c5f688560e0b9627c6095dd29f.png)
2. На вкладке Keys, в строке RS256 нажмите Certificate.
![](https://habrastorage.org/getpro/habr/post_images/c78/d36/b5f/c78d36b5fb0f1f37fd7e21f8d4e2ceb8.png)
3. Скопируйте сертификат, он понадобится на следующем шаге для настройки федерации в панели Selectel.
Создание и настройка федерации в панели Selectel
Переходим на страницу федераций и нажимаем на кнопку Добавить Федерацию. Увидим следующую форму:
![](https://habrastorage.org/getpro/habr/post_images/4db/18e/46a/4db18e46ac0dba7065bac049ca250821.png)
Заполняем следующие поля:
- Имя Федерации — можно указать любое;
- Описание — опциональное поле, краткое описание федерации;
- IdP Issuer — ссылка на Keycloak в формате https://<keycloak_domain>/realms/<realm_name> (в моем случае keycloak-test.sre-team.space/realms/master);
- Ссылка на страницу входа IdP — URL, на который браузер будет перенаправлять пользователя для аутентификации в формате https://<keycloak_domain>/realms/<realm_name>/protocol/saml (в моем случае — keycloak-test.sre-team.space/realms/master/protocol/saml);
- Время жизни сессии — время в часах, спустя которое сессия пользователя будет автоматически завершена;
- Подписывать запросы аутентификации — все запросы аутентификации будут содержать цифровую подпись;
- Принудительная аутентификация в Selectel — при включении этой опции IdP-провайдер будет запрашивать у пользователя аутентификацию после истечения сессии в Selectel.
После заполнения полей нажимаем кнопку Создать Федерацию. Откроется следующий шаг — добавление сертификата IdP:
![](https://habrastorage.org/getpro/habr/post_images/633/e4f/fd4/633e4ffd4ac8bba12b258b29f841913e.png)
Имя сертификата можно указать любое. Сам сертификат мы получили ранее (в разделе Получение сертификата), вставляем его сюда. Сертификат обязательно указать в следующем формате:
-----BEGIN CERTIFICATE-----
PASTE_CERTIFICATE_DATA_HERE
-----END CERTIFICATE-----
Форма не даст отправить сертификат в других форматах. Мало того, что шрифт в форме не моноширинный, так еще и два дефиса объединяются в одно тире. Из-за этого может возникнуть путаница. Рекомендую копировать и вставлять строки -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----.
После успешного добавления сертификата нажимаем кнопку Завершить добавление Федерации.
![](https://habrastorage.org/getpro/habr/post_images/4de/7ef/db0/4de7efdb0cbe66a9cb1d2a1cea999dbe.png)
Переходим в нашу федерацию, находим строку Подписывать запросы аутентификации и нажимаем кнопку Скачать сертификат. Он нам понадобится для настройки подписи. Теперь можем приступить к настройке клиента Keycloak.
Настройка клиента keycloak
Создание клиента
Переходим в раздел Clients и нажимаем кнопку Create client.
![](https://habrastorage.org/getpro/habr/post_images/88e/bb3/601/88ebb3601524e708170ffd1886e1e17a.png)
В появившемся окне заполняем поля:
- Client type — SAML;
- Client ID — ссылка, куда будут перенаправляться пользователи после аутентификации, в формате api.selectel.ru/v1/federations/saml<federation_id> (ID федерации можно получить на этой странице в ячейке с названием Федерации);
- Name (опционально) — имя клиента;
- Description (опционально) — описание клиента.
![](https://habrastorage.org/getpro/habr/post_images/729/09c/e47/72909ce4740aeb050cd4579c6b2f92d3.png)
Нажимаем кнопку Next и переходим на следующий шаг. Теперь необходимо заполнить следующие поля:
- Root URL и Home URL — указываем URL в формате api.selectel.ru/v1/federations/saml<federation_id>;
- Valid redirect URLs — указываем api.selectel.ru/v1/federations<federation_id>/saml/acs;
- остальные поля оставляем пустыми, нажимаем кнопку Save.
Наш клиент создан.
Проверка настроек
На этом шаге нужно внимательно проверить заполнение пяти полей.
- В блоке SAML capabilities можно выбрать формат идентификатора пользователя: username или email. Я выберу email.
- Параметры Force POST binding и Include AuthnStatement имеют значение On.
- В блоке Signature and Encryption параметр Sign assertions имеет значение On.
- В качестве Signature algorithm выбран RSA_SHA256, а SAML Signature Key Name выбран None.
- В блоке Logout settings включен параметр Front channel logout.
Настройка цифровой подписи
Переходим на вкладку Keys и включаем опцию Encrypt assertions:
![](https://habrastorage.org/getpro/habr/post_images/348/d1e/057/348d1e0570033c6f1ed78c919f35ca2c.png)
Должно открыться окно, в нем нажимаем кнопку Generate. После создания сертификата нажимаем Confirm.
![](https://habrastorage.org/getpro/habr/post_images/3de/704/993/3de704993ddcf896da950e86f4efda12.png)
Импорт сертификата
Теперь нужно импортировать сертификат Selectel, который мы получили в конце настройки федерации. В блоке Encryption keys config нажимаем кнопку Import key:
![](https://habrastorage.org/getpro/habr/post_images/34e/657/123/34e65712328f0f0f42d57176e737834a.png)
В разделе Archive format выбираем пункт Certificate PEM, нажимаем кнопку Browse и загружаем сертификат. Завершаем импорт нажатием на кнопку Import. На этом настройка завершена.
![](https://habrastorage.org/getpro/habr/post_images/a77/522/a48/a77522a482fd522fa5a4e472a3c2b476.png)
Создание первого пользователя и проверка работы
Рассмотрим пример создания пользователя. Его нужно создать как на стороне Keycloak, так и в панели Selectel. К сожалению, на данный момент еще не существует автоматизации создания пользователей, например через Terraform, поэтому будем делать все вручную.
Создание федеративного пользователя в панели Selectel
Переходим в раздел Управление пользователями и нажимаем кнопку Добавить пользователя. В появившемся окне заполняем все поля:
![](https://habrastorage.org/getpro/habr/post_images/50a/ff0/42c/50aff042c80fead22c9923a71ee7eaa3.png)
- Тип аутентификации — выбираем нашу федерацию.
- External ID — имя пользователя или почта (в зависимости от того, что выбрано в SAML capabilities в Keycloak), по которой пользователь будет входить в Keycloak. В моем случае это read-only.
- Роль — укажите роль пользователя. В моем случае это наблюдатель аккаунта.
Создание федеративного пользователя в Keycloak
Выбираем realm, в котором настраивали ранее SAML-клиент. Переходим в раздел Users.
![](https://habrastorage.org/getpro/habr/post_images/7cd/6b3/b2a/7cd6b3b2a852986c7c3fb0db9b8b90a0.png)
Здесь представлен список всех пользователей выбранного realm. Нажимаем кнопку Add user.
![](https://habrastorage.org/getpro/habr/post_images/54e/ea8/50d/54eea850d234be6d30d6e361b2184588.png)
В открывшемся окне заполняем поля.
- Required user actions — действия, которые должен выполнить пользователь при первом логине в Keycloak, например Update Password.
- Username, Email — имя пользователя и почта. Нужно указать в соответствии с тем, как заполняли при создании пользователя в панели Selectel (External ID).
После этого нажимаем Create. Теперь можно задать пользователю пароль на вкладке Credentials, нажав кнопку Set password.
![](https://habrastorage.org/getpro/habr/post_images/dfe/831/83c/dfe83183c5d90f7c5b1912aee71292c9.png)
Проверка работы
После настройки IdP, федерации и создания первого пользователя можно перейти к тестированию. Открываем страницу федеративного входа. Ссылка будет в письме, которое придет на почту после создания пользователя, а также в панели управления на странице федераций. Если вы уже залогинились под каким-либо аккаунтом, вы увидите такое сообщение:
![](https://habrastorage.org/getpro/habr/post_images/817/d9f/ac9/817d9fac9a905be2d6af749d8a78ea0b.png)
Нажимаем на кнопку Авторизоваться в новой Федерации. Нас перенаправит на страницу входа в Keycloak.
![](https://habrastorage.org/getpro/habr/post_images/4dd/ef1/eab/4ddef1eab1960c144854500123a9f542.png)
Вводим логин и пароль пользователя Keycloak и нажимаем Sign In. При первом входе вы увидите следующую форму:
![](https://habrastorage.org/getpro/habr/post_images/e4c/80b/641/e4c80b641cc3f168e3a5dfbe75325e22.png)
Здесь нужно указать ФИО и согласиться на обработку персональных данных. После нажатия кнопки Войти мы попадем в панель управления Selectel. В дальнейшем ID федерации сохранится в кэше браузера. На странице входа мы увидим кнопку Вход с помощью SSO. Если ее нажать, то можно выбрать нашу федерацию из выпадающего списка.
Общую информацию по ошибкам и путям их исправления можно найти в документации Selectel. Вы также можете составить обращение в нашу службу поддержки — мы обязательно вам поможем.
Заключение
До появления федеративного доступа в аккаунты с инфраструктурой, которую мы администрируем, нам приходилось хранить множество паролей, контролировать их соответствие разным политикам, проводить ротацию учетных записей для каждого аккаунта отдельно. Используя федерации, мы сильно упрощаем себе жизнь.