Bezpečnost
NemotiQ Rent drží čísla dokladů a adresy nájemníků. Údaje, které lidé nesvěřují jen tak. Tahle stránka popisuje, co s nimi konkrétně děláme. Není to seznam přání: každé tvrzení níže odpovídá kódu, který si můžete nechat ověřit, a hlídá to automatická kontrola při každém sestavení.
1. Šifrování
Citlivé údaje nájemníka, tedy číslo dokladu, adresa, trvalé bydliště a výplatní účet, se ukládají šifrované algoritmem AES-256-GCM, pole po poli. Šifruje a dešifruje se transparentně na úrovni databázové vrstvy, takže se nešifrovaná hodnota nemůže omylem dostat do dotazu ani do vygenerovaného dokumentu. Klíč žije mimo databázi, v proměnných prostředí, a při startu se ověřuje. Přenos je vždy přes TLS a doména je zapsaná na seznamu HSTS preload.
2. Přihlášení a oprávnění
Hesla se ukládají jako bcrypt hash. Po pěti neúspěšných pokusech se účet postupně zamyká (1, 5, 15 a 60 minut, pak na 24 hodin) a nezávisle na tom platí strop 10 pokusů za 15 minut na jednu IP adresu. Neznámý e-mail spotřebuje stejný čas jako špatné heslo, takže z doby odpovědi nelze zjistit, jestli účet existuje. Relace nese číslo verze: změna hesla, zásah administrátora nebo odebrání člena týmu ho zvýší a všechna otevřená přihlášení tím okamžitě padnou. Citlivé administrátorské úkony vyžadují zadání hesla znovu, i když jste přihlášeni.
3. Omezení četnosti
Přihlášení má strop deset pokusů za patnáct minut na IP adresu, nezávisle na uzamčení účtu. Strop má i všechno, co stojí peníze nebo píše někomu jinému: odeslání upomínky nájemníkovi, pozvánka do portálu, prověření nájemce, odeslání smlouvy k podpisu. Klíčem je příjemce, ne odesílatel, jinak by jeden účet mohl zasypat jednoho nájemníka upomínkami a zůstat pod svým limitem. V produkci počítadlo drží Upstash Redis, aby platilo napříč všemi instancemi aplikace, ne jen v paměti jedné z nich.
4. Oddělení dat mezi účty
Každý záznam nese vlastníka a každý dotaz je na vlastníka vázán už v aplikační vrstvě. Požadavek na cizí záznam nekončí prázdnou odpovědí, ale odmítnutím. Jako druhá vrstva je v databázi zapnuté Row Level Security v režimu „vše zakázáno“ a rolím, které používá případný externí klient, jsou odebrána práva: uniklý klíč tak nepřečte nic.
5. Nájemnický portál
Nájemník se do portálu dostane odkazem z e-mailu a nezakládá si účet ani heslo. Odkaz nese podepsaný token s omezenou platností, uložený jako httpOnly cookie. Token jde kdykoli zneplatnit. Pronajímatel tím okamžitě uzavře přístup, aniž by musel cokoli mazat. Portál vidí jen to, co se týká konkrétního nájmu; interní poznámky, náklady ani ostatní jednotky se do něj nedostanou.
6. Zabezpečení prohlížeče
Každá odpověď nese Content Security Policy s nonce generovaným pro každý požadavek, takže vložený cizí skript se nespustí. K tomu HSTS, zákaz vkládání do rámu, zákaz odhadování typu obsahu, omezená Referrer-Policy a Permissions-Policy, která vypíná kameru, mikrofon i geolokaci. Nahrávat lze jen rastrové obrázky a PDF a typ se ověřuje podle skutečného obsahu souboru, ne podle toho, co tvrdí prohlížeč; SVG je odmítnuto. Uložené soubory se servírují ke stažení nebo se zúženým typem, nikdy tak, aby se mohly spustit.
7. Příchozí volání a joby
Každý webhook se ověřuje podpisem dřív, než se jeho obsah vůbec přečte. Platby přes podpis Stripe, e-podpis přes HMAC, příchozí e-maily přes sdílené tajemství porovnávané v konstantním čase a navíc přes výsledek DMARC a SPF. Bankovní výpis, který přišel e-mailem, se nikdy neaplikuje sám: bez shody čísla účtu jde do ruční fronty. Plánované úlohy jsou chráněné tajemstvím a jsou idempotentní, takže opakované spuštění nic nezduplikuje.
8. Auditní záznam
Každá změna dat se zapisuje do auditního záznamu, který se jen doplňuje a nemaže. Osobní údaje se do něj nedostanou: hodnoty se před zápisem filtrují podle názvu pole, takže e-mail, telefon, číslo dokladu ani číslo účtu v logu nikdy nejsou. Totéž platí pro hlášení chyb. Ta se před odesláním čistí od identifikátorů, cookies i autorizačních hlaviček.
9. Osobní údaje a jejich výmaz
Export svých dat si stáhnete sami, kdykoli. Výmaz účtu je dvoukrokový: potvrzuje se odkazem zaslaným na adresu účtu a samotné potvrzení je akce tlačítkem, ne otevření odkazu. Mazat se nesmí dát prokliknutím z e-mailového skeneru. Výmaz nevyčistí jen váš účet: vyčistí i údaje nájemníků a vlastníků nemovitostí, jejichž údaje jste v aplikaci vedli, zruší předplatné a zastaví automatické zprávy. Účetní kostra, kterou musíme podle zákona uchovat, zůstává, ale ukazuje na řádek, který už nikoho nejmenuje.
10. Zálohy a obnova
Databáze běží u poskytovatele spravovaného Postgresu v EU. Obnovu dat ze zálohy vám ale negarantujeme. Zálohování je u toho poskytovatele vlastností placeného tarifu a my se k němu zatím nezavazujeme; dokud tady stojí tahle věta, neopírejte se o to, že se data dají vrátit k nějakému staršímu dni. Point-in-time recovery zapnuté nemáme. Objektové úložiště, kde leží nahrané soubory, verzování objektů nenabízí, takže přepsaný soubor by se z něj nevrátil; nahrávané soubory proto ukládáme pod klíč s náhodným identifikátorem, aby je běžný provoz nepřepisoval. Na dočasný disk serverless funkce se v produkci nezapisuje vůbec. Aplikace takový zápis odmítne, místo aby soubor tiše ztratila. Šifrovací klíč je uložený mimo aplikaci i mimo jakoukoli zálohu, protože data a klíč ke stejným datům nepatří na jedno místo.
11. Dodavatelé a infrastruktura
Aplikace i databáze běží v Evropské unii. Úplný a aktuální seznam zpracovatelů, tedy kdo, na co, jaké údaje a kam se předávají, je veřejný a je součástí smluvní dokumentace, ne marketingu.
12. Hlášení zranitelností
Našli jste chybu? Napište na info@nemotiq.cz. Kontakt je zveřejněn i strojově čitelně podle RFC 9116 na /.well-known/security.txt. Nálezy vítáme, odpovídáme na ně a nebudeme podnikat kroky proti tomu, kdo nález nahlásí v dobré víře, nezneužije cizí data a dá nám přiměřený čas na opravu.