fix(ops/metrics): postgres-exporter печатал пароль БД в лог при каждой ошибке #3144
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3144
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3114-pg-exporter-leaks-dsn"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Закрывает пункт 2 из #3114 — «защита в глубину», который был записан за мной. Попутно опровергает предложенный там способ.
Что чиню
postgres-exporter:v0.16.0при каждой неудаче сбора печатает полный DSN вместе с паролем:Гранты
pg_monitor(пункт 1, уже сделан) убрали текущую причину ошибок, но не саму способность печатать пароль: любая другая неудача сбора вернёт утечку.Опыт, а не документация
Стенд на скретч-контейнерах Poincare: чистый постгрес, роль без прав, тот же
ops/metrics/postgres/queries.yml, что на проде — то есть ровно та ошибка, что случалась в бою.Предложенный в issue обходной путь не работает
Это важнее самой правки. В issue записано: передавать параметры через
DATA_SOURCE_URI+DATA_SOURCE_USER+DATA_SOURCE_PASS_FILEвместо единой строки — «тогда в лог попадать нечему».Проверил на том же стенде:
DATA_SOURCE_NAME(как сейчас)DATA_SOURCE_URI+USER+PASSЭкспортер собирает DSN внутри и печатает его целиком точно так же. Реализация этого варианта была бы работой вхолостую — при полном ощущении, что дыра закрыта. Утечку закрывает только версия образа.
Паритет метрик проверен
На том же стенде, обе версии против одной базы:
pg_wal_bytespg_activity_horizonpg_database_size_bytes_detailpg_table_write_amplificationpg_table_size_detailPG_EXPORTER_EXTEND_QUERY_PATHв v0.18 работает, ни одна метрика не теряется, добавляются три встроенные. Дашборды не пострадают.Тесты
Два: все три экспортера закреплены явной версией (страховка от
latestи от того, что тест начнёт проверять пустоту), и ни один не старше версии, где утечка закрыта.Что остаётся владельцу
Пункт 3 из #3114 — ротация паролей
gendesign_reader/grafana_ro. В Loki уже лежат пароли за прошедшие сутки и пролежат до конца ретенции. Ротация трогает боевые подключения, поэтому за вами.Refs #3114
Версия v0.16.0 при КАЖДОЙ неудаче сбора печатала полный DSN вместе с паролем: msg="error scraping dsn" err="queryNamespaceMappings returned 1 errors" dsn="postgresql://<роль>:<ПАРОЛЬ>@<хост>:5432/<база>?sslmode=disable" Строки уходят в Loki — около 210 в сутки с двух хостов, при ретенции 30 дней это тысячи паролей в хранилище логов (#3114). Проверял опытом, а не документацией. Стенд на скретч-контейнерах: чистый постгрес, роль без прав, тот же queries.yml что на проде — то есть ровно та ошибка, что случалась в бою. v0.16.0 → строк с паролем: 1 v0.18.0 → строк с паролем: 0 ОБХОДНОЙ ПУТЬ ИЗ ISSUE НЕ РАБОТАЕТ, и это важнее самой правки. Предлагалось передавать параметры через DATA_SOURCE_URI + DATA_SOURCE_USER + DATA_SOURCE_PASS вместо единой строки — «тогда в лог попадать нечему». Проверил на том же стенде: экспортер собирает DSN внутри и печатает его целиком точно так же, 1 строка с паролем. Реализация этого варианта была бы работой вхолостую при полном ощущении, что дыра закрыта. Паритет метрик проверен там же: все пять пользовательских запросов из queries.yml отдаются обеими версиями одинаково (PG_EXPORTER_EXTEND_QUERY_PATH в v0.18 работает), v0.18 добавляет три встроенные метрики и не теряет ни одной. Два теста сторожат нижнюю границу версии на всех трёх экспортерах. Прогон: 80 ops-тестов зелёные, ruff чист. Refs #3114