Docker bez zbytečných chyb: co zničí izolaci kontejneru

From BloomWiki
Jump to navigation Jump to search

Účinná obrana stojí na několika vrstvách. Minimální databázový účet pro aplikaci nemá práva ke schématu, nemůže mazat tabulky ani měnit uživatele. Všechny vstupy se validují na očekávaný formát — číslo, datum, e-mail — a teprve potom se předají databázi. Výjimky se logují na server, ale uživateli se zobrazí obecná zpráva. Pomáhá také omezení počtu dotazů za čas, protože automatizované útoky jsou rychlé a opakované.

Filtrování navrhujte jako sadu pojmenovaných parametrů, ne jako univerzální jazyk. ?status=active&created_after=2024-01-01 je čitelné, testovatelné a snadno se mapuje na indexy. Vyhněte se parametru typu ?q=status:active AND price>100, pokud k tomu nemáte skutečný důvod – otevíráte tím cestu k injekcím a neplánovaným full scanům. U každého filtru si předem napište, který index ho pokryje. Pokud filtr kombinuje více sloupců, zvažte složený index v pořadí, v jakém se podmínky skutečně používají.

Poslední častá chyba je bezpečnost. Kontejner běží jako root, pokud ho nepřepneš na jiného uživatele. Přidej USER a nevystavuj zbytečné nástroje. Image stavěj z konkrétních tagů, ne z latest. latest se může změnit a rozbít build. Také neukládej tajemství do image. Použij proměnné prostředí nebo secrets. Docker není magie, jen izolace. Kdo to pochopí, vyhne se většině problémů.

Nezapomínejte, že responzivita není jen o šířce. Grid i Flexbox umí pracovat s logickými vlastnostmi jako gap, které nahrazuje staré okraje a výrazně zjednodušuje mezery. Používejte gap místo margin u potomků, předejdete tím poslednímu prvku v řadě s nežádoucím odsazením. A hlavně testujte v prohlížeči, ne jen v návrhovém nástroji: zkuste zúžit okno, přepnout na tmavý režim a simulovat zvětšené písmo. Právě tam se chyby v rozložení projeví nejdřív.

Kontrola by měla být součástí vývoje, ne jednorázová akce. Při code review se cíleně hledají místa, kde se dotaz skládá z řetězců, a každý takový výskyt se buď přepíše na parametrizovaný dotaz, nebo se pro něj zavede bezpečný whitelist. Testovací sada má obsahovat i vstupy s apostrofem, středníkem a komentářovou sekvencí. Když se aplikace zachová stejně jako u běžného textu, ochrana pravděpodobně drží.

Základní pravidlo zní: data nikdy nejsou součástí SQL příkazu, ale parametrem. V praxi to znamená používat prepared statements neboli parametrizované dotazy. V Javě jde o PreparedStatement, v PHP o PDO s placeholdery, v Pythonu o parametrizované volání kurzoru. Hodnota se předává zvlášť a databázový stroj ji nikdy nevyhodnotí jako SQL kód. Pokud se v kódu objeví zřetězení typu „SELECT … WHERE jmeno = '" + vstup + "'", je to signál, že ochrana chybí.

Nakonec počítejte s opakovaným spouštěním. Úloha na pozadí může selhat a být znovu zařazena, což v testu vytvoří duplicitní záznamy. Ověřte, že zpracování je idempotentní, a do testů přidejte scénář, kdy stejná úloha dorazí dvakrát. Právě tam se nejčastěji projeví chybějící zámek nebo nevhodně navržený klíč.

Kontejnerizace s Dockerem vypadá jednoduše: napíšeš Dockerfile, spustíš build a aplikace běží. Většina začátečníků ale skončí u prvního problému, protože nepochopí, jak Docker skutečně funguje. Kontejner není virtuální stroj. Je to izolovaný proces na hostitelském jádru. Z toho plyne první pravidlo: v kontejneru neběží init systém, žádný systemd, žádné trvalé služby. Proces, který spustíš, musí zůstat v popředí. Jakmile skončí, kontejner skončí taky.

Nejčastější chyba, která vede k SQL injection, není technologická, ale myšlenková: programátor předpokládá, že vstup z formuláře je „nějaká hodnota", a ne „cizí kód". Když se tento předpoklad vloží do dotazu přes přímé skládání řetězců, útočník může změnit logiku dotazu, přečíst cizí data, přepsat je nebo smazat. Přitom stačí jedna nechráněná kolonka — třeba vyhledávací pole, přihlašovací formulář nebo filtr v administraci.

Typické chyby: ukládání celého API response včetně metadat, duplikování stejných dat na více místech, normalizace přes kopírování polí, která se pak musí ručně synchronizovat, a předávání dispatch přes mnoho vrstev props. Další častá chyba je příliš mnoho akcí pro jednu operaci. Sloučení do jedné akce se dvěma až třemi typy stavu (načítání, úspěch, chyba) výrazně zjednoduší reducer i testy.

SQL injection není problém databáze, ale způsobu, jakým s ní aplikace mluví. Kdo oddělí kód od dat, omezí práva účtu a nebude ukazovat chyby, tomu se útok přes vstupní pole výrazně ztíží. Zbytek je pravidelná kontrola a ochota opravit i starý kód, který „nějak funguje".