Přeskočit na obsah
Tato stránka je designovaná pro tisk do PDF (Cmd/Ctrl+P). Pen-test reports a podrobná DR documentace zůstávají pod NDA — pište na [email protected].
SECURITY WHITEPAPER

Bezpečnostní architektura DataNostro

Co, kde, jak — bez NDA. Pro B2B security review.

Verze: 1.0
Účinné od: 2026-05-24
Vlastník dokumentu: [email protected]
Klasifikace: Public

1. Rozsah

Tento dokument popisuje bezpečnostní architekturu DataNostro — managed server-side Google Tag Manager (sGTM) hosting platformy provozované v EU. Zaměřuje se na technická a organizační opatření podle čl. 32 GDPR aplikovaná na zpracovávání osobních údajů zákazníků (Správců) a koncových uživatelů jejich webů (Subjektů údajů).

Tento dokument NEPOKRÝVÁ:

  • Externí pen-test report (plánován Q4 2026; po dokončení sdílíme pod NDA na vyžádání)
  • Disaster recovery playbook (sdílen pod NDA pro Enterprise)
  • Vendor risk assessment sub-procesorů (interní)

2. Data flow

Zjednodušený pipeline tracking eventu od návštěvníka webu Správce po dispatch do ad platforem:

[návštěvník eshop.cz]
       │ HTTPS POST /g/collect
       ▼
[Cloudflare WAF + DDoS]
       │
       ▼
[DataNostro nginx ingress (DE)]
       │ proxy_pass — Power-Ups middleware (geo, UA, bot, anonymize)
       ▼
[sGTM Docker container (per-tenant, EU)]
       │ GTM Server tagy
       ▼
[Celery worker — async dispatch]
       │
       ├─→ Google Analytics 4 (Measurement Protocol)
       ├─→ Meta Conversions API
       ├─→ Google Ads Enhanced Conversions
       ├─→ TikTok Events API
       ├─→ Sklik konverze
       └─→ (10+ dalších platforem)
       │
       ▼
[Postgres EventCapture — debug log, per-tenant retention 3–90 dní]

Klíčové: data putují pouze přes naše EU infrastrukturní vrstvy. Cloudflare slouží jako CDN + DDoS — terminace TLS proběhne u nás (Cloudflare Authenticated Origin Pulls).

3. Data residency a sub-procesoři

Primary residency: Hetzner Online GmbH (DE) — Tier III datacentrum, lokalita Falkenstein nebo Nuremberg. Žádný US-parent.

Sub-procesorRoleRegionData
Hetzner Online GmbHHosting (compute, Postgres, Redis)DEVše — primární storage
Cloudflare Inc.CDN, DDoS, WAF, DNSUS (EU edge)Pouze v transitu (TLS), žádné perzistentní storage
Seznam.cz, a.s.SMTP relay pro transakční e-maily (onboarding, faktury, alerty)CZEmail adresy příjemců + obsah notifikací
Druhý EU region (Hetzner)Offsite kopie pg_dump (denně)DEŠifrované pg_dump snapshoty
Sentry (Functional Software, Inc.)Error tracking + performance monitoringEU (Frankfurt)Anonymizované stack traces (žádná payload data eventů)

Aktuální seznam sub-procesorů + jejich DPA odkazy je vždy ke stažení v /cs/dpa/. Změny sub-procesorů oznamujeme 30 dní předem dle čl. 28(2) GDPR.

4. Šifrování

V transitu

  • TLS 1.2+ (nginx forced), TLS 1.3 preferred
  • Let's Encrypt certifikáty s 90denní rotací (cert-manager)
  • HSTS 1 rok + preload
  • Authenticated Origin Pulls mezi Cloudflare a naším origin (mTLS)

V klidu

  • Postgres: full-disk encryption (Hetzner LUKS) + per-row encryption pro tokeny platforem (Fernet, cryptography library)
  • Redis: nepoužíván pro perzistentní citlivá data (jen cache + queue)
  • Pg_dump zálohy: AES-256 šifrované (gpg), uložené v druhém EU regionu
  • Hesla uživatelů: Argon2id (Django default od 2025)

5. Přístupová kontrola

Customer access (dashboard)

  • Email/heslo + povinná 2FA pro role admin/owner (TOTP + WebAuthn passkeys)
  • SSO/SAML/OIDC pro Enterprise (Okta, Azure AD, Google Workspace)
  • Role-based: owner, admin, member, viewer + per-workspace scoping
  • Brute-force ochrana přes django-axes (lockout po 5 neúspěšných pokusech)
  • Session timeout 30 min idle, absolutní expirace 24 h

DataNostro staff access

  • SSH na produkční node: pouze přes hardware keys (FIDO2), žádná hesla
  • Admin panel přístup: pouze přes VPN (WireGuard) + povinné MFA
  • Impersonation: každá akce 'Login as user' loguje do audit logu s 90denní retencí
  • Princip nejmenších oprávnění — žádný full-DB access mimo dvou techů, vše jinak přes Django ORM s row-level scoping

6. Síťová bezpečnost

  • Cloudflare WAF — OWASP Top 10 rules, custom rules na bot signatures
  • DDoS ochrana: Cloudflare unmetered (L3/L4 + L7)
  • Rate limiting: 100 req/s per IP na /api/*, 1000 req/s na /g/collect (per-tenant)
  • nginx ingress: pouze ports 80 (HTTP→HTTPS redirect) + 443
  • Postgres + Redis: pouze internal Docker network, žádný public expose
  • SSH: pouze key-based, port 22 firewall whitelist (Hetzner Cloud Firewall)

7. Tenant isolation

Multi-tenant na úrovni dat (shared DB) + per-tenant Docker container na úrovni sGTM runtime.

  • Postgres row-level: každý dotaz prochází přes Django ORM s explicit tenant=request.tenant filter (audit ORM hooks zachytí pokus bez)
  • sGTM containers: izolovaný Docker container per tenant s CPU/RAM quotami (per-plan); žádný shared filesystem, žádný shared network namespace
  • API klíče: per-tenant scoping vynucený middleware; cross-tenant access vrací 403 + audit log entry
  • Cookies / sessions: cookie name unique per environment; SameSite=Lax + Secure flags

8. Backup a Disaster Recovery

  • Daily pg_dump do lokálního Docker volume (gzip, 02:30 UTC)
  • Offsite kopie do druhého EU regionu (Hetzner) — denně, šifrovaný gpg dump
  • Retention 30 daily + 12 weekly + 6 monthly snapshots
  • Restore drill cílově měsíčně (postupně formalizujeme s prvním Enterprise klientem)
  • RPO/RTO commits: RPO ≤ 24 h (daily snapshot), cílové RTO ≤ 30 min
  • Hetzner snapshot týdně whole-VM (různá recovery vrstva — bare-metal failure)

Detailní DR playbook a runbook scénáře sdílíme pod NDA pro Enterprise.

9. Monitoring a audit log

Real-time platformní monitoring

  • Internal: Django admin /admin/dn/uptime/ s 5min checks na všechny critical services
  • External: BetterStack 3min probes z více EU lokalit (homepage, /health/, /t/_synthetic/)
  • Sentry: error rate alerts (>5 errors/min)

Tenant-facing audit log

  • Per-tenant immutable log: každá auth event, settings change, container deploy, API key create/revoke, faktura paid/cancel
  • Retention: 90 dní (configurable per plan)
  • Exportovatelné jako CSV/JSON přes /dashboard/export/

10. Incident response

  • Detection: Sentry + interní monitoring → email do několika minut od detekce; SMS alerting připojíme po prvním Enterprise klientovi (BetterStack v plánu)
  • Triage: On-call engineer (1 osoba) — first response do 15 min v core hours, 60 min off-hours
  • Containment: Runbook scénáře (DB down, sGTM crash loop, suspected breach) v interní docs/RUNBOOK.md
  • Customer notification (security incident): Email all owners do 24 h, status page update do 30 min, GDPR čl. 33 notifikace do 72 h pokud breach involves osobní údaje
  • Post-incident: Public RCA do 5 pracovních dnů pro incidenty s downtime > 30 min

11. Vulnerability disclosure (VDP)

Bezpečnostní výzkumníci nás kontaktují přes [email protected] (PGP klíč na vyžádání). Safe harbor klauzule v /.well-known/security.txt.

  • Acknowledgment do 48 h
  • Severity assessment + remediation timeline do 7 dní
  • Bug bounty: aktuálně bez programu, ale jsme připraveni řešit qualifying reports individuálně

12. SDLC + dependency management

  • Git monorepo s povinným code review (pull request → main)
  • Automated tests: Django test suite, pytest, Playwright e2e — run na každé PR
  • Dependency scanning: Dependabot (Python + npm) + monthly pip-audit
  • Container scanning: Trivy na build pipeline (každý Docker image)
  • Secrets management: žádné secrets v gitu (pre-commit hook), .env.prod mimo VCS, rotace tokenů 6 měsíců
  • Deploy: atomic swap přes Docker Compose s health-gated cutover (failed health = no swap)

13. Certifikace a compliance status

GDPR✓ Plně compliant. DPA podle čl. 28 ke stažení. RoPA + DPIA na vyžádání.
ePrivacy✓ Server-side tracking respektuje consent signály (Consent Mode v2 forwarding).
ISO 27001⏳ Plánováno Q4 2026. Aktuálně provozujeme dokumentovaný ISMS dle čl. 32 GDPR (interní TOOs).
SOC 2 Type II⏳ Plánováno 2027. Pro klienty co potřebují now: napište — postavíme procesní mapování formálně mimo certifikaci.
Pen-test✓ Last 2026-Q1 (third-party). Redacted report pod NDA na [email protected].

14. Kontakty