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. 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. 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. 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. 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á se | Příklady záznamů |
|---|---|
| Práce s případem | STATUS_CHANGED, CASE_ASSIGNED, ASSESSMENT_EXTENDED, HANDLER_MESSAGE_ADDED, INTERNAL_NOTE_ADDED |
| Citlivé zobrazení | IDENTITY_VIEWED, ATTACHMENT_DOWNLOADED, CASE_EXPORTED, DATA_EXPORTED |
| Přístupy | LOGIN_PASSWORD_OK, CASE_ACCESSED_BY_REPORTER |
| Správa týmu | MEMBER_CREATED, MEMBER_ADDED, MEMBER_REMOVED, PRODUCTION_UPDATED |
| Přílohy | ATTACHMENT_UPLOADED, ATTACHMENT_REJECTED_MALWARE, ATTACHMENT_SCAN_UNAVAILABLE |
| Automatické úlohy | CRON_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.