Listen over åbne porte er listen over veje ind til serveren. Alt andet — firewalls, WAF, indtrængningsdetektion — er overbygninger på den. Derfor står kontrollen »hvad lytter her« først i enhver gennemgang, og det er også den, der oftest giver et ubehageligt resultat: halvdelen af det, du finder, blev ikke åbnet af dig, men af installationsscriptet til en eller anden pakke.
Vi læser outputtet
sudo ss -tulpn
Flagene: t — TCP, u — UDP, l — kun lyttende, p — proces, n — ingen navneopslag. Uden sudo bliver proceskolonnen tom, og hele øvelsen mister sin mening.
Det, du skal se på, er kolonnen Local Address:Port, og forskellen der er afgørende:
127.0.0.1:3306— tjenesten er kun tilgængelig fra maskinen selv. Det er godt;0.0.0.0:3306— fra alle IPv4-adresser, altså fra internettet. Det skal kontrolleres;[::]:3306— det samme for IPv6. En separat linje, der jævnligt glemmes;203.0.113.25:443— på en bestemt adresse, som regel bevidst.
Derefter stiller du ét spørgsmål ved hver linje med 0.0.0.0 eller [::]: skal en udenforstående kunne komme hertil? For 80 og 443 er svaret ja. For næsten alt andet er det nej.
Almindelige fund
Redis, port 6379. Den farligste linje, der findes. Som standard kræver Redis ingen adgangskode, og dens kommandoer gør det muligt at skrive en fil til disken — altså en fremmed nøgle i authorized_keys. Mellem at Redis dukker op på en offentlig adresse, og at den udnyttes, går der timer, undertiden mindre. Kontrollér bind 127.0.0.1 og protected-mode yes i konfigurationen.
Memcached, 11211/UDP. Selv om der ikke er noget værdifuldt indeni, bliver din server en forstærker i andres angreb — og klagerne kommer fra hostingudbyderen.
MySQL og PostgreSQL, 3306 og 5432. Adgangskode findes, men gætteriet foregår uafbrudt, og databaseversioner opdateres sjældnere, end de burde. Udadtil er de næsten aldrig nødvendige: applikationen står på samme maskine, og til arbejde rækker en SSH-tunnel.
Elasticsearch 9200, MongoDB 27017. Historisk uden godkendelse som standard. Offentlige instanser af disse tjenester er en stadig kilde til nyheder om læk.
Dockers API, 2375. En åben styringsport til Docker er root på maskinen helt uden adgangskode. Den dukker som regel op efter eksperimenter med fjernadgang til Docker.
Kontrolpaneler og phpMyAdmin på deres porte: 8080, 8083, 10000. Det er ikke sådan, at de aldrig må åbnes, men det er dem, der tiltrækker hovedstrømmen af forsøg.
Ret i tjenesten, ikke i firewallen
Fristelsen til at lukke hvert fund med en UFW-regel er forståelig, men det er anden linje og ikke den første. En regel kan slettes ved et uheld, firewallen slås fra et øjeblik under fejlsøgning, og Docker publicerer porte helt forbi UFW. At sætte bindingen i tjenestens konfiguration overlever alt dette:
- MySQL/MariaDB —
bind-address = 127.0.0.1; - PostgreSQL —
listen_addresses = 'localhost'; - Redis —
bind 127.0.0.1 ::1; - Docker Compose — publicering som
"127.0.0.1:5432:5432".
Firewallen lægges ovenpå som en forsikring, ikke i stedet for.
Find processen når du ikke ved, hvad det er
ss viser navn og pid. Derefter:
sudo systemctl status <pid>
sudo lsof -i :8080
Den første kommando navngiver den systemd-enhed, processen hører til — det rækker som regel til at forstå, hvad det er, og om det er nødvendigt. En ukendt proces, der lytter på en høj port og er startet uden for systemmapperne — for eksempel fra /tmp eller /dev/shm — er ikke længere et konfigurationsspørgsmål, men grund til en selvstændig undersøgelse.
Kontrol udefra er obligatorisk
ss svarer på spørgsmålet »hvad lytter«, ikke »hvad kan nås«. Mellem de to står firewallen, NAT og udbyderens regler. Det eneste ærlige svar giver en scanning fra en anden maskine:
nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1
Spring ikke den anden kommando over: næsten enhver VPS har en IPv6-adresse, reglerne for den skrives separat, og tjenesten lytter på begge protokolversioner samtidig.
Dette er ingen engangskontrol
Listen over åbne porte ændrer sig af sig selv. Du installerede en pakke — den tog en tjeneste med og åbnede en port. Du opdaterede panelet — det gendannede standardværdien. Du startede en container — den publicerede en port forbi firewallen. En engangskontrol svarer for dagens tilstand og ikke mere.
Værdien ligger ikke i selve listen, men i dens ændringer: en ny port, der ikke fandtes i går, er et kort og meget sigende signal. Sådan er listen værd at betragte — som et øjebliksbillede med historik, ikke som output fra ss gengivet efter hukommelsen. Demonstrationssiden nedenfor viser præcis det.