Kapitola 8 z 13

Bezpečnost a anonymita

Šifrování identity, hashované kódy, čištění metadat, auditní log a ochrana proti zneužití.

Pro technicky založené čtenáře, právníky a každého, kdo se ptá „a je to fakt bezpečné?“.

Anonymita v SafeHouseCrew není postavená na slibu v obchodních podmínkách, ale na tom, že citlivé údaje v systému buď vůbec nevzniknou, nebo vzniknou jen zašifrované. Tato kapitola popisuje konkrétní mechanismy.

Co se vůbec neukládá

Nejsilnější ochrana je neexistující záznam.

  • IP adresa oznamovatele — nikde, ani v aplikačním logu, ani jako součást rate limitu.
  • Otisk prohlížeče, rozlišení, user-agent — aplikace je nesbírá.
  • Analytika a reklamní skripty — na stránkách nejsou žádné, ani vlastní.
  • Cookies třetích stran — žádné. Systém používá jen tři vlastní: jazyk, motiv a přihlášení do administrace.
  • Přesný čas podání pro řešitele — ukládá se pro výpočet lhůt, ale zobrazuje se zaokrouhlený na půlden.

Šifrování a hashování

Co je zašifrované, co hashované a proč zrovna takhle.

Identita oznamovatele
AES-256-GCM. Rozšifruje se výhradně při vědomé akci příslušné osoby. V databázi je jen nečitelný blok dat.
Bezpečnostní kód
scrypt hash. Ověřuje se porovnáním v konstantním čase, takže ani rychlost odpovědi neprozradí, kolik znaků sedělo.
Hesla členů týmu
scrypt hash, stejný princip.
Tajemství 2FA
AES-256-GCM, stejným klíčem jako identita.
Přílohy
AES-256-GCM. Šifruje aplikace ještě před zápisem — do úložiště (disk nebo S3) putuje výhradně zašifrovaný obsah.
Relace administrace
Cookie nese token, v databázi je jen jeho SHA-256 otisk.

Co se stane s přílohou po nahrání

Čtyři kroky mezi tlačítkem a uložením.

  1. 1. Kontrola typu a velikosti

    Whitelist povolených přípon, kontrola magických bajtů na začátku souboru a limit 50 MB. Přejmenovaný soubor neprojde — přípona musí odpovídat skutečnému obsahu.

  2. 2. Antivirová kontrola

    Obsah projde antivirem. Nakažený soubor se odmítne a zapíše se ATTACHMENT_REJECTED_MALWARE. Když antivirus neodpoví, nahrání selže s chybou 503 — nikdy se neuloží nezkontrolovaný soubor.

  3. 3. Odstranění metadat

    U JPEG a PNG se odstraní EXIF včetně GPS souřadnic, času pořízení a jména autora či zařízení.

  4. 4. Zašifrování a uložení

    Až pak se soubor zašifruje a uloží. Stahuje se přes kontrolovaný endpoint, který ověří oprávnění a zapíše ATTACHMENT_DOWNLOADED — soubory nemají veřejnou adresu, kterou by šlo přeposlat.

Auditní log

Nepřepisovatelná stopa citlivých akcí.

Auditní log je append-only — aplikace do něj pouze přidává a nikdy nemaže ani neupravuje. Slouží k doložení, že produkce se systémem zachází podle zákona, a je určený i pro kontrolu z ministerstva.

Zaznamenává sePříklady záznamů
Práce s případemSTATUS_CHANGED, CASE_ASSIGNED, ASSESSMENT_EXTENDED, HANDLER_MESSAGE_ADDED, INTERNAL_NOTE_ADDED
Citlivé zobrazeníIDENTITY_VIEWED, ATTACHMENT_DOWNLOADED, CASE_EXPORTED, DATA_EXPORTED
PřístupyLOGIN_PASSWORD_OK, CASE_ACCESSED_BY_REPORTER
Správa týmuMEMBER_CREATED, MEMBER_ADDED, MEMBER_REMOVED, PRODUCTION_UPDATED
PřílohyATTACHMENT_UPLOADED, ATTACHMENT_REJECTED_MALWARE, ATTACHMENT_SCAN_UNAVAILABLE
Automatické úlohyCRON_DEADLINES_RUN, CRON_RETENTION_RUN, CRON_SUBSCRIPTION_RUN, CRON_DIGEST_RUN

Ochrana proti zneužití formuláře

Jak se brání systém, který nesmí znát IP adresu.

Běžná obrana proti zahlcení formuláře stojí na IP adrese nebo na captchi třetí strany. SafeHouseCrew nemůže použít ani jedno — IP by byla stopa a captcha by odeslala data cizí službě. Používá proto proof-of-work.

  • Před odesláním musí prohlížeč vyřešit výpočetní úlohu; pro jednoho člověka je to okamžik, pro tisíce automatických odeslání je to drahé.
  • Úloha je podepsaná serverem a bezstavová — server si mezi vydáním a ověřením nic neukládá.
  • Platnost úlohy je 5 minut a jedno řešení jde použít jen jednou.
  • Nad tím běží ještě globální limit počtu oznámení za minutu, který není vázaný na osobu.

Oddělení dat mezi produkcemi

Dvě nezávislé vrstvy, aby chyba v jedné nestačila.

  • Vrstva aplikace: každý dotaz na případy se skládá z pravidla odvozeného z role, takže cizí data se do výsledku nedostanou.
  • Vrstva databáze: zapnuté zabezpečení na úrovni řádků (RLS), které oddělení vynucuje ještě jednou přímo v databázi.