Как настроить федеративный доступ в панель управления Selectel

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.

Далее на конкретном примере разберем, как работает федеративный доступ. В большинстве случаев все шаги можно воспроизвести в своей панели управления.

nblot_ve1t3hcw5bluwc_-did08.png


Деплой облачного сервера с Keycloak из образа


Вот как выглядит функционал образа с Keycloak для быстрого развертывания сервера:

  • Keycloak 22.0.1,
  • реверс-прокси на nginx,
  • выпуск и автопродление сертификатов Let«s Encrypt,
  • бэкапирование БД,
  • базовая настройка сервера (firewall, ssh-hardening).


Структурная схема выглядит так:

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.

64f58a8d68b0dfef59035f365390e2b0.png


Конфигурацию сервера можно выбрать на свое усмотрение. Рекомендую начать с двух vCPU и 4 ГБ RAM. В качестве диска можно использовать Универсальный SSD на 30 ГБ.

a01eeee440fcbab5af37e77dd110ffef.png


В пункте Сеть выбираем Новый публичный IP-адрес. Обратите внимание: если планируете отправлять письма с этого сервера (например, приглашения новым пользователям), нужно выбрать публичную подсеть. Это связано с тем, что отправка почты с плавающего IP, закрепленного за виртуальной машиной, заблокирована.

Можете выбрать SSH-ключ или добавить новый для зашифрованного подключения. Подключение с помощью пароля по умолчанию отключено в целях безопасности сервера.

Далее в разделе Автоматизация, нужно заполнить поле User data следующим образом:

#cloud-config
write_files:
- path: "/opt/gomplate/values/user-values.yml"
  permissions: "0644"
  content: |
    keycloakDomain: ""
    keycloakAdminEmail: ""
    keycloakAdminUser: ""
    keycloakAdminPassword: "example_admin_pwd_odVhfbpFcpomRH8UtkuK"
    keycloakAdminIP: ""
    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 SettingsEvents. Здесь во вкладках User event settings и Admin event settings включите тумблеры и укажите ротацию логов, например семь дней.

Получение сертификата


1. В панели управления Keycloak перейдите в раздел Realm settings.

a694f5c5f688560e0b9627c6095dd29f.png


2. На вкладке Keys, в строке RS256 нажмите Certificate.

c78d36b5fb0f1f37fd7e21f8d4e2ceb8.png


3. Скопируйте сертификат, он понадобится на следующем шаге для настройки федерации в панели Selectel.

Создание и настройка федерации в панели Selectel


Переходим на страницу федераций и нажимаем на кнопку Добавить Федерацию. Увидим следующую форму:

4db18e46ac0dba7065bac049ca250821.png


Заполняем следующие поля:

  • Имя Федерации — можно указать любое;
  • Описание — опциональное поле, краткое описание федерации;
  • IdP Issuer — ссылка на Keycloak в формате https:///realms/ (в моем случае keycloak-test.sre-team.space/realms/master);
  • Ссылка на страницу входа IdP — URL, на который браузер будет перенаправлять пользователя для аутентификации в формате https:///realms//protocol/saml (в моем случае — keycloak-test.sre-team.space/realms/master/protocol/saml);
  • Время жизни сессии — время в часах, спустя которое сессия пользователя будет автоматически завершена;
  • Подписывать запросы аутентификации — все запросы аутентификации будут содержать цифровую подпись;
  • Принудительная аутентификация в Selectel — при включении этой опции IdP-провайдер будет запрашивать у пользователя аутентификацию после истечения сессии в Selectel.


После заполнения полей нажимаем кнопку Создать Федерацию. Откроется следующий шаг — добавление сертификата IdP:

633e4ffd4ac8bba12b258b29f841913e.png


Имя сертификата можно указать любое. Сам сертификат мы получили ранее (в разделе Получение сертификата), вставляем его сюда. Сертификат обязательно указать в следующем формате:

-----BEGIN CERTIFICATE-----

PASTE_CERTIFICATE_DATA_HERE

-----END CERTIFICATE-----


Форма не даст отправить сертификат в других форматах. Мало того, что шрифт в форме не моноширинный, так еще и два дефиса объединяются в одно тире. Из-за этого может возникнуть путаница. Рекомендую копировать и вставлять строки -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----.

После успешного добавления сертификата нажимаем кнопку Завершить добавление Федерации.

4de7efdb0cbe66a9cb1d2a1cea999dbe.png


Переходим в нашу федерацию, находим строку Подписывать запросы аутентификации и нажимаем кнопку Скачать сертификат. Он нам понадобится для настройки подписи. Теперь можем приступить к настройке клиента Keycloak.

Настройка клиента keycloak


Создание клиента


Переходим в раздел Clients и нажимаем кнопку Create client.

88ebb3601524e708170ffd1886e1e17a.png


В появившемся окне заполняем поля:

  • Client type — SAML;
  • Client ID — ссылка, куда будут перенаправляться пользователи после аутентификации, в формате api.selectel.ru/v1/federations/saml (ID федерации можно получить на этой странице в ячейке с названием Федерации);
  • Name (опционально) — имя клиента;
  • Description (опционально) — описание клиента.


72909ce4740aeb050cd4579c6b2f92d3.png


Нажимаем кнопку Next и переходим на следующий шаг. Теперь необходимо заполнить следующие поля:
Наш клиент создан.

Проверка настроек


На этом шаге нужно внимательно проверить заполнение пяти полей.

  • В блоке 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:

348d1e0570033c6f1ed78c919f35ca2c.png


Должно открыться окно, в нем нажимаем кнопку Generate. После создания сертификата нажимаем Confirm.

3de704993ddcf896da950e86f4efda12.png


Импорт сертификата


Теперь нужно импортировать сертификат Selectel, который мы получили в конце настройки федерации. В блоке Encryption keys config нажимаем кнопку Import key:

34e65712328f0f0f42d57176e737834a.png


В разделе Archive format выбираем пункт Certificate PEM, нажимаем кнопку Browse и загружаем сертификат. Завершаем импорт нажатием на кнопку Import. На этом настройка завершена.

a77522a482fd522fa5a4e472a3c2b476.png


Создание первого пользователя и проверка работы


Рассмотрим пример создания пользователя. Его нужно создать как на стороне Keycloak, так и в панели Selectel. К сожалению, на данный момент еще не существует автоматизации создания пользователей, например через Terraform, поэтому будем делать все вручную.

Создание федеративного пользователя в панели Selectel


Переходим в раздел Управление пользователями и нажимаем кнопку Добавить пользователя. В появившемся окне заполняем все поля:

50aff042c80fead22c9923a71ee7eaa3.png


  • Тип аутентификации — выбираем нашу федерацию.
  • External ID — имя пользователя или почта (в зависимости от того, что выбрано в SAML capabilities в Keycloak), по которой пользователь будет входить в Keycloak. В моем случае это read-only.
  • Роль — укажите роль пользователя. В моем случае это наблюдатель аккаунта.

Создание федеративного пользователя в Keycloak


Выбираем realm, в котором настраивали ранее SAML-клиент. Переходим в раздел Users.

7cd6b3b2a852986c7c3fb0db9b8b90a0.png


Здесь представлен список всех пользователей выбранного realm. Нажимаем кнопку Add user.

54eea850d234be6d30d6e361b2184588.png


В открывшемся окне заполняем поля.

  • Required user actions — действия, которые должен выполнить пользователь при первом логине в Keycloak, например Update Password.
  • Username, Email — имя пользователя и почта. Нужно указать в соответствии с тем, как заполняли при создании пользователя в панели Selectel (External ID).


После этого нажимаем Create. Теперь можно задать пользователю пароль на вкладке Credentials, нажав кнопку Set password.

dfe83183c5d90f7c5b1912aee71292c9.png


Проверка работы


После настройки IdP, федерации и создания первого пользователя можно перейти к тестированию. Открываем страницу федеративного входа. Ссылка будет в письме, которое придет на почту после создания пользователя, а также в панели управления на странице федераций. Если вы уже залогинились под каким-либо аккаунтом, вы увидите такое сообщение:

817d9fac9a905be2d6af749d8a78ea0b.png


Нажимаем на кнопку Авторизоваться в новой Федерации. Нас перенаправит на страницу входа в Keycloak.

4ddef1eab1960c144854500123a9f542.png


Вводим логин и пароль пользователя Keycloak и нажимаем Sign In. При первом входе вы увидите следующую форму:

e4c80b641cc3f168e3a5dfbe75325e22.png


Здесь нужно указать ФИО и согласиться на обработку персональных данных. После нажатия кнопки Войти мы попадем в панель управления Selectel. В дальнейшем ID федерации сохранится в кэше браузера. На странице входа мы увидим кнопку Вход с помощью SSO. Если ее нажать, то можно выбрать нашу федерацию из выпадающего списка.

Общую информацию по ошибкам и путям их исправления можно найти в документации Selectel. Вы также можете составить обращение в нашу службу поддержки — мы обязательно вам поможем.


Заключение


До появления федеративного доступа в аккаунты с инфраструктурой, которую мы администрируем, нам приходилось хранить множество паролей, контролировать их соответствие разным политикам, проводить ротацию учетных записей для каждого аккаунта отдельно. Используя федерации, мы сильно упрощаем себе жизнь.

© Habrahabr.ru