Механізм імпорту користувачів в KeyCloak

Для імпорту великої кількості користувачів-чиновників в реєстр, платформою передбачено функціонал що дозволяє імпортувати користувачів на пряму в KeyCloak з CSV файла.

Процес імпорту користувачів

  1. Адміністратор Доступу з допомогою веб-інтерфейсу порталу адміністратора завантажує CSV файл що містить перелік користувачів для імпорту в реєстр.

  2. Адміністративний портал проводить первинну валідацію файла що завантажується: розмір, формат, кодування. В разі валідаційної помилки користувач бачить повідомлення з деталями помилки на сторінці завантаження файлу. Процес імпорту користувачів зупиняється.

  3. В разі успішно проходження первинної валідації,

  4. Зашифрований файл зберігається в об’єктне сховище реєстру (Ceph)

  5. Адміністративний портал запускає процес імпорту користувачів в KeyCloak ("Import Users" Kubernetes job).

  6. Процес з допомогою сервісного екаунта Kubernaetes отримує облікові дані для доступу до об’єктного сховища Ceph та вичитує звідти зашифрований CSV файл. При цьому в Ceph файл переміщається до архіву.

  7. Процес дешифрує файл з допомогою Vault та отримує дані користувачів для імпорту.

  8. Процес починає обробку даних в файлі та створює користувачів в KeyCloak використовуючи адміністративне REST API (partial Import API). Створення користувачів відбувається групами по m записів. Значення m задається в налаштуваннях процесу. Користувачу встановлються всі атрибути з файла та присвоюються відповідні ролі. Значення поля username генерується автоматично та містить SHA-256 хеш суму стрічки утвореної внаслдок конкатинації 3-х ключових атрибутів користувача: fullName, edrpou, drfo. При цьому порядок атрибутів має значення

    1. Технічний лог процесу звписується в сховище технічних логів Kibana.

    2. Аудит лог процесу (яких саме користувачі створено та ким) записується у відповідний Kafka topic звідки він потрапляє у БД аудиту.

  9. Адміністратор доступу має змогу переглянути результат виконання процесу імпорту та можливі помилки в технічних логах з допомогою веб-інтерфейсу сервіса Kibana. В разі наявності помилок, їх причину необхідно усунути та повторити  процес імпорту.

  10. Після завершення процесу імпорту, у випадку якщо було створено хоча би одиного користувача, CSV файл з якого проводився імпорт переміщається в архів де зберігається з метою аудиту та більше не обробляється.

  11. Також в разі необхідності Адміністратор безпеки має можливість переглянути аудит лог процесу де зафіксовано інформацію про користувачів що були створені (ідентифікатор користувача, час створення, ідентифікатор вхідного CSV файлу та його хешсума) та завантажити CSV файл з якого було імпортовано користувача.

Аудит

Уся інформація стосовно створених в процесі імпорту користувачів повинна потрапляти в аудит платформи де Адміністратор безпеки матиме можливість її переглядати.

Для того щоб додати інформацію про подію в аудит необхідно сформувати повідомлення згідно схеми та записати його в audit-events топік Kafka.

Структура повідомлення:

Назва параметру Значення параметру

requestId

Ідентифікатор запиту з MDC

name

"USER_CREATE"

applicationName

"Keycloak"

sourceSystem

-

sourceApplication

Назва джоби по імпорту користувачів (pod_name)

sourceBusinessProcess

-

sourceBusinessProcessDefinitionId

-

sourceBusinessProcessInstanceId

-

sourceBusinessActivity

-

type

"SYSTEM_EVENT"

timestamp

Мітка часу

userName

ПІБ користувача який запустив процес імпорту

userKeycloakId

Keycloak ідентифікатор користувача який запустив процес імпорту

userDrfo

ДРФО код користувача який запустив процес імпорту

context

JSON що містить дельтану інформацію про новоствореного користувача

Значення в лапках є однаковими для всіх подій даного типу та встановлються як значення відповідних атрибутів без змін. "-" відповідає порожньому значенню

Структура поля context:

Назва параметру Значення параметру

userId Keycloak

ідентифікатор створеного користувача

username

username створеного користувача

enabled

true/false

realmId

Keycloak ідентифікатор реалму в якому був створений користувач

realmName

Ім’я реалму в якому був створений користувач

clientId

Значення "Client ID" атрибуту реалма від імені якого був створений користувач

keycloakClientId

Keycloak ідентифікатор клієнта від імені якого був створений користувач

roles

Ролі створеного користувача

sourceFileId

Ідентифікатор CSV файлу у Ceph бакеті

sourceFileName

Оригінальне ім’я CSV файлу, з якого проводився імпорт користувачів

sourceFileSHA256Checksum

Чек сума завантаженого користувачем CSV файлу (незашиврованого)

Приклад значення поля context

{
   "userId":"946693c7-181f-41c3-88e8-fcca20962b6a",
   "username":"anna.perez",
   "enabled":true,
   "realmId":"de972f63-9a2a-47b4-bb18-aa84dd7423fa",
   "realmName":"dev-officer-portal",
   "clientId":"import-users-job",
   "keycloakClientId":"8f123b53-6745-4162-a19e-85659bbc76c6",
   "roles":[
      "officer",
      "head-officer"
   ],
   "sourceFileId":"9a07c7cd-a1cd-4fdf-8d93-fab6a0988369",
   "sourceFileName":"users.csv",
   "sourceFileSHA256Checksum":"a3d08b7833480e561f99cd1180e76fea13baedd59d726eacf2af30643678e968"
}
Загальну інформацію про структуру аудиту можна переглянути в розділі "Платформа/Технічна документація/Підсистеми/Фабрика даних/Аудит подій"