PostgreSQL pgAudit (чистый уровень R/RW)
Источник pgaudit превращает собственный журнал аудита PostgreSQL в рёбра карты
доступа: одно ребро на каждый аудированный доступ к данным, причём режим
чтения/записи берётся дословно из поля CLASS pgAudit — никогда не выводится
из текста SQL. Это канонический источник чистого уровня: объектное/реляционное
хранилище, которое классифицирует доступ в своём собственном журнале.
Коннектор работает только на чтение поверх файла журнала. Он никогда не подключается к базе данных, никогда не видит результаты запросов и никогда не захватывает тело SQL — личность, объект и классификация целиком являются собственным выводом pgAudit.
Что он эмитирует
Заголовок раздела «Что он эмитирует»| Поле | Значение |
|---|---|
| Источник сигнала | pg_audit |
| Режим | из CLASS, дословно: READ → read, WRITE → write, DDL → write (запись схемы), FUNCTION → unknown (pgAudit не сообщает); ROLE/MISC пропускаются, а не угадываются |
| Инициатор | application_name, если присутствует (→ attributed), иначе роль сессии |
| Достоверность | attributed или approximate для ролей/приложений, объявленных вами общими |
| Уровень покрытия | clean |
1. Включите pgAudit, структурированные журналы, UTC
Заголовок раздела «1. Включите pgAudit, структурированные журналы, UTC»На стороне PostgreSQL (стандартная настройка pgAudit — см. документацию pgAudit для вашей мажорной версии):
# postgresql.confshared_preload_libraries = 'pgaudit'pgaudit.log = 'read, write' # the classes this source consumeslogging_collector = onlog_destination = 'csvlog' # or 'jsonlog' (PostgreSQL 15+)log_timezone = 'UTC' # REQUIRED — see belowДва ограничения вытекают из того, как коннектор парсит, оба проверены по его реализации:
- Сервер должен вести журнал в UTC. PostgreSQL записывает временные метки с
аббревиатурой зоны, а не-UTC-аббревиатуру нельзя надёжно разрешить в
смещение — поэтому коннектор пропускает такие записи, а не угадывает
неверную метку времени.
log_timezone = 'UTC'— поддерживаемая конфигурация. csvlog— это пакет;jsonlogможет отслеживаться. Записи csvlog могут занимать несколько строк, поэтому этот формат читается пакетом на каждом проходе;jsonlogразделён по строкам и поддерживает непрерывное чтение хвоста (follow, по умолчанию).
Чтобы атрибуция была чёткой, заставьте приложения устанавливать
application_name на каждого агента — именно это повышает ребро с общей роли до
атрибутированного инициатора (см.
зависимость от личности).
2. Объявите источник
Заголовок раздела «2. Объявите источник»В вашей конфигурации источников
(OLIVARES_SOURCES_CONFIG):
{ "sources": [{ "name": "salesdb-pgaudit", "kind": "pgaudit", "tenant": "<tenant-id>", "config": { "log_path": "/var/log/postgresql/postgresql.csv", "format": "csvlog", "shared_accounts": "etl_role,app_pool" } }]}Ключи конфигурации (из поставляемого дескриптора коннектора):
| Ключ | Обязателен | По умолчанию | Значение |
|---|---|---|---|
log_path | да | — | путь к файлу журнала PostgreSQL, который может читать хост движка |
format | нет | csvlog | csvlog или jsonlog |
follow | нет | true | непрерывно читать хвост (только jsonlog — csvlog пакетный) |
shared_accounts | нет | — | роли / application_names через запятую, являющиеся общими; их рёбра честно помечаются как approximate |
Перезапустите движок и подтвердите строку загрузки
ingest: wired source … kind=pgaudit.
3. Что вы увидите в консоли
Заголовок раздела «3. Что вы увидите в консоли»Откройте Access map. Каждый аудированный доступ отображается как ребро от
роли или приложения к таблице, окрашенное в чтение или запись, со значком
покрытия CLEAN на ресурсах Postgres. Панель Permitted vs observed выводит
любой доступ без соответствующего гранта — при подключённом pgAudit и пока не
объявленных грантах каждый наблюдаемый доступ является честным дрейфом, что и
есть ожидаемое первое состояние.
Честные ограничения
Заголовок раздела «Честные ограничения»- Он видит то, что логирует pgAudit. Классы, которые вы не включаете
(
pgaudit.log), не наблюдаются; отсутствие рёбер не является доказательством отсутствия доступа, если класс выключен. - Атрибуция принадлежит базе данных. Общая роль без
application_nameсхлопывает вызывающих в одну личность — объявите её вshared_accounts, чтобы карта говорилаapproximateвместо притворства. - FUNCTION — это
unknownпо замыслу — выполнение функции может читать или писать, и pgAudit не сообщает, что именно; продукт не станет навязывать метку. Не-данные классы (ROLE, MISC) пропускаются, а не эмитируются как бессмысленные рёбра.
Связанное
Заголовок раздела «Связанное»- Подключить источник — модель коннектора и таксономия честных уровней.
- CloudTrail — та же идея чистого уровня для объектов S3.
- Коннекторы и уровни покрытия — полный каталог.