Перейти к основному содержимому

Обмен событиями

В процессе работы Памир генерирует множество событий. Эти события могут быть использованы для интеграции с внешней системой, логирования и других задач.

События Памир попадают в exchange RabbitMQ типа topic, который называется pamir_exchange. Клиенты должны самостоятельно создать подписку на необходимые события и обрабатывать их в своих очередях.

Тип сериализации тела событий - json.

Сервис аутентификации

Список событий Памир:

НазваниеКлюч маршрутизацииТело события
Создание пользователяauth.user.Createduser_id: UUID
login: str
name: str
surname: str
patronymic: str
ldap_id: UUID
Выполнен вход пользователяauth.user.Loginuser_id: UUID
login: str
name: str
surname: str
patronymic: str
ldap_id: UUID
Выполнен выход пользователяauth.user.Logoutuser_id: UUID
login: str
name: str
surname: str
patronymic: str
ldap_id: UUID
Неудачная попытка входаauth.user.LoginFaileduser_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.LicenseViolationcontrolled_objects: int
allow_cis: int
current_controlled_objects: int
current_cis: int
Ошибка при создании КЕsrm.ci.CreatedErrorreason: list[tuple[EXC_NAME, EXC_TITLE, EXC_DETAIL, EXC_MSG_VARS]]
ci_type_name: str

Сервис мониторинга

НазваниеКлюч маршрутизацииТело события
Ошибка при превышении количества объектов разрешенных лицензиейmonitoring.target.LicenseViolationcontrolled_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.