Принципи
Tally обробляє чутливі податкові дані. Це накладає три зобов'язання: конфіденційність (шифрування + контроль доступу), цілісність (audit log + immutable trails) і доступність (резервні копії + моніторинг). Все, що нижче — поточний стан, не плани.
Шифрування на рівні застосунку
Чутливі поля шифруються до запису у БД ключем, який зберігається у Vercel env (не в коді):
- Алгоритм: AES-256-GCM (12-байтовий IV, 16-байтовий authentication tag) — джерело:
src/lib/crypto.ts. - Шифруються: NIP клієнтів, REGON, банківські рахунки, PESEL, p12-сертифікати ZUS, KSeF tokens, дані авторизації e-Bramka.
- Підтримка key rotation: primary ENCRYPTION_KEY + fallback-ключі для зворотної сумісності без downtime.
- TLS 1.2+ для всіх з'єднань (HSTS, secure cookies, SameSite=Lax).
Audit log
Кожна мутація даних записується в окрему таблицю на рівні Postgres-trigger, який забороняє UPDATE/DELETE:
- Захоплюємо: дію (action), сутність (entity), before/after JSON, IP, user-agent, request ID, час.
- Тригер append_only_audit_logs у схемі гарантує, що записи неможливо змінити або видалити через звичайний DB-доступ.
- Лог зберігається мінімум 5 років (для податкових деклараційних дій — 6 років, як вимагає Ordynacja podatkowa).
Доступ і автентифікація
Сесіями керує Clerk (EU-розгорнутий auth provider):
- Підтримка 2FA (TOTP, SMS, WebAuthn) — кожен користувач вмикає у профілі Clerk.
- JWT із коротким TTL (60 секунд) + автоматична ротація сесійних токенів.
- Admin/bookkeeper console потребує окремий sudo-mode + RBAC permissions (laws.read/review/publish тощо).
Хостинг і дані лишаються в ЄС
Уся інфраструктура — у Frankfurt:
- Vercel — регіон fra1 (Frankfurt) для serverless functions і edge.
- Neon (Postgres) — регіон eu-central-1 (Frankfurt).
- AI-чат (Anthropic) — єдиний sub-processor, який може обробляти запит поза ЄС. Дані передаються тільки коли користувач активно пише в чат і покриті SCC 2021/914. Деталі — у Privacy §6.
Резервні копії і відновлення
Втрата даних — ризик, який ми мінімізуємо на двох рівнях:
- Neon PITR (Point-In-Time Recovery) — можемо відкотити БД на будь-яку мить у межах останніх 7 днів.
- Daily snapshot — зашифровані резервні копії на 30 днів.
- Експорт користувацьких даних доступний з Налаштування → Експорт — ти можеш забрати все у форматі JSON у будь-який момент.
Сегрегація даних
Один user — одна логічна тенант-зона. Кожен запит до БД фільтрується через userId на рівні Prisma-запитів:
- Cross-tenant читання неможливе — це enforce'ується у коді (RLS у Postgres підключимо за потреби).
- Admin-ролі мають окремий гетер getCurrentAdmin() із логуванням кожного звернення до чужих даних.
Реакція на інциденти
У випадку підтвердженого breach: 72 години на нотифікацію UODO (RODO art. 33) + індивідуальні листи постраждалим користувачам (art. 34).
Підозра на інцидент → пиши на privacy@tally.app із поміткою «Security incident». Розглянемо за 24 години.
Що ми ще не маємо
Чесний список того, чого зараз НЕ маємо — щоб не вводити в оману:
- Сертифікації SOC 2 / ISO 27001 — для нашого розміру не виправдані; пройдемо коли вийдемо на enterprise-клієнтів.
- Penetration test — заплановано на 4Q 2026. Поточні скани — daily SAST через GitHub CodeQL + npm audit.
Останнє оновлення · 28 травня 2026