Поддержка единого входа в систему (SSO) с Keycloak
В этом разделе представлены шаги по интеграции технологии единого входа в систему (SSO) с использованием Keycloak для Apache ActiveMQ Artemis и настройки OAuth-авторизации в Grafana через OpenID Keycloak.
Настройка Keycloak авторизации в Apache ActiveMQ Artemis
Рассматриваем настройку уже после установки Keycloak и Artemis.
Создание клиентов в реалме Keycloak
-
Переходим на вкладку клиентов, создаем нового клиента
-
Для клиента Artemis нужны следующие настройки:
Вместо
<ip>
подставляем ip сервера amq, а вместо<port>
- порт веб-интерфейса ArtemisЭтот клиент будет использоваться для веб-авторизации юзера в Keycloak, для авторизации самого приложения требуется создать еще один клиент. Через веб-интерфейс Keycloak 21.0 версии создать нужный тип клиента не удалось (клиент с типом авторизации bearer only), его получилось только импортировать.
Json для импорта - artemis-broker-server.json
Чтобы импортировать клиента в наш реалм требуется перейти на вкладку
Clients
и нажать кнопкуImport client
В появившемся окне выбираем наш json-файл, все остальное оставляем как есть (можно сменить название)
После этого должен появится такой клиент
Нам осталось только создать роль суперадмина amq. Для этого переходим на вкладку
Roles
и нажимаем кнопкуCreate Role
В появившемся окне вводим название роли и нажимаем
Save
Настройка брокера AMQ
Для того чтобы включить авторизацию через Keycloak, нам потребуется скопировать библиотеки Keycloak на сервер amq -
keycloak-libs.tar.bz2
В нашем случае Artemis был установлен в /opt/
, поэтому полный путь до папки с либами выглядит как /opt/artemis/lib/
- туда и распаковываем архив.
После этого нам необходимо создать и отредактировать несколько файлов в директории нашего брокера.
В нашем случае полный путь выглядел как /opt/brokers/entaxy/etc/
.
В данной директории создаем файл keycloak.json
куда копируем параметры адаптера из клиента Keycloak (artemis-broker-server в нашем примере)
Найти его можно на странице клиента сверху справа
Выглядит он примерно так
{
"realm": "<realm_name>",
"bearer-only": true,
"auth-server-url": "http://192.168.2.172:8080/",
"principal-attribute": "preferred_username",
"ssl-required": "external",
"resource": "artemis-broker-server",
"use-resource-role-mappings": true,
"confidential-port": 0
}
Весь этот json копируем в /opt/brokers/entaxy/etc/keycloak.json
Нам потребуется создать еще один файл keycloak-js-client.json
, в него записать следующее:
{
"realm" : "<realm_name>>",
"clientId" : "artemis-broker",
"url" : "http://<IP_KEYCLOAK>:<PORT>"
}
Соответственно название реалма, название созданного ранее клиента (который без bearer only), ip и порт сервера Keycloak.
Теперь отредактируем файл login.config
следующим образом
activemq {
org.keycloak.adapters.jaas.BearerTokenLoginModule required
keycloak-config-file="${artemis.instance}/etc/keycloak.json"
role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal
;
};
В данном примере мы используем авторизацию jaas BearerToken
Также нам потребуется добавить новые аргументы в строку запуска брокера.
В нашем случае это можно сделать в файле artemis.profile
Необходимые дополнительные аргументы для hawtio: -Dhawtio.realm=activemq -Dhawtio.keycloakClientConfig=${ARTEMIS_INSTANCE_ETC_URI}keycloak-js-client.json -Dhawtio.keycloakEnabled=true -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal"
.
Строка целиком выглядит как:
JAVA_ARGS=" -XX:+PrintClassHistogram -XX:+UseG1GC -Xms512M -Xmx1G -Dhawtio.realm=activemq -Dhawtio.keycloakClientConfig=${ARTEMIS_INSTANCE_ETC_URI}keycloak-js-client.json -Dhawtio.keycloakEnabled=true -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal"
Для работы Keycloak необходимо скачать следующие библиотеки(с maven central):
httpcore-4.4.16.jar
keycloak-adapter-core-18.0.2.jar
jackson-annotations-2.15.2.jar
bcpkix-jdk15on-1.68.jar
keycloak-core-18.0.2.jar
keycloak-common-18.0.2.jar
httpclient-4.5.14.jar
bcprov-jdk15on-1.68.jar
jackson-core-2.15.2.jar
jackson-databind-2.15.2.jar
и положить их в /opt/artemis/lib
После этого требуется перезапустить брокер.
Готово.
Теперь при входе в консоль amq должно появиться окно авторизации Keycloak с названием нашего реалма.
После ввода учетных данных учетки, которая имеет роль amq в keycloak мы должны увидеть консоль:
Сверху справа, при нажатии на иконку юзера мы должны увидеть логин УЗ, под которой мы авторизовались.
Для разделения прав используется стандартная модель jaas.RolePrincipal activemq, поэтому все права можно настроить стандартным образом через broker.xml
, главное чтобы название роли в Keycloak совпадало с названием роли в файле.
Настройка Oauth авторизации в Grafana через OpenID Keycloak
Рассматриваем настройку уже после установки Keycloak и Grafana
Создание клиента в реалме Keycloak
-
Переходим на вкладку клиентов, создаем нового клиента
-
Для Grafana нам нужно выбрать следующие настройки
Вместо
<grafana_ip>
подставляем ip сервера Grafana, а вместо<grafana_port>
- порт веб-интерфейса Grafana
Настройка Сервера Grafana для подключения к Keycloak
В Grafana нам требуется только отредактировать файл конфигурации grafana.ini
.
По умолчанию он расположен в /etc/grafana/grafana.ini
Нас интересует раздел [auth.generic_oauth]
Для работы Keycloak требуется указать следующие параметры:
enabled = true
name = Keycloak-OAuth
allow_sign_up = true
client_id = grafana-client
client_secret = <client_secret>
scopes = openid profile email
email_attribute_path = @.email || @.sub
login_attribute_path = preferred_username
name_attribute_path = full_name
auth_url = http://<KeycloakIP>:<KeycloakPORT>/realms/<REALMNAME>/protocol/openid-connect/auth
token_url = http://<KeycloakIP>:<KeycloakPORT>/realms/<REALMNAME>/protocol/openid-connect/token
api_url = http://<KeycloakIP>:<KeycloakPORT>/realms/<REALMNAME>/protocol/openid-connect/userinfo
-
<client_secret>
можно найти в клиенте, переходим на вкладку "credentials" и копируем secret -
<KeycloakIP>
ip сервера Keycloak -
<KeycloakPORT>
порт веб-сервера Keycloak -
<REALMNAME>
Название реалма, в котором находится созданный клиент
После того как прописали настройки в файл, для их применения необходимо перезапустить сервер Grafana командой:
sudo systemctl restart grafana-server
После перезагрузки сервера, заходим в веб Grafana.
Должна появиться кнопка для авторизации через Keycloak
При нажатии на нее, нас должно переадресовать на Keycloak для ввода авторизационных данных, либо, если мы уже авторизованы, сразу в Grafana под нашим юзером.
Маппинг ролей Keycloak в Grafana
По умолчанию в Grafana существует 3 роли: Administrator, Editor, Viewer
Для того чтобы можно было автоматически назначать роли Grafana по ролям Keycloak, необходимо:
-
Создать роли в клиенте Keycloak. В списке выбираем нашего клиента, переходим на вкладку
Roles
, нажимаемCreate Role
-
Создаем роли "admin" и "editor"
-
Далее необходимо перейти на вкладку
Client Scopes
и нажать на<ClientID>-dedicated
-
На вкладке
Mappers
создать новый маппер, нажав на кнопкуAdd mapper
и выбрать вариантBy configuration
Далее выбираем
User Client Role
Повторяем конфигурацию со скриншота
-
Теперь нам снова нужно отредактировать файл на сервере Grafana.
По умолчанию он расположен в
/etc/grafana/grafana.ini
Нас интересует раздел
[auth.generic_oauth]
Добавляем в него строку
role_attribute_path = contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'
После этого нужно в Keycloak назначить роль пользователю, либо группе.
Например, у нас есть группа
admins
, можно назначить на эту группу роль клиента. Для этого нажать кнопкуAssign role
, выбрать фильтр по клиентам, и в списке найти необходимую роль клиента.
Готово.
Теперь пользователи группы admins
автоматически будут получать роль Administrator
в Grafana.
Настройка Keycloak авторизации в Entaxy
Для настройки Keycloak в качестве сервера авторизации Entaxy необходимо выполнить следующие действия:
-
Зайти в command shell entaxy и выполнить команды добавления компонентов keycloak
feature:repo-add mvn:org.keycloak/keycloak-osgi-features/18.0.2/xml/features feature:install -r keycloak-jaas
-
В файле ../entaxy/etc/system.properties добавить строки:
hawtio.keycloakEnabled=true hawtio.realm=keycloak hawtio.keycloakClientConfig=${karaf.base}/etc/keycloak-hawtio-client.json hawtio.rolePrincipalClasses=org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal
-
Создать на сервере Entaxy файл ../entaxy/etc/keycloak-hawtio-client.json со следующим содержанием:
{ "url": "http://<keycloak.domain_name>:8080", "clientId": "hawtio-client", "realm": "<realm_name>" }
Где:
<keycloak.domain_name> = имя сервера keycloak
<realm_name> = имя реалма -
Создать на сервере Entaxy файл ../entaxy/etc/keycloak-hawtio.json со следующим содержанием
{ "auth-server-url" : "http://<keycloak.domain_name>:8080", "realm": "<realm_name>", "bearer-only": true, "ssl-required": "external", "resource": "hawtio-server", "use-resource-role-mappings": true, "confidential-port": 0 }
-
На сервере Keycloak нужно создать клиент со следующими параметрами:
-
В General settings указать имя Client-id - hawtio-client
-
В Capability config включить Authentication flow
-
В login settings указать адрес консоли Hawtio на сервере Entaxy. Для параметров Valid post logout redirect URIs и Web origins указать «+»
-
Выключить Logout settings
-
-
Импортировать клиента hawtio-server из файла json.
Json для импорта - artemis-broker-server.json -
Создать в клиенте hawtio-server соответствующие роли — admin, manager, ssh, systembundles, viewer
-
Добавить пользователям необходимые роли