Поддержка единого входа в систему (SSO) с Keycloak

В этом разделе представлены шаги по интеграции технологии единого входа в систему (SSO) с использованием Keycloak для Apache ActiveMQ Artemis и настройки OAuth-авторизации в Grafana через OpenID Keycloak.

Настройка Keycloak авторизации в Apache ActiveMQ Artemis

Рассматриваем настройку уже после установки Keycloak и Artemis.

Создание клиентов в реалме Keycloak

  1. Переходим на вкладку клиентов, создаем нового клиента

    create client
  2. Для клиента Artemis нужны следующие настройки:

    create client 2
    create client 3
    create client 4

    Вместо <ip> подставляем ip сервера amq, а вместо <port> - порт веб-интерфейса Artemis

    Этот клиент будет использоваться для веб-авторизации юзера в Keycloak, для авторизации самого приложения требуется создать еще один клиент. Через веб-интерфейс Keycloak 21.0 версии создать нужный тип клиента не удалось (клиент с типом авторизации bearer only), его получилось только импортировать.

    Json для импорта - artemis-broker-server.json

    Чтобы импортировать клиента в наш реалм требуется перейти на вкладку Clients и нажать кнопку Import client

    import client

    В появившемся окне выбираем наш json-файл, все остальное оставляем как есть (можно сменить название)

    import client 1

    После этого должен появится такой клиент

    artemis client

    Нам осталось только создать роль суперадмина amq. Для этого переходим на вкладку Roles и нажимаем кнопку Create Role

    create amq role

    В появившемся окне вводим название роли и нажимаем Save

    create role 1

Настройка брокера AMQ

Для того чтобы включить авторизацию через Keycloak, нам потребуется скопировать библиотеки Keycloak на сервер amq - keycloak-libs.tar.bz2

В нашем случае Artemis был установлен в /opt/, поэтому полный путь до папки с либами выглядит как /opt/artemis/lib/ - туда и распаковываем архив.

После этого нам необходимо создать и отредактировать несколько файлов в директории нашего брокера.
В нашем случае полный путь выглядел как /opt/brokers/entaxy/etc/.

В данной директории создаем файл keycloak.json куда копируем параметры адаптера из клиента Keycloak (artemis-broker-server в нашем примере)

Найти его можно на странице клиента сверху справа

download adapter config

Выглядит он примерно так

{
  "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 с названием нашего реалма.

login example

После ввода учетных данных учетки, которая имеет роль amq в keycloak мы должны увидеть консоль:

login example 1

Сверху справа, при нажатии на иконку юзера мы должны увидеть логин УЗ, под которой мы авторизовались.

login example 2

Для разделения прав используется стандартная модель jaas.RolePrincipal activemq, поэтому все права можно настроить стандартным образом через broker.xml, главное чтобы название роли в Keycloak совпадало с названием роли в файле.

Настройка Oauth авторизации в Grafana через OpenID Keycloak

Рассматриваем настройку уже после установки Keycloak и Grafana

Создание клиента в реалме Keycloak

  1. Переходим на вкладку клиентов, создаем нового клиента

    create client
  2. Для Grafana нам нужно выбрать следующие настройки

    new client 1
    new client 2
    new client 3

    Вместо <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

    credentials
  • <KeycloakIP> ip сервера Keycloak

  • <KeycloakPORT> порт веб-сервера Keycloak

  • <REALMNAME> Название реалма, в котором находится созданный клиент

После того как прописали настройки в файл, для их применения необходимо перезапустить сервер Grafana командой:

sudo systemctl restart grafana-server

После перезагрузки сервера, заходим в веб Grafana.
Должна появиться кнопка для авторизации через Keycloak

auth window

При нажатии на нее, нас должно переадресовать на Keycloak для ввода авторизационных данных, либо, если мы уже авторизованы, сразу в Grafana под нашим юзером.

Маппинг ролей Keycloak в Grafana

По умолчанию в Grafana существует 3 роли: Administrator, Editor, Viewer

Для того чтобы можно было автоматически назначать роли Grafana по ролям Keycloak, необходимо:

  1. Создать роли в клиенте Keycloak. В списке выбираем нашего клиента, переходим на вкладку Roles, нажимаем Create Role

    ley roles
  2. Создаем роли "admin" и "editor"

    client roles
  3. Далее необходимо перейти на вкладку Client Scopes и нажать на <ClientID>-dedicated

    scopes
  4. На вкладке Mappers создать новый маппер, нажав на кнопку Add mapper и выбрать вариант By configuration

    mapping 1

    Далее выбираем User Client Role

    mapping 2

    Повторяем конфигурацию со скриншота

    mapping 3
  5. Теперь нам снова нужно отредактировать файл на сервере Grafana.

    По умолчанию он расположен в /etc/grafana/grafana.ini

    Нас интересует раздел [auth.generic_oauth]

    Добавляем в него строку

    role_attribute_path = contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'

    После этого нужно в Keycloak назначить роль пользователю, либо группе.

    Например, у нас есть группа admins, можно назначить на эту группу роль клиента. Для этого нажать кнопку Assign role, выбрать фильтр по клиентам, и в списке найти необходимую роль клиента.

    group role mapping
group role mapping 2
group role mapping 3

Готово.
Теперь пользователи группы admins автоматически будут получать роль Administrator в Grafana.

Example

Настройка Keycloak авторизации в Entaxy

Для настройки Keycloak в качестве сервера авторизации Entaxy необходимо выполнить следующие действия:

  1. Зайти в command shell entaxy и выполнить команды добавления компонентов keycloak

    feature:repo-add mvn:org.keycloak/keycloak-osgi-features/18.0.2/xml/features
    feature:install -r keycloak-jaas
  2. В файле ../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
  3. Создать на сервере 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> = имя реалма

  4. Создать на сервере 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
    }
  5. На сервере Keycloak нужно создать клиент со следующими параметрами:

    • В General settings указать имя Client-id - hawtio-client

      vaults default
    • В Capability config включить Authentication flow

      client 2
    • В login settings указать адрес консоли Hawtio на сервере Entaxy. Для параметров Valid post logout redirect URIs и Web origins указать «+»

    • Выключить Logout settings

      logout settings
  6. Импортировать клиента hawtio-server из файла json.
    Json для импорта - artemis-broker-server.json

    import client entaxy
  7. Создать в клиенте hawtio-server соответствующие роли — admin, manager, ssh, systembundles, viewer

    hawtio server
  8. Добавить пользователям необходимые роли

    entaxy user