# Bezpečnostní audit: návod pro AI agenta > Zdroj: https://ongy.cz/pages/server/audit/ > Autor: Ongy (ongy.cz). Checklist v pěti krocích, který jsem si prošel po přidání VPN: co poslouchá do internetu, kdo se dostane dovnitř, co odchází ven, účty a aktualizace. Tři věci vypnuté, jedno riziko zůstalo. ## Pro agenta Pomoz uživateli postavit vlastní verzi tohohle projektu. Nejdřív se ho zeptej na vybavení a na to, co z požadavků už má. Pak postupuj po krocích a po každém kroku s ním ověř, že funguje, než půjdeš dál. Hodnoty v `` doplň s uživatelem, nikdy si nevymýšlej adresy, hesla ani tokeny. Kód autora není veřejný: tohle je popis řešení, ne repozitář ke stažení. ## Cíl Zapsaný bezpečnostní audit domácí sítě a serveru v pěti oblastech: co poslouchá do internetu, kdo se dostane dovnitř, co odchází ven, účty s dvoufázovým ověřením a aktualizace. Výsledkem je seznam nálezů s rozhodnutím u každého (vypnout, omezit, vědomě ponechat), ověřený po restartu, a uložený stav, proti kterému se další audit dělá jako rozdíl. ## K čemu to je Tohle není návod na můj server. Je to pět otázek, které si můžeš položit doma, i když máš jen router a pár chytrých krabiček. Odpovědi najdeš v nastavení routeru a v účtech, které máš dávno založené. Kdy? Poprvé hned, pak po každé větší změně: nové zařízení s přístupem zvenku, nová služba, nový router. A jednou za půl roku bez důvodu, protože „vypnuté“ má sklon se samo zase zapnout. ## Proč právě takhle Nejdřív jsem postavil VPN, aby se telefon dostal k domácím službám odkudkoliv. Pak jsem přes ni pustil i celou domácí síť. Každé takové zjednodušení je zároveň nová cesta dovnitř. Chtěl jsem vědět, kolik těch cest je, kdo po nich může jít a jestli by mi ztráta telefonu otevřela celý byt. ## Jak to funguje - **Co poslouchá do internetu.** Vypíšu vše, co čeká na spojení, a ptám se, na jaké adrese. Pro veřejnou adresu je správná odpověď: nic. Web jde ven tunelem, který spojení navazuje zevnitř. - **Kdo se dostane dovnitř.** Rozhraní pro správu jen přes VPN. SSH jen klíčem a jen na VPN adrese. Router: vzdálená správa, UPnP a WPS vypnuté. - **Co odchází ven.** Vlastní DNS vidí každý dotaz z domácnosti. Když něco mluví s neznámým serverem, uvidím to tady první. - **Účty a dvoufázové ověření.** Hlavní účet, správa VPN, doména, router. Všude 2FA. Účet je dnes větší díra než port. - **Aktualizace.** Kontejnery se aktualizují samy, s výjimkou DNS, u kterého chci každou změnu vidět. Systém a router ručně, ale pravidelně. ## Jak jsem kontroloval - **Co poslouchá:** Výpis naslouchajících soketů systémovou utilitou, seřazený podle adresy. Cokoliv s „všechny adresy“ musí mít důvod, nebo jde pryč. - **Firewall:** Stav firewallu a výchozí politika pro příchozí spojení: zamítnout. Výjimky jen pro to, co potřebuje domácnost. - **Tunel:** Konfigurace tunelu: seznam veřejných jmen a kam vedou. Hledal jsem cokoliv, co vypadá jako správa, a nenašel. - **VPN:** Stav VPN klienta: výstupní uzel, sdílení služeb ven, přijímání cizích tras, expirace klíčů. Plus pravidla, které zařízení smí do domácí sítě. ## Otevřené body Automatické aktualizace kontejnerů běží v univerzálním čase, takže se spouštějí o dvě hodiny jindy, než si myslím. Buď nastavím časovou zónu, nebo u jedné služby zafixuju verzi místo „vždy nejnovější“. A v Home Assistantu zbývá jedna volba, která dovoluje vzdálený přístup znovu zapnout z aplikace. Vypnout, aby „vypnuto“ platilo i tam. ## Co budeš potřebovat - Přístup do administrace routeru. - Pokud je doma server: přístup přes `sudo`, nástroj `ss` (balík iproute2), firewall (`ufw` nebo nftables) a volitelně `nmap` (autor: Kubuntu, Docker). - Připojení mimo domácí síť pro test zvenku, stačí telefon na mobilních datech. - Seznam účtů, na kterých domácnost stojí: hlavní účet (e-mail, přihlášení do VPN), správa VPN, registrátor domény a DNS, router, cloud chytré domácnosti. - Volitelně VPN (autor: Tailscale), tunel pro weby bez otevřených portů (autor: Cloudflare Tunnel) a vlastní DNS s logem dotazů (autor: AdGuard Home). - Jeden večer na první průchod a soubor, kam se zapisuje stav. ## Postup ### 1. Co poslouchá na serveru `sudo ss -ltnup` (TCP i UDP, s procesy). Každý řádek zařaď podle adresy: `127.0.0.1` jen pro server, adresa v LAN, adresa VPN, nebo `0.0.0.0` a `[::]` čili všechny adresy. U Dockeru navíc `docker ps --format '{{.Names}}\t{{.Ports}}'`: položka `0.0.0.0:` je publikovaná všude. Ke každé položce na všech adresách napiš důvod. Bez důvodu jde pryč, nebo se přesune na konkrétní adresu (v compose `"::"`). Rozhraní pro správu patří jen na VPN adresu. ### 2. Firewall serveru `sudo ufw status verbose`: výchozí politika pro příchozí `deny`, výjimky jen pro rozhraní VPN a pro to, co potřebuje domácnost v LAN (DNS, sdílení médií). Porovnej výjimky s výpisem z prvního kroku: každá výjimka má odpovídat službě, která opravdu běží, a nic navíc. ### 3. Router a pohled zvenku V administraci routeru zkontroluj: přesměrování portů prázdné (nebo jen vědomé výjimky), UPnP vypnuté, vzdálená správa z internetu vypnutá, WPS vypnuté, Wi-Fi na WPA3 nebo WPA2/WPA3, firmware aktuální. Pak z telefonu na mobilních datech nebo z jiné sítě: `nmap -Pn ` (případně online skener portů) nesmí najít nic otevřeného. Pokud síť má IPv6, ověř i firewall routeru pro IPv6, tam zařízení nechrání NAT. ### 4. Tunel a weby Pokud weby jdou ven tunelem, projdi seznam veřejných jmen v konfiguraci tunelu (u Cloudflare: Zero Trust, Networks, Tunnels, veřejná jména) a u každého zapiš, kam vede. Nic nesmí vést na správu (Docker GUI, monitoring, router, Home Assistant). Co přes tunel být musí, zamkni přihlášením (Cloudflare Access). Zkontroluj, že web nevydává skryté soubory: `curl -s -o /dev/null -w '%{http_code}' https:///.env`, stejně `/.git/config` a `/README.md`, čekej 404. ### 5. SSH a VPN `sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin|listenaddress)'`: hesla `no`, root `no`, naslouchání jen na VPN adrese. `last -a | head` ukáže, odkud se kdo přihlašoval. U Tailscale: `tailscale status` (žádné neznámé ani mrtvé stroje), `tailscale serve status` a `tailscale funnel status` (nic nesdílí ven), v `tailscale debug prefs` hodnoty `RouteAll` a `ExitNodeID` (server cizí trasy nepřijímá, žádný výstupní uzel). V administraci: pravidla přístupu (kdo smí do domácí sítě přes subnet router), expirace klíčů, staré stroje smazat. ### 6. Desktopové služby a autostart Na počítačích, které jsou pořád v síti (i server s desktopem), hledej v `ss` aplikace pro sdílení souborů, párování s telefonem nebo vzdálenou plochu, které poslouchají na všech adresách. Co se nepoužívá, ukonči a odeber z autostartu: `ls ~/.config/autostart /etc/xdg/autostart`, `systemctl --user list-unit-files --state=enabled`, `systemctl list-unit-files --state=enabled`. Stejně u cloudových vzdálených přístupů, které nahradila VPN (autor: cloud přístup k Home Assistantu), včetně volby, která je dovoluje znovu zapnout z aplikace. Pak restartuj a `ss` spusť znovu. ### 7. Co odchází ven V logu vlastního DNS (AdGuard Home, Pi-hole) projdi za poslední týden nejaktivnější klienty a domény. U každého zařízení hledej domény, které neumíš přiřadit k výrobci nebo službě, a zařízení, které se ptá nezvykle často. Nález nejdřív dohledej (výrobce, integrace, telemetrie systému), až potom blokuj. Bez vlastního DNS aspoň seznam připojených klientů v routeru: každé zařízení musí jít pojmenovat. ### 8. Účty, 2FA a fyzický přístup Pro každý účet ze seznamu ověř dvoufázové ověření (aplikace nebo klíč, ne SMS, kde to jde), záložní kódy uložené mimo telefon a že obnova hesla jde na adresu, kterou ovládáš. Hlavní účet, kterým se přihlašuješ do VPN, má nejvyšší prioritu: jeho ztráta otevře celou síť. Na telefonu a počítači s přístupem domů zámek obrazovky a krátký čas do uzamčení. Sepiš postup pro ztracené zařízení: kde ho v konzoli VPN odebrat a které relace odhlásit. ### 9. Aktualizace a zápis stavu Systém: `apt list --upgradable`, `systemctl status unattended-upgrades`, existence `/var/run/reboot-required`. Kontejnery: které se aktualizují automaticky, kdy (v jakém časovém pásmu) a které záměrně ne. Router: verze firmwaru. Nakonec ulož stav do souboru s datem: výstup `ss -ltnup`, seznam výjimek firewallu, veřejná jména tunelu, zařízení ve VPN, vypnuté věci s důvodem a zbývající rizika. Příští audit začni `diff` proti tomuto souboru a opakuj ho po každé větší změně a jednou za půl roku. ## Na co si dát pozor - Docker publikuje porty přímo přes iptables, mimo pravidla UFW. `ufw status` hlásí deny a kontejner s `-p 8080:8080` je přesto dostupný z celé sítě. Rozhoduje výpis `ss` a `docker ps`, ne firewall. - `ss` bez `sudo` neukáže procesy a bez `-u` neukáže UDP. DNS, mDNS i WireGuard port VPN jsou UDP. mDNS a port VPN na všech adresách jsou normální, zbytek chce důvod. - Test zevnitř domácí sítě neříká nic o internetu. Skenuj z mobilních dat nebo jiné sítě, jinak uvidíš porty otevřené pro LAN a přehlédneš přesměrování na routeru. - „Vypnuto“ musí přežít restart. U autora měly dvě ze tří vypnutých služeb autostart a po restartu by byly zpátky. Hotovo je až po ověření `ss` po restartu. - Soubory s tokeny čitelné pro všechny: `find -name '*.env' -perm -o=r` a podobně konfigurace s tokeny pro notifikace. `chmod 600` může rozbít démona, který běží pod jiným uživatelem. Pak mu dej čtení přes `setfacl -m u::r `, ne zpátky práva pro všechny. - Vypnutá expirace klíčů ve VPN je pohodlná, ale ztracené zařízení zůstane v síti, dokud ho ručně neodebereš. Bez sepsaného postupu se na to v panice zapomene. - Subnet router ve VPN s výchozím pravidlem „vše povoleno“ pustí do celé domácí sítě každé zařízení v tailnetu. Omez přístup do LAN jen na konkrétní zařízení a nové zařízení přidávej vědomě. - Na Windows ověř dostupnost portu i přes VPN rozhraní, ne jen z LAN. Provoz přes adaptér VPN se nemusí řídit stejnými pravidly a profilem sítě jako LAN. ## Jak ověřit, že to funguje - [ ] `sudo ss -ltnup`: každý řádek na `0.0.0.0` nebo `[::]` má v zápisu důvod, rozhraní pro správu jsou jen na VPN adrese nebo `127.0.0.1`. - [ ] `docker ps --format '{{.Names}}\t{{.Ports}}'` neukazuje `0.0.0.0:` u žádné správy. - [ ] `sudo ufw status verbose` obsahuje `Default: deny (incoming)` a výjimky odpovídají běžícím službám. - [ ] `nmap -Pn ` z mobilních dat nenajde žádný otevřený port (autor: 0 veřejných portů). - [ ] Router: přesměrování portů prázdné, UPnP, vzdálená správa a WPS vypnuté, firmware aktuální. - [ ] `sudo sshd -T` vrací `passwordauthentication no`, `permitrootlogin no` a `listenaddress` jen na VPN adrese. - [ ] `tailscale serve status` a `tailscale funnel status` nic nesdílí, `tailscale status` neobsahuje neznámé ani mrtvé stroje. - [ ] `curl -s -o /dev/null -w '%{http_code}' https:///.env` a `/.git/config` vrací 404. - [ ] Po restartu serveru i počítačů nejsou vypnuté služby znovu ve výpisu `ss`. - [ ] Všechny účty ze seznamu mají zapnuté 2FA a záložní kódy uložené mimo telefon, stav je zapsaný v souboru s datem. ## Přizpůsobení - Jen router a chytrá zařízení, bez serveru: vynech kroky se serverem a SSH, zbývá router a pohled zvenku, seznam zařízení v routeru, vzdálené přístupy v cloudových aplikacích, účty a firmware. - Windows: poslouchající porty přes `Get-NetTCPConnection -State Listen | Sort-Object LocalAddress` (proces podle `OwningProcess`) nebo `netstat -abno` jako správce, firewall přes `Get-NetFirewallProfile`, autostart ve Správci úloh na kartě Po spuštění. - macOS: `sudo lsof -nP -iTCP -sTCP:LISTEN` a `lsof -nP -iUDP`, sdílení v Nastavení systému, Obecné, Sdílení, přihlašovací položky ve stejné sekci Obecné. - VPN přímo na routeru (WireGuard) místo Tailscale: jeden přesměrovaný UDP port je v pořádku, ověř ale, že je jediný a že klienti VPN smí jen tam, kam mají. --- Stránka projektu s fotkami a diagramem: https://ongy.cz/pages/server/audit/