Pe scurt: Conexiunile de ieșire ale unui server le verificați cu ss -tunap sau lsof -i, care atribuie fiecare conexiune unui proces. Sunt normale conexiunile către baza de date, serverul de e-mail, serverele de actualizare și interfețele cunoscute. Conexiunile proceselor PHP sau ale serverului web către ținte necunoscute, porturile neobișnuite și conexiunile permanente fără motiv sunt semnale de alarmă pentru control la distanță sau scurgere de date. Pe termen lung ajută o filtrare de ieșire care permite doar țintele necesare.
De ce privirea spre exterior spune atât de mult
La căutarea unei intruziuni, majoritatea se uită la fișiere. Dar un atacator vrea să facă ceva cu accesul său: să încarce unelte, să primească comenzi, să scoată date sau să folosească serverul pentru spam ori atacuri asupra altora. Toate acestea au nevoie de conexiuni spre exterior.
Un server web stabilește din proprie inițiativă doar puține conexiuni, iar majoritatea sunt previzibile: interoghează baza de date, transmite e-mailuri, apelează interfețe de plată sau de expediere și aduce actualizări. De aceea conexiunile străine iese aici deosebit de mult în evidență. Conform rapoartelor de care dispunem, conexiunile de ieșire se numără printre semnalele generale de alarmă după o intruziune; Indicators of Compromise confirmate special pentru PHP2Shell nu există. Alte semne rezumă Sunt deja compromis?.
Listarea conexiunilor de ieșire și atribuirea lor proceselor
Comenzile următoare doar citesc. Rulați-le ca root, altfel lipsesc datele despre procese.
# Toate conexiunile TCP stabilite, cu proces
ss -tnp state established
# TCP și UDP, inclusiv serviciile care ascultă
ss -tunap
# Conexiuni pe program și utilizator, fără rezolvarea numelor
lsof -i -n -P | grep -v LISTEN
# Doar conexiunile proceselor utilizatorilor serverului web
lsof -i -n -P -u www-data 2>/dev/null
În rezultat fiți atenți la trei coloane: procesul, adresa țintă cu portul și utilizatorul. O conexiune de la php-fpm către baza de date pe portul 3306 este normală. O conexiune a unui program cu nume necunoscut din /tmp către o adresă străină pe un port neobișnuit nu este. Sub ce utilizator rulează PHP depinde de distribuție și de panou.
Normal sau suspect? O încadrare
| Observație | Mai degrabă normal | Mai degrabă suspect |
|---|---|---|
| Țintă | baza de date proprie, server de e-mail, API-uri cunoscute, servere de actualizare | adrese necunoscute fără legătură cu aplicația |
| Proces | php-fpm, serverul web, servicii de e-mail și actualizare | programe necunoscute, procese din /tmp sau /dev/shm |
| Port | 443, 3306, 5432, 587 | porturi înalte neobișnuite, porturi tipice IRC |
| Durată | scurtă, potrivită cu cererile | permanent deschisă, și noaptea fără vizitatori |
| Cantitate | mică și uniformă | vârfuri bruște ale volumului de date de ieșire |
| Trafic de e-mail | trimitere prin serverul de e-mail prevăzut | multe conexiuni directe pe portul 25 |
Multe conexiuni pe portul 25 indică trimitere de spam; pentru aceasta există un articol separat, Serverul trimite spam.
Evaluarea unei ținte necunoscute
O adresă străină din listă nu este încă o dovadă. Înainte de a decide, clarificați încotro duce conexiunea și cine a stabilit-o. Și acești pași nu schimbă nimic:
- Determinați procesul: Luați PID-ul din
ssși verificați culs -l /proc/PID/exeși cu linia de comandă ce program se află în spate. - Căutați ținta: Cu
dig -x <IP>aflați numele, iar cuwhois <IP>operatorul de rețea. - Comparați cu aplicația: Întrebați dezvoltatorul sau prestatorul dacă aplicația dumneavoastră folosește acest serviciu.
- Verificați istoricul: Jurnalele firewall-ului și ale rețelei arată de când există conexiunea și câte date au curs.
- Păstrați rezultatele: Salvați rezultatele cu ora înainte de a încheia sau bloca ceva.
Pregătiți-vă pentru rezultate ambigue. Multe servicii legitime rulează la mari furnizori cloud și CDN, ale căror adrese nu permit nicio concluzie despre client. Invers, și atacatorii folosesc servere cloud închiriate. Un operator de rețea cunoscut nu este deci nici alarmă încheiată, nici dovadă; decisiv este dacă procesul și scopul se potrivesc cu aplicația dumneavoastră.
O instantanee cu ss arată doar ce este deschis chiar acum. Conexiunile scurte, stabilite din minut în minut, le vedeți doar în jurnale. De aceea jurnalele firewall-ului sau de flux sunt adesea mai importante pentru întrebarea despre o scurgere de date decât privirea asupra serverului însuși.
Dacă datele ar fi putut părăsi serverul dumneavoastră și sunt afectate date cu caracter personal, poate exista o obligație de notificare conform RGPD, de regulă în 72 de ore. Clarificați din timp cu responsabilul dumneavoastră cu protecția datelor; context la Obligația de notificare RGPD în 72 de ore. Aceasta nu este consultanță juridică.
Nu uitați DNS-ul și containerele
Nu orice scurgere de date are nevoie de o conexiune vizibilă către o adresă străină. Rezolvările de nume prin DNS merg către resolver-ul centrului dumneavoastră de date și abia se observă în lista ss. Atacatorii pot împacheta date în subdomenii lungi, cu aspect aleatoriu, și le pot scoate astfel prin cereri DNS. Indicii în acest sens oferă jurnalele resolver-ului: un număr neobișnuit de mare de cereri către același domeniu străin, nume foarte lungi sau cereri în momente în care nimeni nu folosește site-ul.
Dacă aplicațiile dumneavoastră rulează în containere, gazda vede adesea conexiunile containerelor doar ca trafic al rețelei de containere. Verificați atunci în fiecare container separat, în măsura în care uneltele sunt disponibile acolo, sau evaluați conexiunile la nivelul gazdei și al firewall-ului.
# Conexiuni în interiorul unui container (dacă ss este inclus în imagine)
docker exec <container> ss -tnp 2>/dev/null
# Pe gazdă: conexiunile urmărite de kernel, dacă conntrack este instalat
sudo conntrack -L 2>/dev/null | head -50
Limitarea permanentă a traficului de ieșire
Cea mai eficientă prevenție este o filtrare de ieșire: serverul are voie să ajungă doar la țintele de care are cu adevărat nevoie, tot restul este blocat și consemnat. Pentru atacatori devine astfel mult mai greu să încarce unelte sau să extragă date, chiar dacă pot executa cod.
Calea până acolo începe cu o listă a țintelor necesare, pe care o derivați din conexiunile adunate mai sus. Urmează o fază în care conexiunile blocate sunt doar consemnate, înainte ca blocarea să fie activată. Serviciile de plată, serverele de actualizare și interfețele cu adrese schimbătoare necesită aici o grijă deosebită. Cum se construiește în ansamblu un firewall pentru servere web descrie Firewall pentru servere web: deschideți doar porturile necesare.
Cum ajută PHP SOS concret?
- Verificarea conexiunilor: Atribuim toate conexiunile active proceselor și scopurilor și evaluăm țintele necunoscute.
- Estimarea scurgerii de date: Evaluăm jurnalele firewall-ului și ale rețelei și clarificăm dacă și când au fost transmise date.
- Limitarea ieșirii: Elaborăm împreună cu dumneavoastră o listă de ținte permise și configurăm treptat filtrarea de ieșire.
- Monitorizare permanentă: Prin monitorizarea de securitate raportăm conexiunile noi sau neobișnuite.
Întrebări frecvente
Ce conexiuni de ieșire sunt normale la un server web?
Tipice sunt conexiunile către baza de date, serverul de e-mail, serviciile de plată și de expediere, serverele de actualizare și interfețele cunoscute ale aplicației. Tot ce nu poate fi atribuit niciunuia dintre aceste scopuri merită o privire mai atentă.
Cum văd ce proces a stabilit o conexiune?
Cu ss -tunap sau lsof -i -n -P ca root. Ambele arată pentru fiecare conexiune ID-ul procesului și numele programului. Astfel recunoașteți dacă conexiunea provine de la PHP, de la serverul web sau de la un program străin.
O conexiune necunoscută înseamnă că s-au scurs date?
Nu neapărat. Este însă un indiciu care trebuie clarificat. Dacă și ce date au fost transmise se poate adesea afla doar cu jurnalele firewall-ului sau ale rețelei. Dacă sunt afectate date cu caracter personal, pot exista obligații de notificare.
Ar trebui un server web să aibă în general voie la conexiuni de ieșire?
Doar către țintele de care are nevoie. O filtrare de ieșire care blochează tot restul îngreunează considerabil atacatorilor reîncărcarea de unelte și scurgerea de date. Trebuie însă testată cu grijă.