# ClickHouse (сбор событий аудита БД)

<p class="callout info">Информация, приведенная на данной странице, является разработкой команды pre-sales и/или community KUMA и **НЕ** является официальной рекомендацией вендора.</p>

Для настройки базового аудита Clickhouse понадобится:  
  
1\. Для логирования обычных запросов (в том числе grant, create, drop) включить логирование в основном файле (по умолчанию включено):

```bash
/etc/clickhouse-server/config.xml
```

 в секции logger как минимум необходимо задать формат information

```xml
#########################################
<clickhouse>
    <logger>
        <level>information</level>
#########################################
```

2\. Для логирования подключений, таких как:

- Login пользователя
- Failure logon
- Logout пользователя

потребуется создать отдельный файл

```bash
/etc/clickhouse-server/config.d/session_log.xml
```

 с содержимым:

```xml
<clickhouse>
    <session_log>
        <database>system</database>
        <table>session_log</table>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
    </session_log>
</clickhouse>
```

И отдельный файл

```bash
/etc/clickhouse-server/config.d/listen_port.xml
```

С содержимым (для возможности удалённого подключения к БД):

```xml
<clickhouse>
  <listen_host>::</listen_host>
</clickhouse>
```

  
3\. Перезапустить службу командой systemctl restart clickhouse-server

В базе system появится новая таблица со следующими колонками:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-01/scaled-1680-/s17image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-01/s17image.png)

Создаём пользователя для подключения к БД для KUMA и выдаём ему необходимые права следующим командами (с использованием ранее настроенного аудита):

```sql
###Шаг 1. Создание пользователя для коллектора KUMA
CREATE USER kuma HOST IP '10.10.10.1/32' IDENTIFIED WITH sha256_password BY 'supersecretpassword';

####Шаг 2. Создание VIEW для вывода нескольких запросов
CREATE VIEW combined_logs
AS SELECT
    event_time AS timestamp,
    query_kind AS deviceAction,
    user AS userName,
    toString(initial_address) AS sourceAddress,
    exception AS msg,
    query AS requestUrl,
    query_duration_ms AS dcs1,
    memory_usage AS dcs2
FROM system.query_log
WHERE (query_kind IN ('Grant', 'Create', 'Drop')) OR (query_duration_ms > 600000) OR (memory_usage > 1000000000)
UNION ALL
SELECT
    event_time AS timestamp,
    type AS deviceAction,
    user AS userName,
    toString(client_address) AS sourceAddress,
    failure_reason AS msg,
    NULL AS requestUrl,
    NULL AS dcs1,
    NULL AS dcs2
FROM system.session_log
WHERE type IN ('LoginFailure', 'LoginSuccess')
ORDER BY timestamp DESC

####Шаг 3. Назначение прав на VIEW
GRANT SELECT ON combined_logs TO kuma
GRANT SELECT ON system.session_log TO kuma
GRANT SELECT ON system.query_log TO kuma
```

Пример как выглядит вывод VIEW:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-02/scaled-1680-/wd5image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-02/wd5image.png)

Настройка инстанса завершена, можно приступать к подключению логов в KUMA.

Итого данной View мы выводим следующие события:

- Login пользователя
- Failure logon
- Logout пользователя
- Длительный запрос в базу (более 10 минут, как пример)(условие query\_duration\_ms &gt; '600000' в запросе )
- Большое потребление памяти при запросе (более 1 Гб, как пример)(условие memory\_usage &gt; '1000000000')
- Создание пользователя
- Назначение прав пользователю
- Удаление пользователя

В KUMA необходимо создать коллектор с транспортом sql (плейсхолдер для Clickhouse - ?) и параметрами как на скриншоте (для примера указаны разные версии):

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-12/scaled-1680-/Io0image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-12/Io0image.png)

  
  
**Корректный запрос:**

```sql
SELECT * FROM combined_logs 
WHERE timestamp > parseDateTimeBestEffort(?)
```

Выбираем нормализатор Clickhouse ([доступен в Community pack](https://kas.pr/kuma-ppack)), добавляем необходимые точки назначения и инсталлируем службу коллектора.

Либо, если нам **<span style="color: rgb(0, 0, 0);">не нужны события входа в БД</span>** можем использовать запрос только в таблицу по умолчанию:

```sql
###Шаг 1. Создание пользователя для коллектора KUMA
CREATE USER kuma HOST IP '10.10.10.1/32' IDENTIFIED WITH sha256_password BY 'supersecretpassword';

####Шаг 2. Назначение прав на выполнение SELECT к system.query_log
GRANT SELECT ON system.query_log TO kuma

####Шаг 3. Используем запрос для KUMA коллектора
SELECT event_time AS timestamp,
       query_kind AS deviceAction,
       user AS userName,
       toString(initial_address) AS sourceAddress,
       exception AS msg,
       query AS requestUrl,
	   query_duration_ms AS dcs1,
	   memory_usage AS dcs2
FROM system.query_log
WHERE query_kind IN ('Grant', 'Create', 'Drop') OR query_duration_ms > '600000' OR memory_usage > '1000000000' AND timestamp > ?
ORDER BY timestamp DESC
```