Логирование
В рамках системы реализовано логирование, логирование осуществляется с помощью таких сторонних компонентов как:
- Filebeat - компонент для сбора логов из контейнеров приложения
- ElasticSearch - СУБД для хранения логов
- Kibana - Средство визуализации собранных логов и интерфейс к ElasticSearch
В рамках системы собираются аудит логи. Просмотр логов доступен с помощью Kibana. Аудит логи создаются на каждое действие пользователя.
Логи ADCP
Система ADCP поддерживает 2 типа событий:
- чтение (query)
- редактирование (mutation)
Далее представлен список всех логируемых событий:
| № пп | Наименование события | Тип события | Описание события |
|---|---|---|---|
| 1 | account.buildInvitationLink | query | Создание ссылки на приглашение нового пользователя в систему |
| 2 | account.create | mutation | Создание новой организации (аккаунта) |
| 3 | account.currentAccount | query | Запрос информации о текущем аккаунте |
| 4 | account.get | query | Запрос на получение информации об аккаунте |
| 5 | account.getAllowedByDatasetProviders | query | Запрос списка организаций, которые позволили запрашивать их наборы данных (список организаций в маркетплейсе) |
| 6 | account.getAllowedToDatasetProviders | query | Запрос списка организаций, которым позволено запрашивать наши наборы данных (список организаций в настройках интеграций) |
| 7 | account.getDataProviderByName | query | Получение информации об организации по имени |
| 8 | account.getDatasetProviders | query | Получение списка возможных партнеров для обмена данными |
| 9 | account.getGlobalOrgInfo | query | Получение основной информации о собственной организаций |
| 10 | account.getInteractionMatchingRules | query | Получение списка разрешений на взаимодействие всех организаций |
| 11 | account.getInteractionMatchingRulesByProvider | query | Получение списка предоставленных разрешений на взаимодействие (кто мне разрешил) |
| 12 | account.getInteractionMatchingRulesToProvider | query | Получения списка предоставляемых разрешений на взаимодействие (кому я разрешил) |
| 13 | account.list | query | Запрос на получение списка всех организаций инстанса |
| 14 | account.merge | mutation | Изменение информации об организации |
| 15 | account.selectAccount | mutation | Смена текущей организации |
| 16 | account.sendInvitationCodeToEmail | mutation | Отправка приглашения в систему по Email |
| 17 | account.setUserRoles | mutation | Изменение роли у пользователя в организации |
| 18 | account.updateGlobalOrgInfo | mutation | Изменение внешней информации об организации |
| 19 | dataLabVM.create | mutation | Запрос на создание Виртуальной машины |
| 20 | dataLabVM.list | query | Запрос на получение списка виртуальных машин |
| 21 | dataLabVM.merge | mutation | Запрос на изменение виртуальных машин |
| 22 | dataLabVM.runDataLabVM | mutation | Запрос на запуск виртуальной машины |
| 23 | dataLabVM.upload | mutation | Запрос на загрузку данных в виртуальную машину |
| 24 | dataset.get | query | Получение информации о датасете |
| 25 | dataset.list | query | Получение списка датасетов |
| 26 | datasetLogs.list | query | Получение списка истории запроса на данные |
| 27 | datasetMatchingGroup.changeStatus | mutation | Изменение статуса матчинг группы |
| 28 | datasetMatchingGroup.checkDatasetsForMatching | query | Проверка возможности матчинга датасетов |
| 29 | datasetMatchingGroup.create | mutation | Создание группы матчинга |
| 30 | datasetMatchingGroup.get | query | Получение информации о группе мачтчинга |
| 31 | datasetMatchingGroup.hide | mutation | Скрытие группы матчинга (soft-delete) |
| 32 | datasetMatchingGroup.list | query | Получение списка матчинг групп |
| 33 | datasetMatchingGroup.merge | mutation | Редактирование матчинг группы |
| 34 | datasetMatchingGroup.runMatching | mutation | Факт запуска Матчинга |
| 35 | datasetMatchingGroup.runUpload | mutation | Факт загрузки сматченного датасета на vm |
| 36 | datasetMatchingGroup.stopMatching | mutation | Факт остановки матчинга |
| 37 | datasetMatchingGroup.stopUpload | mutation | Факт остановки загрузки на VM |
| 38 | datasetMatchingGroup.unhide | mutation | Факт отмены скрытия матчинг группы |
| 39 | datasetRequest.changeStatus | mutation | Изменение статуса запроса на данные (согласование) |
| 40 | datasetRequest.create | mutation | Создание запроса на данные |
| 41 | datasetRequest.createAndMoveToReview | mutation | Создание запроса на данные с последующей передачей на ревью |
| 42 | datasetRequest.get | query | Запрос детальной информации о запросе на данные |
| 43 | datasetRequest.incomingList | query | Запрос списка запросов на данные на согласование организацией |
| 44 | datasetRequest.list | query | Запрос списка запросов на данные |
| 45 | datasetRequest.merge | mutation | Изменение запроса на данные |
| 46 | datasetRequest.upload | mutation | Загрузка сматченных данных на VM |
| 47 | glossaryTerm.get | query | Получение одного бизнес термина |
| 48 | glossaryTerm.list | query | Получение списка бизнес терминов |
| 49 | job.abort | mutation | Остановка исполнения модели CleanRoom |
| 50 | job.debug | mutation | Запуск модели CleanRoom в Debug режиме |
| 51 | job.list | query | Получение списка выполненных и не выполненных запуска моделей в CleanRoom |
| 52 | job.run | mutation | Запуск модели в Production режиме |
| 53 | jobSetting.changeStatus | mutation | Изменение статуса модели CleanRoom |
| 54 | jobSetting.create | mutation | Создание модели CleanRoom |
| 55 | jobSetting.get | query | Получение информации о модели CleanRoom |
| 56 | jobSetting.list | query | Получение списка моделей CleanRoom |
| 57 | jobSetting.merge | mutation | Изменение модели CleanRoom |
| 58 | jobSetting.setSchedule | mutation | Создание / изменение расписания модели CleanRoom |
| 59 | metadataSeed.seedExcelData | query | Загрузка Excel шаблона семантического слоя |
| 60 | metadataTerm.get | query | Получение одного бизнес-терминов |
| 61 | metadataTerm.list | query | Получение списка бизнес-терминов |
| 62 | metadataTerm.create | mutation | Создание бизнес-термина |
| 63 | metadataTerm.merge | mutation | Изменение бизнес-термина |
| 64 | metadataTable.get | query | Получение метаописания одной таблицы |
| 65 | metadataTable.list | query | Получение списка таблиц |
| 66 | metadataTable.merge | mutation | Изменение информации о таблице |
| 67 | metadataInstance.get | query | Получение описания одного инстанса |
| 68 | metadataInstance.list | query | Получение описания списка инстансов |
| 69 | metadataDatabase.get | query | Получение описания одной БД |
| 70 | metadataDatabase.list | query | Получение описания списка БД |
| 71 | metadataField.get | query | Получение одного поля |
| 72 | metadataField.list | query | Получение списка полей таблицы |
| 73 | metadataField.merge | mutation | Изменение идентификатора привязанного бизнес-термина |
| 74 | metadataDataset.get | query | Получение метаописания одного датасета |
| 75 | metadataDataset.list | query | Получение метаописания списка датасетов |
| 76 | metadataDataset.create | mutation | Создание датасета |
| 77 | metadataDataset.merge | mutation | Изменение метаописания датасета |
| 78 | metadataDataset.merge | mutation | Изменение метаописания датасета |
| 79 | notification.list | query | Получение списка нотификаций |
| 80 | project.addMember | mutation | Добавление пользователя в проект |
| 81 | project.create | mutation | Создание проекта |
| 82 | project.get | query | Получение информации о проекте |
| 83 | project.incomingList | query | Получение списка проектов приходящих на модерацию |
| 84 | project.list | query | Получение списка проектов |
| 85 | project.merge | mutation | Изменение проекта |
| 86 | project.removeProject | mutation | Скрытие проекта (soft-delete) |
| 87 | script.create | mutation | Создание скрипта |
| 88 | script.get | query | Получение скрипта |
| 89 | script.list | query | Получение списка скриптов |
| 90 | script.makeReview | mutation | Проведение ревью скрипта |
| 91 | script.merge | mutation | Редактирование скрипта |
| 92 | script.setExecutableFile | mutation | Указание файла для исполнения |
| 93 | user.login | mutation | Авторизация пользователя |
| 94 | user.sendPasswordResetCode | mutation | Отправка письма на сброс пароля |
| 95 | user.setLanguage | mutation | Изменение языка пользователя |
| 96 | user.setNewPassword | mutation | Установка нового пароля |
| 97 | vcs.getBranches | query | Получения списка доступных веток репозитория |
| 98 | vcs.getFiles | query | Получение списка доступных файлов репозитория |
| 99 | vcs.getRepositories | query | Получение списка репозиториев |
Каждое лог сообщение имеет следующие атрибуты:
| Наименование поля | Пример содержания | Описание |
|---|---|---|
| _id | M5zt-IIByrvfZYSDKZXt | Уникальный идентификатор лог записи |
| _index | cdp-audit-2022.09.01 | Индекс (Таблица) в которой хранится запись |
| _type | _doc | Тип документа в ElasticSearch |
| @timestamp | Sep 1, 2022 @ 15:01:06.576 | Дата добавления записи |
| accountId | 5bqcyjp2lqpd | Id инстанса участника обмена данными |
| container.image.name | registry.aggregion.com/dmp-backend:feature-DMPD-918-story-6c6079a9-1225 | Ссылка на образ системы |
| duration | 747 | Длительность исполнения задачи |
| fields.log_type | audit | Тип лога |
| hostname | aggregion-cdp-backend-cdp-dev1-678cdc4c98-vhscj | Имя хоста создавшего запись |
| ip | 94.180.208.40 | IP клиента инициатора события |
| kubernetes.container.name | backend-api | Имя контейнера |
| kubernetes.labels.app_kubernetes_io/component | backend-api | Имя компонента |
| kubernetes.labels.app_kubernetes_io/instance | cdp-dev1 | Имя среды |
| kubernetes.labels.app_kubernetes_io/name | aggregion-cdp-backend-cdp-dev1 | Имя пода |
| kubernetes.namespace | cdpstage-dmpd-918-dev | Имя неймспейса в котором работает контейнер |
| kubernetes.pod.ip | 10.42.7.43 | Внутренний IP сервиса создавшего лог |
| kubernetes.pod.name | aggregion-cdp-backend-cdp-dev1-678cdc4c98-vhscj | Наименование пода создавшего лог |
| level | 100 | Уровень лога |
| login | atl@aggregion.com | Имя пользователя инициировавшего действие |
| msg | vcs.getBranches | Имя события |
| name | dmp | Наименование платформы |
| operationType | query | Тип операции |
| pid | 18 | ID процесса |
| requestId | 589850080baa6c45cde33f52d141c96c | ID запроса |
| success | ИСТИНА | Успешность операции |
| time | 1,662,033,666,576 | Unixtimestamp события |
| userId | debu3k2x4umj | ID пользователя инициатора события |
Так-же каждое лог сообщение имеет дополнительный набор полей, характерный для каждого события, более детальный разбор представлен в разделах далее.
Логирование событий аутентификации пользователей
Логирование событий аутентификации пользователей заносится в лог audit и находится в контейнере keycloak. События аутентификации, связанные с регистрацией нового пользователя, блокировкой/удалением пользователя, неуспешном входе логируются на уровне провайдера аутентификации.
Типы логируемых событий:
- Успешный вход пользователя (login) - вход пользователя с использованием Identity Provider.
- Выход пользователя (logout) - не логируются события истечения токена. Т.к. это не является выходом.
- Обновление токена (Refresh token) - обновление токена по имеющемуся refresh token.
- Неуспешный вход пользователя (login error) - возникает при ошибке аутентификации стороннего провайдера. Как правило, логин пользователя не записывается, т.к. информация не приходит от Identity Provider.
Сообщение содержит информацию о входе пользователя через стороннего провайдера аутентификации:
| Наименование поля | Пример содержания | Описание |
|---|---|---|
| _id | rj-0xIUBosQ-Sp5Lc2M_ | Уникальный идентификатор лог записи |
| _index | cdp-audit-2023.01.18 | Индекс (Таблица) в которой хранится запись |
| _type | _doc | Тип документа в ElasticSearch |
| @timestamp | Jan 18, 2023 @ 14:47:17.335 | Дата добавления записи |
| container.image.name | registry.aggregion.com/keycloak:dcp-master-e32f1b74-10 | Ссылка на образ системы |
| fields.log_type | audit | Тип лога |
| hostname | keycloak19-dev1-0 | Имя хоста создавшего запись |
| ip | 94.180.208.40 | IP клиента инициатора события |
| kubernetes.container.name | keycloak | Имя контейнера |
| kubernetes.labels.app_kubernetes_io/component | keycloak | Имя компонента |
| kubernetes.labels.app_kubernetes_io/instance | keycloak19-dev1 | Имя среды |
| kubernetes.labels.app_kubernetes_io/name | keycloak | Имя пода |
| kubernetes.labels.controller-revision-hash | keycloak19-dev1-57799c87f6 | Hash ревизии |
| kubernetes.labels.helm_sh/chart | keycloak-10.1.0 | Образ чарта |
| kubernetes.namespace | cdpstage-dmpd-918-dev | Имя неймспейса в котором работает контейнер |
| kubernetes.pod.ip | 192.168.214.159 | Внутренний IP сервиса создавшего лог |
| kubernetes.pod.name | keycloak19-dev1-0 | Наименование пода создавшего лог |
| level | 20 | Уровень лога |
| level_text | DEBUG | Название уровня логирования в текстовом виде от Keycloak. Отдельно собирается keycloak.events, который доступен только из уровня DEBUG. Общий уровень логирования Keycloak=INFO. |
| module | org.keycloak.events | Модуль лога Keycloak. В audit используется только keycloak.events. |
| msg | type=LOGIN, realmId=e8de6d9f-0492-40fb-aa75-42ba3065baa4, clientId=dcp, userId=fe9a6a10-d3f6-482f-8af7-ca165b1f4a16, ipAddress=176.52.98.94, identity_provider=aggregion-oidc, response_type=code, redirect_uri=https://dev1.dcp.bm.dev.aggregion.com/oauth/callback, consent=no_consent_required, identity_provider_identity=dev1@aggregion.com, code_id=e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd, username=dev1@aggregion.com, response_mode=query, authSessionParentId=e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd, authSessionTabId=1iLsHoNbB8M | Имя события |
| timestamp | Jan 18, 2023 @ 14:47:17.334 | Unixtimestamp события |
Содержание msg от Keycloak:
| Наименование поля | Пример содержания | Описание |
|---|---|---|
| type | LOGIN | Тип события Keycloak: Login - Пользователь вошел в систему. Logout - Пользователь вышел (не учитывается событие истечения токена). Code to Token - Обмен кода на токен в Identity Provider. Refresh Token - Приложение или клиент обновило токен. |
| realmId | e8de6d9f-0492-40fb-aa75-42ba3065baa4 | Id realm в который произведен вход |
| clientId | dcp | Клиент, через который осуществляется вход. Для dcp, atlas, kibana и grafana отдельные клиенты. |
| userId | fe9a6a10-d3f6-482f-8af7-ca165b1f4a16 | Идентификатор пользователя в Keycloak. |
| ipAddress | 176.52.98.94 | Ip-адрес с которого произведен вход. |
| identity_provider | aggregion-oidc | Identity Provider, использованный для входа в систему. |
| response_type | code | Тип ответа при успешном логине |
| redirect_uri | https://dev1.dcp.bm.dev.aggregion.com/oauth/callback | URI на который перешел пользователь после успешной аутентификации в стороннем провайдере. |
| consent | no_consent_required | Используется ли consent auth flow. То есть информация о необходимости согласия пользователя об использовании данных, передаваемых от провайдера аутентификации. |
| identity_provider_identity | dev1@aggregion.com | Идентификатор пользователя в identity provider использованном при входе |
| code_id | e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd | Id полученного от провайдера аутентификации кода |
| username | dev1@aggregion.com | Имя авторизовавшегося пользователя |
| response_mode | query | Тип ответа |
| authSessionParentId | e9d1772e-47b7-4658-a9a8-4e32a9dbb6cd | Id родительской сессии |
| authSessionTabId | 1iLsHoNbB8M | Id сессии |
Логирование событий обращения к данным
Обращение к данным в полной мере логируется в blockchain. Доступ к информации по обращению к данным есть через:
- Интерфейс системы - описание в руководстве пользователя.
- Просмотр сообщений об истории обращения к данным - описание в руководстве администратора, раздел Смарт-контракты
- Просмотр информации от Data-service о факте записи лога обращения к данным в blockchain - пример приводится ниже.
Пример лога:
| Поле | Содержимое | Комментарий |
|---|---|---|
| _id | NKSHEYYBosQ-Sp5Lg6AE | |
| _index | cdp-log-2023.02.02 | |
| _score | 1 | |
| _type | _doc | |
| @timestamp | Feb 2, 2023 @ 12:48:51.832 | |
| container.image.name | registry.aggregion.com/dataservice:dcp-master-2297e450-128 | |
| datasetLogs._ id | 63db86f8b27dc70011040156 | |
| datasetLogs.availableTo | Jun 2, 2023 @ 12:48:40.380 | |
| datasetLogs.businessGoal | Проект для оценки покупательской способности клиентов | Наименование бизнес-цели обращения к данным |
| datasetLogs.dataset | 43qbpyznywtr | Id датасета к которому произошло обращение |
| datasetLogs.downloadedAt | Feb 2, 2023 @ 12:48:40.380 | Время загрузки датасета для обработки |
| datasetLogs.operation | cleanroom | Вид обращения matching - матчинг, upload - выгрузка на VM, cleanroom - запуск модели с использованием данных |
| datasetLogs.project | 63aace849cf72100195017d3 | |
| datasetLogs.providedBy | 23hatqocqlnd | Id владельца данных |
| datasetLogs.providedTo | 23hatqocqlnd | Id получателя данных |
| hostname | aggregion-cdp-dataservice-cdp-test1-6b9b4f84df-fsj4g | |
| kubernetes.container.name | dataservice-api | |
| kubernetes.labels.app_kubernetes_io/component | dataservice | |
| kubernetes.labels.app_kubernetes_io/instance | cdp-test1 | |
| kubernetes.labels.app_kubernetes_io/name | aggregion-cdp-dataservice-cdp-test1 | |
| kubernetes.namespace | cdpstage-dmpd-918-test | |
| kubernetes.pod.ip | 192.168.129.224 | |
| kubernetes.pod.name | aggregion-cdp-dataservice-cdp-test1-6b9b4f84df-fsj4g | |
| level | 10 | |
| module | TokenService | |
| msg | DatasetLogs were sent to 23hatqocqlnd, 23hatqocqlnd successfully | Сообщение в логе |
| name | dataservice-api | |
| pid | 17 | |
| time | 1,675,331,331,832 |