Настройка аутентификации через Keycloak

НАСТРОЙКА АУТЕНТИФИКАЦИИ ЧЕРЕЗ KEYCLOAK Инструкция подготовлена на примере Keycloak версии 20.0.2.

Терминология

  • Authentication — идентификация и проверка пользователя.

  • Authorization — предоставление доступа пользователю.

  • Realm — пространство для управления пользователями, приложениями, ролями и группами. Пользователь принадлежит к конкретному realm. Realm’ы изолированы друг от друга.

  • Clients — клиенты (приложения), которые могут обращаться к Keycloak для аутентификации пользователя. Чаще всего клиентами являются приложения и службы, которые используют Keycloak для обеспечения единого входа в систему.

  • Users — пользователи, которые могут войти в вашу систему. Им можно назначить членство в группе и/или определенные роли.

  • Roles — определяют тип/категорию пользователя. Читатель, писатель — типичные роли. Обычно, приложения назначают доступ и разрешения конкретным ролям, а не отдельным пользователям.

    Приложения Визиона требующие клиентов

  • Vision Core

  • Grafana

    Для каждого приложения необходимо создать клиента.

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

Выберите необходимый Realm, перейдите страницу Clients и нажмите на кнопку Create client, после чего укажите следующие параметры.

  • Client type: openid-connect

  • Client ID: <ИМЯ КЛИЕНТА>

    • Vision Core: vision-core-client

    • Grafana: vision-grafana-client

      После ввода параметров нажмите Next.

  • Client authentication: ON

  • Authorization: OFF

  • Standard Flow: ON

  • Direct Access Grants: ON

  • Implicit Flow: OFF

    После ввода параметров нажмите Save.

1.2 Параметры клиента#

После создания клиента откроется страница Client details.

Вкладка «1.2.1 Settings»

Необходимо указать адреса приложения.

  • Root URL: <root_url>
  • Home URL (Base URL в ранних версиях): <root_url>
  • Valid Redirect URIs:
    • Vision Core: <root_url>/vision/api/v1/auth/login
    • Grafana: <root_url>/login/generic_oauth
  • Web Origins: <root_url>
  • Admin URL: <root_url>

<root_url>:

  • для Vision Core: https://<ip_vision_vm>:8092

  • для Grafana: https://<ip_vision_vm>/vision/grafana

    При доступности приложений с нескольких <root_url> (по IP, по домену) укажите все допустимые варианты для Valid redirect URIs и Web Origins.

    Прочие параметры конфигурации можно оставить со значениями по умолчанию.

    После ввода параметров нажмите Save.

1.2.2 Вкладка «Client scopes» (Mappers в ранних версиях):

Для клиента Grafana требуется добавить поля с ролями клиента в токен идентификатора (id token) и в информацию о пользователе (user info).

  1. В таблице кликните по ссылке вида <YOU-CLIENT-ID>-dedicated
  2. На открывшейся странице нажмите Configure a new mapper
  3. В списке выберите категорию User Client Role
  4. На странице Add mapper укажите параметры:
    1. Name: roles

    2. Client ID: <YOU-CLIENT-ID>

    3. Client Role prefix: <оставить-пустым>

    4. Multivalued: ON

    5. Token Claim Name: roles

    6. Claim JSON Type: String

    7. Add to ID token: ON

    8. Add to access token: OFF

    9. Add to userinfo: ON

      После ввода параметров нажмите Save.

1.2.3 Вкладка Roles

Необходимо создать роли клиента, которые затем можно пользователям Keycloak для доступа к приложениям. Имена ролей чувствительны к регистру. Для создания роли нажмите Create role.

В клиенте для Vision Core создайте следующие роли:

Role name Description
writer Полный доступ
reader Только чтение

В клиенте для Grafana:

Role name Description (необязательно)
grafanaadmin Server administrator
admin Admin
editor Editor
viewer Viewer

1.2.4 Вкладка «Credentials»

По-умолчанию на данной вкладке должны быть указаны следующие параметры

  • Client Authenticator: Client Id and Secret

  • Client secret: *****

    При конфигурации приложений нам понадобятся следующие данные клиентов:

  • Client ID

  • Client secret

1.3 Назначение ролей пользователям#

  1. Откройте раздел Users
  2. Выберите необходимого пользователя или создайте нового.
  3. Перейдите во вкладку Role mapping и нажмите Assign role
  4. Нажмите на выпадающий список фильтра и выберите Filter by clients
  5. Отметьте необходимые роли и нажмите Assign

1.4 Конфигурация Визиона для работы с Keycloak#

В директории с дистрибутивом необходимо запустить плейбук server_config_auth.yml с inventory-файлом со следующим содержимым:

inventory.yml

all:
  hosts:
    # Визион Server
    vision_server:
      # IP Vision VM
      ansible_host: ">>> REPLACE ME! <<<"
 
      # default ssh user/pass (can be overridden below)
      ansible_user: root
      ansible_ssh_pass: ">>> REPLACE ME! <<<"
      # ansible_ssh_pass ИЛИ путь до файла приватного ключа:
      # ansible_ssh_private_key_file: ">>> REPLACE ME! <<<"
 
      # default user/pass for become
      ansible_become_user: root
      ansible_become_password: ">>> REPLACE ME! <<<"
 
      auth:
        # URL Keycloak, например https://192.168.186.1:8080
        auth_server: ">>> REPLACE ME! <<<"
        # Имя Realm
        realm: ">>> REPLACE ME! <<<"
 
        core:
          # Параметры Keycloak клиента Vision Core
          client_id: "vision-core-client"
          client_secret: ">>> REPLACE ME! <<<"
 
        grafana:
          # IP Vision VM
          domain: ">>> REPLACE ME! <<<"
 
          # Базовая аутентификация Grafana
          admin_user: "admin"
          admin_password: "skala-r"
 
          # Параметры Keycloak клиента Grafana
          client_id: "vision-grafana-client"
          client_secret: ">>> REPLACE ME! <<<"

Команда запуска плейбука ansible-playbook -i inventory.yml server_config_auth.yml

После успешного выполнения команды перейдите на посадочную страницу Визиона https://<ip_vision_vm> и проверьте, что при попытке открыть разделы Аналитические панели и Модуль администратора доступна аутентификация через Keycloak.

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

  • Vision Core: /opt/skala-r/vision/server/vision_core/etc/config.ini в секциях [AUTH] и [GRAFANA].
  • Grafana: /opt/skala-r/vision/server/grafana/etc/grafana.ini в секции [auth.generic_oauth].