auspex/DATABASE_SCHEMA.md
2026-06-09 17:12:18 +03:00

151 lines
6.3 KiB
Markdown
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Auspex — Схема базы данных
## Общее
Auspex подключается к PostgreSQL базе данных `waf_info`. Используется в двух модулях: `-l` (logcheck) и `-p` (portcheck). Подключение реализовано с автоматическим failover: сначала пробуется primary-хост, при недоступности — secondary.
**Параметры подключения** задаются в `/etc/auspex/auspex.env`:
```
DB_USER=
DB_PASSWORD=
DB_NAME=waf_info
DB_PORT=5432
PRIMARY_DB_HOST=10.100.10.8
SECONDARY_DB_HOST=10.100.13.5
```
Соединение устанавливается без TLS (`sslmode=disable`).
---
## Таблицы
### `instances_new`
Используется в: **`-l` (logcheck)**
Содержит информацию о том, какие WAF-инстансы развёрнуты на каких хостах. Logcheck использует эту таблицу как первый шаг — определяет инстансы текущего хоста по его hostname.
**Запрос:**
```sql
SELECT hostname, instance
FROM instances_new
WHERE hostname = $1
```
**Используемые столбцы:**
| Столбец | Тип | Описание |
|---------|-----|----------|
| `hostname` | text | FQDN или короткое имя хоста (совпадает с `os.Hostname()`) |
| `instance` | text | Имя инстанса WAF (передаётся в следующий запрос к `client_info`) |
---
### `client_info`
Используется в: **`-l` (logcheck)**
Содержит привязку клиентов к WAF-инстансам. Logcheck получает список клиентов для инстансов найденных на текущем хосте.
**Запрос:**
```sql
SELECT DISTINCT client_title, waf_instance
FROM client_info
WHERE waf_instance IN ($1, $2, ...)
```
**Используемые столбцы:**
| Столбец | Тип | Описание |
|---------|-----|----------|
| `client_title` | text | Название клиента (передаётся в следующий запрос к `apps_settings`) |
| `waf_instance` | text | Имя инстанса WAF (используется для фильтрации по IN) |
---
### `apps_settings`
Используется в: **`-l` (logcheck)** и **`-p` (portcheck)**
Центральная таблица настроек приложений. Каждая строка — одно L7-приложение с его параметрами мониторинга.
#### Запрос из logcheck (`-l`):
```sql
SELECT l7resourceid, client_title, COALESCE(check_write_logs, false)
FROM apps_settings
WHERE client_title IN ($1, $2, ...)
```
#### Запрос из portcheck (`-p`):
```sql
SELECT l7resourceid, COALESCE(check_ports, false)
FROM apps_settings
```
**Используемые столбцы:**
| Столбец | Тип | Описание |
|---------|-----|----------|
| `l7resourceid` | text | Идентификатор L7-ресурса. В logcheck используется для поиска файлов логов по паттерну `{LOG_DIR}/*/*/{l7resourceid}*_access.log`. В portcheck извлекается из имени конфига (`Client_17822.conf``17822`) |
| `client_title` | text | Название клиента — используется для группировки в алертах |
| `check_write_logs` | boolean / null | Флаг включения проверки логов. `true` — файлы логов этого приложения проверяются. `null` обрабатывается как `false` через `COALESCE` |
| `check_ports` | boolean / null | Флаг включения проверки портов. `true` — nginx upstream конфиг этого приложения проверяется. `null` обрабатывается как `false` через `COALESCE` |
---
## Цепочка запросов в logcheck
Logcheck выполняет запросы последовательно, передавая результаты каждого шага в следующий:
```
os.Hostname()
instances_new (WHERE hostname = ?)
│ → []instance
client_info (WHERE waf_instance IN (...))
│ → []client_title
apps_settings (WHERE client_title IN (...) AND check_write_logs = true)
│ → []l7resourceid
Файловая система: /var/log/ptaf_nginx/*/*/{l7resourceid}*_access.log
│ → ModTime → сравнение с порогом
Алерт если файл устарел
```
Если на любом шаге результат пустой — выполнение прекращается с информационным сообщением в лог.
---
## Использование `l7resourceid` в portcheck
В portcheck `l7resourceid` не запрашивается напрямую — он извлекается из имени nginx конфига функцией `pcExtractL7ResourceID`:
```
/home/install/conf/ptaf-nginx/client/env/conf/Client_Name_17822.conf
└─────┘
l7resourceid = "17822"
```
Логика: берётся часть имени файла после последнего символа `_` без расширения. Затем по этому ID делается запрос к `apps_settings` для проверки флага `check_ports`.
Если `check_ports = false` — конфиг пропускается, его upstream-серверы не проверяются. Если записи в БД нет — конфиг тоже пропускается (поведение по умолчанию безопасное).
---
## Минимально необходимые права пользователя БД
Для работы Auspex достаточно прав только на чтение:
```sql
GRANT CONNECT ON DATABASE waf_info TO auspex_user;
GRANT USAGE ON SCHEMA public TO auspex_user;
GRANT SELECT ON instances_new TO auspex_user;
GRANT SELECT ON client_info TO auspex_user;
GRANT SELECT ON apps_settings TO auspex_user;
```