Как мы знаем, в Directum RX вход возможен не только по логину-паролю от самой системы, но также и с использованием других методов аутентификации: по протоколу LDAP, Kerberos, NTLM, OpenID, SamL и другие. И это все внутри самого RX, т.е. он связывается с доменом, получает токен доступа, авторизуется под конкретной учетной записью.
Но бывают случаи, когда у заказчика не один домен, а несколько. А система RX по умолчанию может в момент времени соединяться только с одним доменом. Можно, конечно, поиграться с самими доменами, сделав доверие между ними, и тогда все будет гуд, но порой для безопасной безопасности это не вариант.
Тут мы подходим к теме нашей статьи, а именно – к решению KEYCLOAK. Итак, что это за зверь, и зачем он нужен.
Keycloak – это решение с открытым исходным кодом по управлению идентификацией и доступом, предназначенное для современных приложений и сервисов. Keycloak предлагает такие функции как
Впервые о Keycloak я услышал, когда вышло решение HR Pro от Директум. Там описывалась возможность аутентификации в системе посредством оного решения. И как раз один из заказчиков просил реализовать двухдоменную аутентификацию в условиях, когда доверия между доменами нет. Отсюда и возникла идея использовать Keycloak для RX. Развернули тестовый стенд, настроили и показали бизнесу – их все устроило. И заказчик отправился разворачивать стенд на своих мощностях.
Расскажу вкратце, как устроено решение, и как оно взаимодействует с RX. Протокол, который был использован – LDAP.
Порты, необходимые для реализации:
О том, как установить и настроить Keycloak, есть очень много статей на просторах интернета. В них описаны решения как для host, так и для Docker контенйера. Keycloak также универсален в плане БД. Я настраивал на Postgres, но может быть использован как MariaDB, так и MSSQL.
Часть, которая прописывается в Config.yml сервера (плеча/плечей приложений) RX:
EXTERNAL_AUTHENTICATION_TYPE: 'OpenIdConnect'
AUTHENTICATION_WIN_ACCOUNT_CLAIM_TYPE: 'preferred_username'
OIDC_CLIENT_ID: 'c1'
OIDC_CLIENT_SECRET: '80DY8AuPgg8ypaw50MTR23MvoqTXVtf8'
OIDC_USE_BASIC_AUTH_FOR_CLIENT_SECRET: 'false'
OIDC_CALLBACK_PATH: '/b1'
OIDC_METADATA_ADDRESS: 'https://keycloak.starkovgrp.ru:7443/realms/master/.well-known/openid-configuration'
Схема взаимодействия
А теперь более подробно
Секции в YML:
Настройка клиента RX на стороне самого Keycloak подробно описана в справке решения HR Pro: https://club.directum.ru/webhelp/directumrx/4.9/web/index.html?lk_admin_keycloak_nastr.htm
Нам осталось только внести в Keycloak параметры LDAP(s), проверить вход в систему RX и все. Для добавления пути LDAP идем в User Federation, добавляем нового провайдера и настраиваем его. Таких записей может быть сколько угодно. Главное – чтобы домены видели сервер Keycloak.
В последствии при переходе по ссылке rx.domen.ru вы будете переброшены на страницу входа keycloak и после ввода логина пароля от своей УЗ в домене успешно авторизуетесь в системе.
Keycloak очень гибкая вещь с точки зрения аутентификации разных сервисов – не только RX, но и других. Также он позволяет организовать управление пользователями и обеспечить безопасность в широком смысле. Безопасность – это всегда сложно и больно, а Keycloak берёт эту историю на себя.
Как было когда-то: мы приходили в приложение с логином и паролем, получали постоянный токен и дальше нас по нему авторизовало. Если токен утекал, начинались серьёзные проблемы. А потом в Oauth2 предложили вариант с динамически меняющимися токенами. Это уменьшило площадь атак и сделало систему надёжнее и безопаснее. Теперь мы реже используем пароль, а значит реже подвергаем его риску утечки. А ключи, по которым пользователь авторизуется на сайте, автоматически обновляются каждые несколько минут.
Если включить OpenIdConnect, то не работает кнопка Выход и под другим пользователем не войти (без дополнительных извращений с браузером)!
Если включить OpenIdConnect, то не войти по паролю пользователям с аутентификацией по паролю!
В 4.9 это не работало без параметра LDAP_SERVER_ADDRESS - один раз надо было ещё обязательно задать этот параметр LDAP_SERVER_ADDRESS: 'ip', только после этого заработало, потом этот параметр можно исключить.
Евгений, спасибо за статью. Скажите, пожалуйста, а получилось ли у вас настроить взаимодействие Keycloak и Nomad? Мы не смогли в проекте, где пользователи подключаются из разных доменов настроить авторизацию для Solo. получилось только для одного домена.
Ах да - это не работает с Nomad вообще, так как Nomad не поддерживается OpenIdConnect в принципе (при чтении справки с первого раза это совсем не очевидно).
Авторизуйтесь, чтобы написать комментарий