Listen over åpne porter er listen over veier inn til serveren. Alt annet — brannmurer, WAF, inntrengingsdeteksjon — er påbygg på den. Derfor står kontrollen «hva lytter her» først i enhver gjennomgang, og det er også den som oftest gir et ubehagelig resultat: halvparten av det du finner, ble ikke åpnet av deg, men av installasjonsskriptet til en eller annen pakke.
Vi leser utdataene
sudo ss -tulpn
Flaggene: t — TCP, u — UDP, l — bare lyttende, p — prosess, n — ingen navneoppslag. Uten sudo blir prosesskolonnen tom, og hele øvelsen mister sin hensikt.
Det du skal se på, er kolonnen Local Address:Port, og forskjellen der er avgjørende:
127.0.0.1:3306— tjenesten er tilgjengelig bare fra maskinen selv. Det er bra;0.0.0.0:3306— fra alle IPv4-adresser, altså fra internett. Det må kontrolleres;[::]:3306— det samme for IPv6. En egen linje som jevnlig glemmes;203.0.113.25:443— på en bestemt adresse, som regel bevisst.
Deretter stiller du ett spørsmål ved hver linje med 0.0.0.0 eller [::]: skal en utenforstående kunne komme hit? For 80 og 443 er svaret ja. For nesten alt annet er det nei.
Vanlige funn
Redis, port 6379. Den farligste linjen som finnes. Som standard krever Redis ikke passord, og kommandoene dens gjør det mulig å skrive en fil til disk — altså en fremmed nøkkel i authorized_keys. Mellom at Redis dukker opp på en offentlig adresse og at den utnyttes, går det timer, iblant mindre. Kontroller bind 127.0.0.1 og protected-mode yes i konfigurasjonen.
Memcached, 11211/UDP. Selv om det ikke finnes noe verdifullt inni, blir serveren din en forsterker i andres angrep — og klagene kommer fra hostingleverandøren.
MySQL og PostgreSQL, 3306 og 5432. Passord finnes, men gjettingen pågår uavbrutt, og databaseversjoner oppdateres sjeldnere enn de burde. Utover trengs de nesten aldri: applikasjonen står på samme maskin, og til arbeid holder en SSH-tunnel.
Elasticsearch 9200, MongoDB 27017. Historisk uten autentisering som standard. Offentlige instanser av disse tjenestene er en stadig kilde til nyheter om lekkasjer.
Dockers API, 2375. En åpen styringsport for Docker er root på maskinen helt uten passord. Den dukker som regel opp etter eksperimenter med fjerntilgang til Docker.
Kontrollpaneler og phpMyAdmin på sine porter: 8080, 8083, 10000. Det er ikke slik at de aldri kan åpnes, men det er de som trekker til seg hovedstrømmen av forsøk.
Fiks i tjenesten, ikke i brannmuren
Fristelsen til å stenge hvert funn med en UFW-regel er forståelig, men det er andre linje og ikke den første. En regel kan slettes ved et uhell, brannmuren slås av en stund under feilsøking, og Docker publiserer porter helt forbi UFW. Å sette bindingen i tjenestens konfigurasjon overlever alt dette:
- MySQL/MariaDB —
bind-address = 127.0.0.1; - PostgreSQL —
listen_addresses = 'localhost'; - Redis —
bind 127.0.0.1 ::1; - Docker Compose — publisering som
"127.0.0.1:5432:5432".
Brannmuren legges oppå som en forsikring, ikke i stedet for.
Finn prosessen når du ikke vet hva det er
ss viser navn og pid. Deretter:
sudo systemctl status <pid>
sudo lsof -i :8080
Den første kommandoen navngir systemd-enheten prosessen hører til — det holder som regel for å forstå hva det er og om det trengs. En ukjent prosess som lytter på en høy port og er startet utenfor systemkatalogene — for eksempel fra /tmp eller /dev/shm — er ikke lenger et konfigurasjonsspørsmål, men grunn til en egen undersøkelse.
Kontroll utenfra er obligatorisk
ss svarer på spørsmålet «hva lytter», ikke «hva er mulig å nå». Mellom de to står brannmuren, NAT og leverandørens regler. Det eneste ærlige svaret gir en skanning fra en annen maskin:
nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1
Ikke hopp over den andre kommandoen: nesten hver VPS har en IPv6-adresse, reglene for den skrives separat, og tjenesten lytter på begge protokollversjonene samtidig.
Dette er ingen engangskontroll
Listen over åpne porter endrer seg av seg selv. Du installerte en pakke — den tok med seg en tjeneste og åpnet en port. Du oppdaterte panelet — det gjenopprettet standardverdien. Du startet en container — den publiserte en port forbi brannmuren. En engangskontroll svarer for dagens tilstand og ikke mer.
Verdien ligger ikke i selve listen, men i endringene: en ny port som ikke fantes i går, er et kort og svært talende signal. Slik er listen verdt å betrakte — som et øyeblikksbilde med historikk, ikke som utdata fra ss gjengitt fra hukommelsen. Demonstrasjonssiden nedenfor viser nettopp det.