Иногда возникает необходимость организовать Single Sign-On на уже существующей базе LDAP.
Т.к. ELiS работает на Drupal, в целом вопрос ставится про создание SSO в организации и подключение Drupal7 к этому SSO.
Содержание
Установка Keycloak[править]
Установка Keycloak описана на официальном сайте и сводится к скачиванию и распаковке ZIP-архива, установки Java 21+ и запуску сервера Keycloak на localhost.
Если на сервере не установлен GUI, то чтобы подключиться можно использовать проброс портов SSH. (актуально для keycloak 10).
Предположим keycloak распаковали в /opt/keyclaok.
Для начала просто запустите через /opt/keycloak/bin/kc.sh start-dev и убедитесь, что все стартует. Если валятся ошибки, то исправьте.
Возможно вам потребуется задать переменную окружения JAVA_HOME.
Создание Realm[править]
Дальше необходимо подключиться к серверу, создать новый realm (вместо master). Редактировать Realm можно в левом меню в Realm Settings.
Добавление LDAP и импорт пользователей[править]
В Realm надо настроить импорт пользователей.
В правом меню выберите User Federation и добавьте провайдер LDAP.
Вам потребуется настроить импорт, и для Keycloak 10.0.2 были неожиданные моменты, на которые надо обратить внимание:
В Users DN оказалось, что надо писать без OU=users, т.е. ограничиться только доменом dc=example,dc=com.
В User Object Classes можно через запятую приводить несколько классов, я решил ограничиться user.
Для Active Directory указание Bind DN является обязательным, но указать надо не полный путь (cn=proxy,ou=users,dc=example,dc=com), а в формате user@examle.com, в данном случае proxy@example.com.
При корректных параметрах импорт пользователей произойдет успешно. При ошибках смотрите логи на сервере (обратитесь к документации, если возникают проблемы).
Создание клиента для авторизации с сайтов[править]
Чтобы сайты могли по OpenID Connect подключаться к Keycloak, надо на самом Keycloak создать клиента(ов). Информация по клиенту потом будет вписываться в подключаемые по SSO сайты.
В правом меню Keycloak выберите Clients и нажмите кнопку создать (create). Присвойте любой Client ID и выберите протокол openid-connect.
Выберите Access Type "confidential", а в Valid Redirect URIs впишите с использованием подстановки * сайты, с которых будет разрешена авторизация пользователей, т.е. сайт с ELiS и если необходимо, другие сайты (пример: https://elis.example.com/*).
При редактировании клиента обратите внимание на вкладку Credentials, там будет секретное слово (Secret), которое вам понадобится при настройке OAuth2 на подключаемых сайтов.
Настройка работы по HTTPS[править]
Чтобы переход на страницу авторизации был зашифрован, вам следует настроить использование Keycloak через HTTPS. Способы для этого могут быть разные, например поставить на сервер с Keycloak NGINX, получить для него сертификат через Let's Encrypt и настроить перенаправление трафика на localhost и порт 8080, на котором по умолчанию запускается Keycloak.
В nginx тогда:
location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
Вам надо будет создать скрипт запуска Keycloak. Для старых версий keycloak можно сделать так, если архив keycloak распакован в /opt:
daemonize -u USERNAME -c /opt/keycloak -p /var/run/keycloak/keycloak.pid -l /var/lock/subsys/keycloak -a -e /var/log/keycloak/console.log -o /var/log/keycloak/console.log /opt/keycloak/bin/standalone.sh
В более новых версиях (на момент написания это keycloak 25) запуск и настройка осуществляется иначе, для версии 25 см. ниже запуск через systemd
Запуск keycloak через systemd[править]
Чтобы не запускать keycloak в режиме start-dev, надо в начале создать конфигурацию через /opt/keycloak/bin/kc.sh build, а затем попробовать /opt/keycloak/bin/kc.sh start, но надо передать некоторые переменные окружения, через которые будет настройка как для kc.sh build, так и для kc.sh start.
Для этого сначала руками выполните kc.sh build и kc.sh start с нужными параметрами (переменными окружения), чтобы убедиться, что сервис стартует и посмотреть ошибки, если будут, а затем можно написать следующее:
# mkdir /usr/lib/systemd/system/keycloak.service.d # touch /usr/lib/systemd/system/keycloak.service.d/my.conf
В этот файл внесите переменные окружения, например такие:
Environment="JAVA_HOME=/etc/alternatives/jre_21" Environment="KEYCLOAK_ADMIN=admin" Environment="KEYCLOAK_ADMIN_PASSWORD=mypassword" Environment="KEYCLOAK_FRONTEND_URL=https://sso.example.com" Environment="KC_CACHE=local" Environment="KC_HOSTNAME_STRICT=false" Environment="KC_HTTP_ENABLED=true" Environment="KC_HTTP_PORT=8080" Environment="KC_HEALTH_ENABLED=true" Environment="KC_HOSTNAME=https://sso.example.com"
По этой конфигурации keycloak запустится на порту 8080, но будет считать, что его hostname sso.example.com. При этом через KC_HTTP_ENABLED=true мы разрешаем keycloak стартовать и слушать HTTP-порт, а не HTTPS, но на самом деле ставим перед keycloak nginx на домен sso.example.com и с помощью letsencrypt получаем и обновляем сертификат, чтобы вход в keycloak был закрыт шифрованием, но сертификаты автоматически обновлялись, а не руками таскать в keycloak.
Дальше создаем файл /usr/lib/systemd/system/keycloak.service со следующим содержимым:
[Unit] Description=KeyCloak SSO Service After=network.target [Service] Type=simple Restart=always RestartSec=60 User=keycloak ExecStart=/opt/keycloak/bin/kc.sh start [Install] WantedBy=multi-user.target
Дальше:
# systemd daemon-reload # systemd start keycloak
Если стартовало нормально, то:
# systemd enable keycloak
Настройка ELiS на использование SSO[править]
Keycloak может после настройки использоваться как с OpenID Connect, так и с SAML2. Работа проверена с OpenID Connect.
Установка модуля openid_connect в Drupal[править]
Установите модуль openid_connect, включите его и перейдите к настройке.
Вам потребуется указать в качестве идентификатора клиента тот, который вы создали в Keycloak и секретное слово из Keycloak->Clients->YOUCLIENT->Credentials.
Также вам потребуется заполнить URL конечных точек (endpoint), чтобы найти их перейдите в Keycloak к настройке Realms и кликните по OpenID Endpoint Configuration, в открывшемся файле вы увидите все необходимые URL для вашего Realm.
После настройки модуля вам надо добавить использование входа в один клик путем добавления соответствующего блока на сайт Drupal по admin/structure/block.