Сторож удостоверения БД и привилегий
Если видишь
V3 DB identity attestation failed,V3 DB session time_zone attestation failed,V3 ETL privilege envelope— ты здесь.
Какие сторожа входят
| Сторож | Что охраняет |
|---|---|
| DB Identity Attestation | Подключение к правильному MySQL (server_uuid + CURRENT_USER) |
| UTC Session Guard | Все таймстемпы в UTC (иначе сломается сверка P1B) |
| MySQL Privilege Envelope | ETL-пользователь без GRANT OPTION, привилегии ограничены |
| Legacy Connection Guard | При active attestation нельзя открыть legacy-connection |
| Kernel Publication SQL Guard | Только разрешённые SQL-операторы при публикации |
| MySQL SHOW CREATE Contract | Схема БД соответствует версионированным контрактам (deploy-time) |
DB Identity Attestation
Где
marketplace-collector-v3/db/connection.py:
_runtime_db_attestation_contract()— читает контракт из envattest_connection()— выполняет проверку на живом соединении
Обёртка: marketplace-collector-v3/scripts/runtime_db_attestation.sh
Конфиг на S3: /etc/gwptd/state/v3-etl-db-attestation.env
Как работает
- Production-обёртка устанавливает
V3_REQUIRE_DB_ATTESTATION=1 _runtime_db_attestation_contract()проверяет env:V3_EXPECTED_CURRENT_USERдолжен быть одним из разрешённых:gwptd_etl@%,gwptd_monitor@%,gwptd_schedule_control@%,gwptd_raw_collector@%,gwptd_parser@%,gwptd_parse_promoter@%V3_EXPECTED_SERVER_UUIDдолжен быть валидным UUID
- При КАЖДОМ connect/reconnect выполняется:
SELECT CURRENT_USER() AS `current_user`, @@server_uuid AS `server_uuid` - Результат сравнивается с ожидаемым. Несовпадение →
RuntimeError
Как отказывает
RuntimeError("V3 DB attestation requires an audited exact CURRENT_USER")
RuntimeError("V3 DB attestation requires a valid expected server UUID")
RuntimeError("V3 DB identity attestation failed (CURRENT_USER='...', server_uuid='...')")
Что делать
- Проверить конфиг на S3:
cat /etc/gwptd/state/v3-etl-db-attestation.env - Убедиться что файл:
root:root, не group/other writable - Проверить что
CURRENT_USERиserver_uuidсоответствуют БД:SELECT CURRENT_USER(), @@server_uuid; - Если сервер БД изменился — обновить
V3_EXPECTED_SERVER_UUID
UTC Session Guard
Где
marketplace-collector-v3/db/connection.py — _ensure_utc_session()
Как работает
При каждом connect/reconnect:
SET SESSION time_zone = '+00:00';
SELECT @@session.time_zone AS `session_time_zone`;
Если результат не +00:00 → RuntimeError.
Почему это важно
Receipt и build manifest сравнивают MySQL-таймстемпы с UTC capture dates. Если сессия в другом часовом поясе — P1B-3 сверка сломается.
Как отказывает
RuntimeError("V3 DB session time_zone attestation failed")
MySQL Privilege Envelope
Где
marketplace-collector-v3/db/connection.py — _normalize_grant_statement()
Как работает
При ETL-подключении проверяется SHOW GRANTS. Парсер принимает ТОЛЬКО
обычные object privileges для exact attested principal. Запрещено:
GRANT OPTION- Role membership
- PROXY
- Неизвестные statement forms
- Привилегии для другого principal
- Глобальные привилегии (
*.*)
Как отказывает
RuntimeError("V3 ETL privilege envelope contains GRANT OPTION")
RuntimeError("V3 ETL privilege envelope contains an unsupported grant")
RuntimeError("V3 ETL privilege envelope targets another principal")
Legacy Connection Guard
Где
marketplace-collector-v3/db/connection.py, строка 1284–1289
Что охраняет
При активной V3_REQUIRE_DB_ATTESTATION=1 нельзя открыть legacy-connection
(в старую БД lamoda_reports) — это обошло бы attestation.
Как отказывает
RuntimeError("legacy DB connections are forbidden while V3 DB attestation is active")
Kernel Publication SQL Guard
Где
marketplace-collector-v3/db/kernel_publication.py
Что охраняет
При kernel publication (записи в gwptd_kernel) разрешены только:
INSERT,UPDATE,DELETESELECTSET(только известные переменные)- Savepoints
Запрещены:
/*! ... */executable comments (могут содержать COMMIT)- Multi-statements
- DDL
- Неизвестные SET-переменные
Как отказывает
KernelPublicationTransactionError("unreviewed SET is forbidden during kernel publication")
KernelPublicationTransactionError("SQL statement ... is forbidden during kernel publication")
MySQL SHOW CREATE Contract (deploy-time)
Где
scripts/deploy/deploy-s3-next.sh (внутренний deploy)
Что охраняет
При деплое проверяется что SHOW CREATE для foundation-таблиц и schedule slot-ledger побайтно совпадает с версионированными контрактами.
Как отказывает
Refusing deploy: gwptd_kernel.fact_orders differs from its versioned CREATE contract
Refusing deploy: durable schedule slot-ledger SHOW CREATE contract is missing
Refusing deploy: durable schedule slot-ledger tables must not have triggers