Files
portal/docs/security/pgaudit-anonymizer-setup.md
T
Дмитрий 527a779d9b docs(security): pg_audit #28 + pg_anonymizer #29 установлены на боевом liderra.ru
- CLAUDE.md v2.25->2.26: §3.4 #28/#29 -> прод, §6 +абзац, §0 Tooling cross-ref v2.21->v2.22, §9 +запись
- Tooling Прил.Н v2.21->2.22: §5.1 #28/#29 attribute-блоки +статус, §6 compliance-таблица, §10.4 шаг 2 -> прод
- новый docs/security/pgaudit-anonymizer-setup.md (установка/использование/закрепление версии PG)

Расширения PostgreSQL фазы 3, недоступные на dev native-Windows; установлены на боевом Ubuntu 24.04 / PostgreSQL 16.
pg_audit (152-ФЗ аудит-журнал, log_parameter=off), pg_anonymizer 3.0.13 (Rust, on-demand LOAD).
Версия PG закреплена (apt-mark hold + PGDG off) после незапланированного 16.13->16.14.
Гейты: cross-ref-checker + l1-watcher 0 drift, markdownlint 0.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 04:58:47 +03:00

7.0 KiB
Raw Blame History

pg_audit (#28) + pg_anonymizer (#29) — установка на боевом сервере

Статус: установлены на боевом liderra.ru 22.05.2026. PostgreSQL 16.14, БД liderra.

Это два расширения PostgreSQL фазы 3 (Compliance), которые нельзя было поставить на dev native-Windows PG (расширения там недоступны — см. memory/project_phase1_strategy.md). Внедрены, когда появился боевой Linux-сервер.

Сервер: VM liderra-test (Ubuntu 24.04), ssh -i ~/.ssh/liderra_deploy ubuntu@111.88.246.137, кластер 16/main (порт 5432), приложение /var/www/liderra/app.


Бэкап перед работами (обязательно)

sudo -u postgres pg_dump -Fc -d liderra > /home/ubuntu/backups/liderra-pre-<TS>.dump

Точка отката от 22.05.2026: /home/ubuntu/backups/liderra-pre-pgaudit-anon-20260522-010441.dump (custom format, 1170 объектов).


#28 pg_audit — журнал аудита БД (152-ФЗ)

Что даёт: server-side журнал DDL / изменений прав / записей данных в дополнение к прикладным auth_log, pd_processing_log, incidents_log.

Установка (выполнено):

sudo apt-get install -y postgresql-16-pgaudit        # из штатного репозитория Ubuntu
sudo -u postgres psql -c "ALTER SYSTEM SET shared_preload_libraries = 'pgaudit';"
sudo systemctl restart postgresql@16-main             # ← единственный перезапуск (~2с простоя)
sudo -u postgres psql -d liderra -c "CREATE EXTENSION pgaudit;"
sudo -u postgres psql -c "ALTER SYSTEM SET pgaudit.log = 'ddl, role, write';"
sudo -u postgres psql -c "ALTER SYSTEM SET pgaudit.log_parameter = 'off';"   # ПДн НЕ в логах
sudo -u postgres psql -c "ALTER SYSTEM SET pgaudit.log_catalog = 'off';"
sudo -u postgres psql -c "SELECT pg_reload_conf();"

Важно: pgaudit.log_parameter = off — значения SQL-параметров (телефоны/почты лидов) НЕ попадают в логи, иначе аудит сам стал бы утечкой ПДн.

Где логи: /var/log/postgresql/postgresql-16-main.log, строки вида AUDIT: SESSION,....

Проверка: CREATE TABLE _smoke(id int); INSERT INTO _smoke VALUES (1); DROP TABLE _smoke; → в логе три строки AUDIT: ... DDL/WRITE/DDL с <not logged> вместо значений.


#29 pg_anonymizer (anon) — маскирование ПДн в выгрузках

Что даёт: маскированные дампы базы (телефоны → +7******XX, почты → iv***.ru), чтобы реальные ПДн не попадали в dev/staging. Правило §5.1 правил Claude.

Версия: anon 3.0.13 — это Rust/pgrx 0.18.0 расширение; готового пакета нет ни в Ubuntu, ни в PGDG → собрано из исходников.

Сборка (выполнено, ~15 мин):

# build-deps (после — удалены, см. ниже)
sudo apt-get install -y build-essential postgresql-server-dev-16 pkg-config git
# Rust toolchain (в ~/.cargo, ~/.rustup — после удалены)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
source "$HOME/.cargo/env"
cargo install cargo-pgrx --version 0.18.0 --locked   # версия = pgrx из Cargo.lock
cargo pgrx init --pg16 /usr/lib/postgresql/16/bin/pg_config   # системный PG, без скачивания
git clone --depth 1 https://gitlab.com/dalibo/postgresql_anonymizer.git /tmp/anon && cd /tmp/anon
make extension PG_CONFIG=/usr/lib/postgresql/16/bin/pg_config PGVER=pg16   # длинная компиляция
sudo make install PG_CONFIG=/usr/lib/postgresql/16/bin/pg_config PGVER=pg16  # просто cp (cargo root-у не нужен)

Подключение (выполнено) — БЕЗ перезапуска:

sudo -u postgres psql -d liderra -c "CREATE EXTENSION anon CASCADE;"
sudo -u postgres psql -d liderra -c "SELECT anon.init();"

Загрузка ПО ТРЕБОВАНИЮ (важно для производительности): anon НЕ подключён через session_preload_libraries на всю БД — иначе 9.6 МБ anon.so грузились бы при каждом подключении портала. В сессии маскирования библиотека загружается явно:

LOAD 'anon';
SELECT anon.partial('+79161234567', 2, '******', 2);   -- → +7******67

Сделать маскированный дамп (anon боевые данные не меняет — только при явном anonymize_database(), которого на проде не запускаем):

# вариант через pg_dump_anon (грузит anon сам) либо вручную в сессии с LOAD 'anon'

Файлы: anon.so + anon.control в /usr/lib/postgresql/16/lib/ и /usr/share/postgresql/16/extension/ — это standalone-файлы, не принадлежат apt-пакету (сохраняются при autoremove). После мажорного апгрейда PostgreSQL расширение нужно пересобрать (re-clone + rebuild).


⚠️ Незапланированный апгрейд PG + закрепление версии

Установка postgresql-server-dev-16 из PGDG потянула апгрейд боевого postgresql-16 16.13 → 16.14 (сборка PGDG) с авто-перезапуском кластера. Минорный патч — данные целы, портал здоров. Закреплено против повтора:

sudo mv /etc/apt/sources.list.d/pgdg.list /etc/apt/sources.list.d/pgdg.list.disabled
sudo apt-mark hold postgresql-16 postgresql-client-16     # в `dpkg -l` статус 'hi', не 'ii'

Для будущего патча PostgreSQL — sudo apt-mark unhold postgresql-16 postgresql-client-16 осознанно.

Очистка build-инструментов (выполнено)

rm -rf ~/.cargo ~/.rustup ~/.pgrx /tmp/anon          # Rust + исходники (~2.2 ГБ)
sudo apt-get purge -y build-essential postgresql-server-dev-16 pkg-config
sudo apt-get autoremove --purge -y                   # gcc/llvm/clang orphans

Расширения (pgaudit.so, anon.so) — отдельные файлы, очистку build-тулчейна переживают.


Серверный слой защиты — отдельно

WAF / anti-brute / DDoS / мониторинг / секреты / TLS-HSTS-CSP / бэкапы — это инфраструктура, не расширения БД. Открытые вопросы SEC-1..SEC-7 (docs/Открытые_вопросы_v8_3.md), привязка к Б-1.