Обмен событиями
В процессе работы Памир генерирует множество событий. Эти события могут быть использованы для интеграции с внешней системой, логирования и других задач.
События Памир попадают в exchange RabbitMQ типа topic, который называется pamir_exchange. Клиенты должны самостоятельно
создать подписку на необходимые события и обрабатывать их в своих очередях.
Тип сериализации тела событий - json.
Сервис аутентификации
Список событий Памир:
| Название | Ключ маршрутизации | Тело события |
|---|---|---|
| Создание пользователя | auth.user.Created | user_id: UUID login: str name: str surname: str patronymic: str ldap_id: UUID |
| Выполнен вход пользователя | auth.user.Login | user_id: UUID login: str name: str surname: str patronymic: str ldap_id: UUID |
| Выполнен выход пользователя | auth.user.Logout | user_id: UUID login: str name: str surname: str patronymic: str ldap_id: UUID |
| Неудачная попытка входа | auth.user.LoginFailed | user_id: UUID | None login: str name: str | None surname: str | None patronymic: str | None ldap_id: UUID | None login_failed_count: int | None status: str | None password_updated_at: datetime | None password_expired_at: datetime | None created_at: datetime | None unblockable: bool | None reason: str |
Сервис SRM
| Название | Ключ маршрутизации | Тело события |
|---|---|---|
| Ошибка при превышении количества объектов разрешенных лицензией | srm.ci.LicenseViolation | controlled_objects: int allow_cis: int current_controlled_objects: int current_cis: int |
| Ошибка при создании КЕ | srm.ci.CreatedError | reason: list[tuple[EXC_NAME, EXC_TITLE, EXC_DETAIL, EXC_MSG_VARS]] ci_type_name: str |
Сервис мониторинга
| Название | Ключ маршрутизации | Тело события |
|---|---|---|
| Ошибка при превышении количества объектов разрешенных лицензией | monitoring.target.LicenseViolation | controlled_objects: int current_controlled_objects: int |
Формирование лога аудита событий
Для формирования лога аудита событий используется утилита vector
Подключение утилиты vector
Для подключения утилиты vector в виде сервиса, необходимо в файл docker-compose.additional.yml добавить следующие строки:
vector:
image: timberio/vector:latest-alpine
networks: [pamir-net]
profiles: [all, additional]
restart: unless-stopped
env_file:
- .env
volumes:
- type: bind
source: ./data/vector
target: /etc/vector
command: ["--config", "/etc/vector/vector.toml"]
Настройка утилиты vector
Конфигурацию сервиса vector нужно записать в файл vector.toml. Путь к файлу vector.toml необходимо указать в файле docker-compose.additional.yml, в volumes. Для аудита событий аутентификации конфигурация vector должна быть следующей:
[sources.rabbitmq]
type = "amqp"
connection_string = "amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@${RABBITMQ_HOST}:5672/${RABBITMQ_VHOST}"
queue = "vector"
consumer = "vector"
[transforms.parse_json]
type = "remap"
inputs = ["rabbitmq"]
source = '''
parsed, err = parse_json(.message)
. = {
"event": .routing,
"timestamp": parsed.timestamp,
"user_id": parsed.user_id,
"login": parsed.login,
"name": parsed.name,
"patronymic": parsed.patronymic,
"surname": parsed.surname,
"reasone": parsed.reasone
}
'''
[sinks.file]
type = "file"
inputs = ["parse_json"]
path = "/etc/vector/log/audit-%Y-%m-%d.log"
encoding.codec = "json"
[sinks.console]
type = "console"
inputs = ["parse_json"]
encoding.codec = "json"
Значения переменным RABBITMQ_USER, RABBITMQ_PASSWORD, RABBITMQ_HOST и RABBITMQ_VHOST присваиваются в файле .env
Настройка RabbitMQ
В RabbitMQ необходимо создать очередь vector. В веб интерфейсе RabbitMQ сделать это можно следующим образом: на вкладке Queues выберите Add a new queue и задайте следующие параметры:
- Type: Classic;
- Name: vector;
- Durability: Durable;
- Auto delete: No.
Выберите Add queue, будет создана очередь vector.
После создания очереди необходимо настроить маршрутизацию сообщений. Для этого на вкладке Queues, выберите очередь vector, на открывшейся странице Queue vector выберите Bindings и задайте следующие параметры:
- From exchange: pamir_exchange;
- Routing key: #.
Выберите Bind, маршрутизация настроена.
Routing key (Ключ маршрутизации) - это строка, которая поддерживает символы подстановки:
*- заменяет одно слово;#- заменяет несколько слов или их отсутствие.
Возможные значения Routing key: auth.user.* или auth.#.
Принцип работы
RabbitMQ принимает сообщения Памир. Vector подключается к RabbitMQ, читает сообщения из очереди vector, разбирает их согласно transforms.parse_json и сохраняет их в файл ./data/vector/log/audit-%Y-%m-%d.log в формате JSON.