Stručně: Odchozí spojení serveru zkontrolujete pomocí ss -tunap nebo lsof -i, které každé spojení přiřadí k procesu. Normální jsou spojení s databází, poštovním serverem, aktualizačními servery a známými rozhraními. Spojení procesů PHP nebo webového serveru na neznámé cíle, neobvyklé porty a trvalá spojení bez příčiny jsou varovnými signály dálkového ovládání nebo odlivu dat. Trvale pomáhá filtrování odchozího provozu, které povoluje jen potřebné cíle.
Proč pohled ven tolik prozradí
Při hledání průniku se většina dívá na soubory. Útočník ale chce se svým přístupem něco podniknout: stáhnout nástroje, přijímat příkazy, dostat ven data nebo využít server pro spam či útoky na jiné. To vše vyžaduje spojení směrem ven.
Webový server sám od sebe naváže jen málo spojení a většina z nich je předvídatelná: dotazuje databázi, předává poštu, volá platební nebo přepravní rozhraní a stahuje aktualizace. Cizí spojení tu proto zvlášť vyniknou. Podle zpráv, které máme k dispozici, patří odchozí spojení k obecným varovným signálům po průniku; potvrzené indikátory kompromitace (Indicators of Compromise) speciálně pro PHP2Shell neexistují. Další příznaky shrnuje článek Jsem už kompromitován?.
Odchozí spojení vypsat a přiřadit procesům
Následující příkazy jen čtou. Spouštějte je jako root, jinak chybí údaje o procesech.
# Všechna navázaná spojení TCP s procesem
ss -tnp state established
# TCP a UDP včetně naslouchajících služeb
ss -tunap
# Spojení podle programu a uživatele, bez překladu jmen
lsof -i -n -P | grep -v LISTEN
# Jen spojení procesů uživatelů webového serveru
lsof -i -n -P -u www-data 2>/dev/null
Ve výstupu dávejte pozor na tři sloupce: proces, cílovou adresu s portem a uživatele. Spojení php-fpm s databází na portu 3306 je normální. Spojení programu s neznámým názvem z /tmp na cizí adresu na neobvyklém portu normální není. Pod jakým uživatelem PHP běží, závisí na distribuci a panelu.
Normální, nebo podezřelé? Zařazení
| Pozorování | Spíše normální | Spíše podezřelé |
|---|---|---|
| Cíl | vlastní databáze, poštovní server, známá API, aktualizační servery | neznámé adresy bez vztahu k aplikaci |
| Proces | php-fpm, webový server, poštovní a aktualizační služby | neznámé programy, procesy z /tmp nebo /dev/shm |
| Port | 443, 3306, 5432, 587 | neobvyklé vysoké porty, porty typické pro IRC |
| Délka | krátká, odpovídá požadavkům | trvale otevřené, i v noci bez návštěvníků |
| Množství | malé a rovnoměrné | náhlé špičky odchozího objemu dat |
| Poštovní provoz | odesílání přes určený poštovní server | mnoho přímých spojení na portu 25 |
Mnoho spojení na portu 25 ukazuje na rozesílání spamu; k tomu existuje samostatný článek, Server rozesílá spam.
Neznámý cíl posoudit
Cizí adresa v seznamu ještě není důkaz. Než se rozhodnete, zjistěte, kam spojení vede a kdo je navázal. I tyto kroky nic nemění:
- Určit proces: Vzít PID z
ssa pomocíls -l /proc/PID/exea příkazové řádky zkontrolovat, který program za tím stojí. - Dohledat cíl: Pomocí
dig -x <IP>zjistit název a pomocíwhois <IP>provozovatele sítě. - Porovnat s aplikací: Zeptejte se vývojáře nebo dodavatele, zda vaše aplikace tuto službu používá.
- Zkontrolovat průběh: Protokoly firewallu a sítě ukazují, od kdy spojení existuje a kolik dat proteklo.
- Zajistit výsledky: Výstupy uložit s časem dřív, než cokoli ukončíte nebo zablokujete.
Počítejte s nejednoznačnými výsledky. Mnoho legitimních služeb běží u velkých poskytovatelů cloudu a CDN, jejichž adresy neumožňují usuzovat na zákazníka. Naopak i útočníci používají pronajaté cloudové servery. Známý provozovatel sítě tedy není ani odvoláním poplachu, ani důkazem; rozhoduje, zda proces a účel odpovídají vaší aplikaci.
Momentka pomocí ss ukazuje jen to, co je právě otevřené. Krátká spojení navazovaná v minutovém taktu uvidíte jen v protokolech. Proto jsou protokoly firewallu nebo toků pro otázku odlivu dat často důležitější než pohled na samotný server.
Mohla-li data váš server opustit a jsou dotčeny osobní údaje, může zpravidla existovat oznamovací povinnost podle GDPR do 72 hodin. Ujasněte si to včas s pověřencem pro ochranu osobních údajů; souvislosti v článku Oznamovací povinnost podle GDPR do 72 hodin. Nejde o právní poradenství.
Nezapomenout na DNS a kontejnery
Ne každý odliv dat vyžaduje viditelné spojení na cizí adresu. Překlady jmen přes DNS jdou na resolver vašeho datacentra a v seznamu ss sotva upoutají pozornost. Útočníci mohou data zabalit do dlouhých, náhodně vypadajících subdomén a vynášet je tak pomocí dotazů DNS. Vodítka poskytují protokoly resolveru: neobvykle mnoho dotazů na tutéž cizí doménu, velmi dlouhé názvy nebo dotazy v dobách, kdy web nikdo nepoužívá.
Běží-li vaše aplikace v kontejnerech, vidí hostitel spojení kontejnerů často jen jako provoz sítě kontejnerů. Pak zkontrolujte každý kontejner zvlášť, pokud jsou tam nástroje k dispozici, nebo vyhodnoťte spojení na úrovni hostitele a firewallu.
# Spojení uvnitř kontejneru (pokud je ss obsaženo v image)
docker exec <container> ss -tnp 2>/dev/null
# Na hostiteli: spojení sledovaná jádrem, pokud je nainstalován conntrack
sudo conntrack -L 2>/dev/null | head -50
Odchozí provoz trvale omezit
Nejúčinnější prevencí je filtrování odchozího provozu: Server smí dosáhnout jen cílů, které skutečně potřebuje, vše ostatní se zablokuje a zaprotokoluje. Pro útočníky je tím výrazně těžší stahovat nástroje nebo odčerpávat data, i když mohou spouštět kód.
Cesta k tomu začíná seznamem potřebných cílů, který odvodíte z výše shromážděných spojení. Poté následuje fáze, kdy se zablokovaná spojení jen protokolují, než se zákaz zostří. Platební služby, aktualizační servery a rozhraní s proměnnými adresami vyžadují zvláštní péči. Jak se firewall pro webové servery celkově staví, popisuje Firewall pro webové servery: otevírat jen nutné porty.
Jak konkrétně pomáhá PHP SOS?
- Zkontrolovat spojení: Všechna aktivní spojení přiřazujeme procesům a účelům a neznámé cíle posuzujeme.
- Odhadnout odliv dat: Vyhodnocujeme protokoly firewallu a sítě a objasňujeme, zda a kdy byla data přenesena.
- Omezit odchozí provoz: S vámi sestavíme seznam povolených cílů a filtrování odchozího provozu zavádíme postupně.
- Trvale sledovat: S Security Monitoring hlásíme nová nebo neobvyklá spojení.
Časté dotazy
Která odchozí spojení jsou u webového serveru normální?
Typická jsou spojení s databází, poštovním serverem, platebními a přepravními službami, aktualizačními servery a známými rozhraními aplikace. Vše, co nelze přiřadit žádnému z těchto účelů, zaslouží bližší pohled.
Jak zjistím, který proces spojení navázal?
Pomocí ss -tunap nebo lsof -i -n -P jako root. Oba ukazují u každého spojení ID procesu a název programu. Poznáte tak, zda spojení pochází z PHP, webového serveru nebo cizího programu.
Znamená neznámé spojení, že data unikla?
Nutně ne. Je to ale vodítko, které je nutné objasnit. Zda a jaká data byla přenesena, lze často zodpovědět jen protokoly firewallu nebo sítě. Jsou-li dotčeny osobní údaje, mohou existovat oznamovací povinnosti.
Měl by webový server vůbec smět odchozí spojení?
Jen na cíle, které potřebuje. Filtrování odchozího provozu, které vše ostatní zablokuje, útočníkům podstatně ztěžuje stahování nástrojů a odliv dat. Musí se ale pečlivě otestovat.