BOT / Комплаенс — Q&A¶
Подсвеченный Q&A для регулятора Bank of Thailand (BOT) и комплаенс-команды OneWallet (e-money кошелёк, THB). Формат: Вопрос → Как реализовано → Статус → Ссылка.
Легенда статусов: ✅ реализовано · ⏳ в плане · ⚠️ открыто (нет в коде).
На какие вопросы отвечает¶
- Шифруются ли персональные данные (PII) клиентов и каким алгоритмом?
- Как устроены KYC/AML и уровни (tiers), кто видит расшифрованные данные?
- Где задаются лимиты переводов и работает ли step-up аутентификация?
- Сколько и где хранятся данные операций, есть ли аудиторский след?
- Чем гарантируется целостность денег (никаких потерянных/задвоенных средств)?
- Что из требований BOT 18/2568 ещё не закрыто (root/jailbreak, cert pinning и т.д.)?
Базовые документы: ответ по BOT-уведомлению — bot-18-2568/01-response.md, открытый план — bot-18-2568/03-todo.md, вопросы по плану счетов — accountant-questions.md.
1. Защита PII (персональные данные)¶
| Вопрос | Как реализовано | Статус | Ссылка |
|---|---|---|---|
| Шифруются ли PII в БД? | AES-256-GCM, blob [1B version][12B nonce][ciphertext+16B GCM tag], пакет cryptography. Поле user_profile.encryptedPii, флаг encryptPii=true |
✅ | onewallet_base_server/.../services/pii/pii_crypto_service.dart · adr/0005-pii-encryption.md |
| Как ищут по телефону/нац. ID без расшифровки? | HMAC-SHA256 с pepper (piiPhoneHashPepper, piiNatIdHashPepper) — детерминированный хеш для поиска |
✅ | .../services/pii/pii_hash_service.dart |
| Видит ли оператор полные данные? | По умолчанию — маскирование; полная расшифровка — только по явному запросу оператора | ✅ | .../services/pii/pii_mask_service.dart, pii_decryption_service.dart |
| Где хранятся ключи? | passwords.yaml: piiEncryptionKey, piiPhoneHashPepper, piiNatIdHashPepper (не в репозитории) |
✅ | dev/05-security-and-auth.md |
2. KYC / AML и уровни (tiers)¶
| Вопрос | Как реализовано | Статус | Ссылка |
|---|---|---|---|
| Как проходит KYC? | OCR документа (Gemini/Ollama) + face matching (CompreFace), очередь BullMQ в kyc-service; файлы — в Garage S3 (bucket kyc-prod-data) |
✅ | dev/06-storage-and-kyc.md |
| Liveness для high-value операций? | Face match есть; liveness-проверка по высоким суммам — в плане | ⏳ | bot-18-2568/01-response.md §1.4 · 03-todo §A-9, C-2.11 |
| Точные значения daily/monthly по Tier 1 / Tier 2? | Механизм лимитов есть (pm.limit_rule); конкретные пороги tiers согласуются с BOT |
⚠️ | bot-18-2568/03-todo.md §A-6 |
3. Лимиты и step-up аутентификация¶
| Вопрос | Как реализовано | Статус | Ссылка |
|---|---|---|---|
| Где задаются лимиты переводов? | Таблица pm.limit_rule (DAILY/MONTHLY окна, по operationType/channel/тегам); проверка при каждом intent |
✅ | payment-manager/src/limits/check-limits.ts · business/05-limits-and-fees.md |
| Есть ли step-up на крупные/рисковые операции? | pm.auth_policies + POST /policies/evaluate: уровни NONE/PIN/OTP/BIOMETRIC/KYC_UPLIFT; условия amount_gte, daily_cumulative_gte, new_payee, currency |
✅ (инфра) | payment-manager/src/limits/evaluate-policy.ts |
| Конкретные пороги step-up (per-tx / daily)? | Предложение 50 000 / 200 000 THB — на согласовании с compliance/legal | ⚠️ | bot-18-2568/03-todo.md §A-5 |
| Защита приложения на устройстве? | PIN 6 цифр + биометрия (local_auth) + auto-lock 5 мин (требование НацБанка) |
✅ | dev/05-security-and-auth.md |
Пример step-up. Платёж 75 000 THB новому мерчанту: POST /policies/evaluate находит политику
amount_gte=50000 → возвращает BIOMETRIC. Без подтверждения intent не переходит из VALIDATED в AUTHORIZED.
Сноска про
operationTypeи расчёт комиссий. Всего в системе 11 типов операций, но эндпоинт предпросмотра комиссийPOST /intents/quoteподдерживает не все — егоz.enum(payment-manager/src/intent/quote.ts) не включает, в частности,NFC_CHARGE. То есть intent такого типа создать можно, а получить по нему quote — нет.
4. Хранение данных, retention, аудит¶
| Вопрос | Как реализовано | Статус | Ссылка |
|---|---|---|---|
| Где журналируются события операций? | pm.intent_event (полный журнал переходов по каждому intent), pm.tx_history, pm.outbox_event |
✅ | dev/03-data-and-schemas.md |
| Можно ли восстановить полный путь операции? | trace_id = intent_id присутствует в каждом платёжном событии в логах и в intent_event |
✅ | dev/04-payments-and-ledger.md |
| Жизненный цикл данных пользователя? | active → archive → delete + cleanup-кроны (Serverpod FutureCall) | ✅ | dev/05-security-and-auth.md |
Retention attestation-логов / user_device? |
Предложение 1 год — в плане, поля ещё не введены | ⏳ | bot-18-2568/03-todo.md §A-10 |
5. Целостность денег (ledger)¶
| Вопрос | Как реализовано | Статус | Ссылка |
|---|---|---|---|
| Чем гарантируется, что деньги не теряются/не дублируются? | TigerBeetle 0.17.4 (двухфазные pending/post переводы); главный инвариант transit.balance = 0 |
✅ | adr/0001-tigerbeetle-ledger.md |
| Кто может писать в ledger? | Только Payment Manager (HMAC POST /intents); admin-panel — read-only; Auth Center и PSP прямого доступа не имеют |
✅ | dev/04-payments-and-ledger.md |
| Как защищены внутренние вызовы? | Единый HMAC-SHA256: sig = HMAC(secret, ${ts}\n${METHOD}\n${PATH}\n${sha256(body)}), окно ±60с, timing-safe сравнение |
✅ | payment-manager/src/auth/hmac.ts · adr/0002-single-hmac-auth.md |
| Воспроизводимость счетов? | TB account id = uuidv5(name, namespace) — детерминирован и верифицируем без доп. state |
✅ | adr/0001-tigerbeetle-ledger.md |
Состояния intent (поток денег для INTERNAL P2P — синхронно в одном запросе):
flowchart LR
CREATED --> VALIDATED --> AUTHORIZED --> SETTLING --> SETTLED
VALIDATED -. step-up .-> MANUAL_REVIEW
AUTHORIZED -. отказ PSP .-> FAILED
CREATED -. отмена/таймаут .-> CANCELED & EXPIRED
6. Открытые пункты BOT 18/2568 (нет в коде)¶
| Вопрос | Статус в коде | Отметка | Ссылка |
|---|---|---|---|
| Certificate pinning (TLS) | В исходниках приложений не найден; нужен primary + backup pin и процедура ротации | ⚠️ | bot-18-2568/03-todo.md §C-2.19 |
| Root/Jailbreak detection | Есть в legacy onewallet_base_flutter/lib/main.dart (flutter_jailbreak_detection, hard-block в release); в активных one_loop_app / one_merchant_app отсутствует |
⚠️ | 03-todo §C-3.10 · onewallet_base_flutter/lib/main.dart:47-55 |
| Play Integrity / App Attest (device attestation) | Не реализовано | ⏳ | bot-18-2568/03-todo.md §C-2.6, C-3.4–3.6 |
| Один пользователь на устройство (device binding) | Не реализовано | ⏳ | 03-todo §C-2.1, C-3.1 |
| Блокировка устаревших версий приложения | Гейт версии есть в onewallet_base_flutter (app_version_gate); единая серверная политика — в плане |
⏳ | 03-todo §C-2.7, C-3.15 |
| Анти-tampering / обфускация / FLAG_SECURE | В плане (Фаза 0–1) | ⏳ | bot-18-2568/03-todo.md §C-3.7–3.13 |
| TB-CERT feed (high-risk устройства) | Не реализовано; требует юр. подписки | ⏳ | 03-todo §A-4, C-2.12 |
Полный трекинг закрытия — bot-18-2568/03-todo.md (фазы 0–5, оценка 8–10 недель). Вопросы плана счетов / сверки для бухгалтера — accountant-questions.md.
См. также: service-map.md, TIMELINE.md, pm-report.md.