Перейти к основному содержимому

Сторож удостоверения БД и привилегий

Если видишь 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 EnvelopeETL-пользователь без 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() — читает контракт из env
  • attest_connection() — выполняет проверку на живом соединении

Обёртка: marketplace-collector-v3/scripts/runtime_db_attestation.sh Конфиг на S3: /etc/gwptd/state/v3-etl-db-attestation.env

Как работает

  1. Production-обёртка устанавливает V3_REQUIRE_DB_ATTESTATION=1
  2. _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
  3. При КАЖДОМ connect/reconnect выполняется:
    SELECT CURRENT_USER() AS `current_user`, @@server_uuid AS `server_uuid`
  4. Результат сравнивается с ожидаемым. Несовпадение → 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='...')")

Что делать

  1. Проверить конфиг на S3:
    cat /etc/gwptd/state/v3-etl-db-attestation.env
  2. Убедиться что файл: root:root, не group/other writable
  3. Проверить что CURRENT_USER и server_uuid соответствуют БД:
    SELECT CURRENT_USER(), @@server_uuid;
  4. Если сервер БД изменился — обновить 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:00RuntimeError.

Почему это важно

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, DELETE
  • SELECT
  • SET (только известные переменные)
  • 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