Modul 10 · 10.2
Slovenčina
Čo nerobiť
Modul 10: Zostaňte v bezpečí · Čas čítania: 12 minút
Cieľ lekcie: Po tejto lekcii rozpoznáte chyby, ktoré najčastejšie vedú k napadnutému alebo nefunkčnému serveru, dokážete vysvetliť, prečo sú nebezpečné, a viete, čo urobiť namiesto nich.
Kľúčové pojmy: prihlásenie root s heslom, slabé alebo predvolené heslo, otvorená databáza, Docker API na porte 2375, docker.sock v kontajneri, chmod 777, curl | bash, tajomstvá v Gite, administračný panel bez dvojstupňového overenia, firewall "na chvíľu vypnutý", žiadne aktualizácie, žiadna záloha
Prečo lekcia o chybách?
Väčšina serverov nie je napadnutá geniálnym útočníkom s neznámou zraniteľnosťou. Napádajú ich boty, ktoré prechádzajú celý internet a hľadajú známe chyby: heslo, ktoré sa dá uhádnuť, otvorenú databázu, program, ktorému už mesiace chýba aktualizácia. Kto sa vyhne chybám z tejto lekcie, pre tieto boty prestáva byť cieľom. To je najväčšia časť ochrany, ktorú môžete získať.
Pri každej chybe je uvedené, prečo je nebezpečná a čo urobiť namiesto nej. Takmer všetko ste sa naučili v predchádzajúcich lekciách; táto lekcia to zhŕňa na jednom mieste.
1. Prihlásenie root s heslom
Problém. Každý server dostáva celý deň pokusy o prihlásenie na root (lekcia 5.3). Ak sa root môže prihlásiť heslom, je toto heslo jediné, čo stojí medzi botom a úplnou kontrolou. Opakovane používané alebo príliš krátke heslá sa skôr či neskôr uhádnu alebo sú už v uniknutom zozname.
Urobte toto. Prihlasovanie len pomocou kľúčov: PasswordAuthentication no a KbdInteractiveAuthentication no, root nanajvýš s kľúčom (PermitRootLogin prohibit-password) alebo vôbec (no), bežná práca ako obyčajný používateľ so sudo (lekcia 2.2 a 3.2). Zvonku overte, ktoré metódy prihlásenia váš server ponúka (úloha Z2.2).
2. Databáza, cache alebo vyhľadávací klaster otvorený do internetu
Problém. MySQL/MariaDB (3306), PostgreSQL (5432), Redis (6379), Elasticsearch alebo OpenSearch (9200) a MongoDB (27017) sú určené pre dôveryhodné programy v dôveryhodnej sieti. Ak počúvajú na 0.0.0.0 bez firewallu, skenery ich rýchlo nájdu. Redis vo svojej vlastnej dokumentácii uvádza, že nemá byť vystavený internetu a že ktokoľvek s prístupom môže vymazať celú dátovú sadu; pomocou príkazu CONFIG môže útočník dokonca zapisovať súbory na server. Otvorené databázy a vyhľadávacie klastre sú už roky známou príčinou veľkých únikov údajov a správ s požiadavkou na "výkupné" namiesto vašich údajov.
Urobte toto. Nechajte takéto služby počúvať na 127.0.0.1 (lekcia 5.1), držte ich za firewallom (lekcia 5.2) a v Dockeri ich nepublikujte vôbec alebo len na 127.0.0.1 (lekcia 9.3). Ak sa k nim potrebujete dostať zo svojho notebooku: SSH tunel (lekcia 2.3). Overte zvonku (úloha Z5.1).
3. Otvorené Docker API alebo docker.sock v kontajneri
Problém. Kto môže ovládať Docker daemon, je v skutočnosti root na serveri: dokumentácia Dockeru uvádza, že daemon smú ovládať len dôveryhodní používatelia, a prístup k daemonu považuje za rovnocenný prístupu root. Dva varianty tejto chyby:
- Daemon počúva na TCP porte bez TLS (zvyčajne 2375). Ktokoľvek, kto sa k tomuto portu dostane, môže spúšťať kontajnery s pripojeným diskom vášho servera.
- Kontajner dostane
/var/run/docker.sockako volume ("aby mohol sám spravovať kontajnery"). Ak je tento kontajner napadnutý, je preč celý server.
Aj skupina docker je rovnocenná s root (lekcia 9.2): pridávajte do nej len správcov.
Urobte toto. Nechajte Docker pracovať len cez lokálny socket. Vzdialená správa ide cez SSH (docker context s ssh://), alebo ak to naozaj musí byť cez TCP, tak s TLS na porte 2376 a s klientskými certifikátmi. docker.sock pripájajte len do kontajnera, ktorému úplne dôverujete a ktorý ho naozaj potrebuje, a radšej len na čítanie cez obmedzujúcu proxy.
4. chmod 777, aby zmizlo chybové hlásenie
Problém. Pri nahrávaní sa objaví "Permission denied" a fórum radí: chmod -R 777 /var/www. Potom môže každý používateľ a každý proces na serveri zapisovať čokoľvek do vášho webu, aj napadnutý plugin alebo iný účet. Kód, do ktorého môže webový server zapisovať, môže cez zraniteľnosť nahradiť backdoor.
Urobte toto. Zistite, kto potrebuje zapisovať a kam (lekcia 3.1): zvyčajne len používateľ webového servera v jednom priečinku pre nahrávané súbory alebo cache. Kód s iným vlastníkom ako webový server, práva 644/755, nahrávané súbory 750/640 alebo podobne.
5. curl ... | bash a softvér odkiaľkoľvek
Problém. Skript, ktorý bez kontroly spustíte ako root, môže urobiť čokoľvek: pridať zdroje a kľúče, prepísať súbory, otvoriť službu. Aj keď je zámer dobrý, potom neviete, čo sa zmenilo, a pri ďalšom upgrade vydania sa to pokazí (lekcia 4.3).
Urobte toto. Skript si stiahnite a prečítajte. Inštalujte radšej z repozitára balíkov vašej distribúcie alebo z oficiálneho zdroja autora s vlastným kľúčom (Signed-By, lekcia 4.1). Zaznamenajte si, čo inštalujete a prečo.
6. Žiadne aktualizácie alebo aktualizácie "neskôr"
Problém. Zraniteľnosti sa opravia a potom zneužívajú, často v priebehu niekoľkých dní. Server, ktorý mesiace nedostáva aktualizácie alebo beží na vydaní bez podpory, má zoznam známych otvorov. Kontajnery apt neaktualizuje.
Urobte toto. Zapnuté automatické bezpečnostné aktualizácie (lekcia 4.2), pevne stanovený čas na reštart, dátum konca podpory vášho vydania v kalendári (lekcia 4.3) a pravidelná aktualizácia kontajnerov (lekcia 9.4).
7. Žiadna záloha alebo záloha, ktorá nikdy nebola otestovaná
Problém. Snapshot na tom istom úložisku nie je záloha (lekcia 8.1). Záloha uložená priamo na serveri zmizne spolu s ním pri napadnutí alebo ransomvéri. A záloha, ktorá nikdy nebola obnovená, je nádej, nie istota.
Urobte toto. Šifrované zálohy mimo servera (restic, lekcia 8.2), monitorovanie, že prebiehajú, a aspoň raz za štvrťrok test obnovy.
8. Administračné panely otvorené pre všetkých, bez dvojstupňového overenia
Problém. Administračný panel databázy (napríklad phpMyAdmin), Dockeru (napríklad Portainer), vašej aplikácie alebo vášho trezoru hesiel je atraktívny cieľ: jedno heslo dáva prístup ku všetkému. Predvolené heslá ako admin/admin a registrácia, ktorá zostane otvorená (Vaultwarden, lekcia 9.4), to ešte uľahčujú.
Urobte toto. Neotvárajte administračné panely do internetu: pristupujte k nim cez SSH tunel alebo len z pevnej adresy. Ak panel predsa musí byť verejný: https, silné jedinečné heslo zo správcu hesiel, dvojstupňové overenie a zatvorená registrácia. Predvolené heslá vždy zmeňte.
9. Tajomstvá v Gite alebo v súbore compose
Problém. Heslo, API kľúč alebo súkromný kľúč v súbore, ktorý sa dostane do Git repozitára, zostane navždy v histórii, aj keď ho neskôr odstránite. Verejné repozitáre prehľadávajú boty presne kvôli takýmto kľúčom.
Urobte toto. Tajomstvá patria do samostatného súboru s právami 600 (EnvironmentFile, lekcia 6.3; .env pri Docker Compose, lekcia 9.3), ktorý je uvedený v .gitignore. Ak tajomstvo predsa unikne: okamžite ho nahraďte (nové heslo, nový kľúč), samotné upratanie v Gite nestačí.
10. Firewall "na chvíľu" vypnutý, všetko ako root a žiadne poznámky
Problém. "Na chvíľu vypnem firewall, aby som to otestoval" sa zabudne. "Spravím to rýchlo ako root" sa stane zvykom. A server, o ktorom nikto nevie, čo na ňom beží a prečo, sa nedá spravovať ani obnoviť.
Urobte toto. Testujte s dočasným, úzkym pravidlom (jeden port, jedna zdrojová adresa) a potom ho odstráňte. Pracujte ako obyčajný používateľ so sudo. Veďte si krátku dokumentáciu servera: čo beží, ktoré porty sú otvorené, kde sú zálohy, kedy končí podpora vydania (lekcia 10.4).
V praxi
Všetky tieto chyby sa dajú urobiť na každom VPS, vo WebOké rovnako ako u iných poskytovateľov: to, čo sa deje vo vašom serveri, spravujete sami. Poskytovateľ však môže server odpojiť zo siete, ak rozosiela spam alebo vykonáva útoky, pretože to zasahuje ostatných zákazníkov. Prevencia je teda dôležitá aj pre vašu vlastnú dostupnosť.
Zhrnutie
- Väčšina útokov využíva známe chyby, nie neznáme zraniteľnosti.
- Prihlasovanie kľúčmi, prihlasovanie heslom vypnuté; databázy, cache a Docker API nikdy otvorené do internetu; žiadny
docker.sockv kontajneroch, ktorým úplne nedôverujete. - Žiadne
chmod 777a žiadnecurl | bash: vedzte, kto čo smie a čo inštalujete. - Automatické aktualizácie, zálohy mimo servera a otestované, administračné panely za tunelom alebo s dvojstupňovým overením.
- Tajomstvá mimo Gitu a mimo súborov compose; čo uniklo, treba nahradiť.
Kvíz
Úloha
Úloha Z10.2: O akú chybu ide? V ukážkovom súbore casussen-z10-2.md je osem krátkych prípadov serverov, s ktorými niečo nie je v poriadku. Pri každom prípade vyberte zo zoznamu tejto lekcie (A až J), o akú chybu ide a aký je najlepší prvý krok. Program porovná vaše odpovede s pevným kľúčom a potom pri každom prípade zobrazí vysvetlenie.
Ďalšie čítanie
- Zabezpečenie VPS: prvých päť minút
- Správca hesiel a prístupové kľúče (passkeys): takto si bezpečne zabezpečíte prihlasovanie
- Dokumentácia Dockeru, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dokumentácia Dockeru, Protect the Docker daemon socket: https://docs.docker.com/engine/security/protect-access/
- Redis, Security: https://redis.io/docs/latest/operate/oss_and_stack/management/security/
