Listan över öppna portar är listan över vägar in till servern. Allt annat — brandväggar, WAF, intrångsdetektering — är påbyggnader ovanpå den. Därför står kontrollen ”vad lyssnar här” först i varje granskning, och det är också den som oftast ger ett obehagligt resultat: hälften av det du hittar öppnades inte av dig utan av något pakets installationsskript.
Vi läser utdatan
sudo ss -tulpn
Flaggorna: t — TCP, u — UDP, l — bara lyssnande, p — process, n — inga namnuppslag. Utan sudo blir processkolumnen tom och hela övningen mister sin mening.
Det du ska titta på är kolumnen Local Address:Port, och skillnaden där är avgörande:
127.0.0.1:3306— tjänsten är nåbar bara från maskinen själv. Det är bra;0.0.0.0:3306— från alla IPv4-adresser, alltså från internet. Det behöver kontrolleras;[::]:3306— detsamma för IPv6. En egen rad som regelbundet glöms bort;203.0.113.25:443— på en bestämd adress, vanligen medvetet.
Sedan ställer du en enda fråga vid varje rad med 0.0.0.0 eller [::]: ska en utomstående kunna komma hit? För 80 och 443 är svaret ja. För nästan allt annat är det nej.
Vanliga fynd
Redis, port 6379. Den farligaste rad som finns. Som standard kräver Redis inget lösenord, och dess kommandon gör det möjligt att skriva en fil till disk — alltså en främmande nyckel i authorized_keys. Mellan att Redis dyker upp på en publik adress och att den utnyttjas går timmar, ibland mindre. Kontrollera bind 127.0.0.1 och protected-mode yes i konfigurationen.
Memcached, 11211/UDP. Även om det inte finns något värdefullt inuti blir din server en förstärkare i andras angrepp — och klagomålen kommer från hostingleverantören.
MySQL och PostgreSQL, 3306 och 5432. Lösenord finns, men gissandet pågår oavbrutet och databasversioner uppdateras mer sällan än de borde. Utåt behövs de nästan aldrig: applikationen står på samma maskin, och för arbete räcker en SSH-tunnel.
Elasticsearch 9200, MongoDB 27017. Historiskt utan autentisering som standard. Publika instanser av dessa tjänster är en stadig källa till nyheter om läckor.
Dockers API, 2375. En öppen styrport för Docker är root på maskinen helt utan lösenord. Den dyker vanligen upp efter experiment med fjärråtkomst till Docker.
Kontrollpaneler och phpMyAdmin på sina portar: 8080, 8083, 10000. Det är inte så att de aldrig får öppnas, men det är de som drar till sig huvudströmmen av försök.
Åtgärda i tjänsten, inte i brandväggen
Frestelsen att stänga varje fynd med en UFW-regel är förståelig, men det är andra linjen och inte den första. En regel kan raderas av misstag, brandväggen stängas av en stund vid felsökning, och Docker publicerar portar helt förbi UFW. Att sätta bindningen i tjänstens konfiguration överlever allt det:
- 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".
Brandväggen läggs ovanpå som en försäkring, inte i stället för.
Hitta processen när du inte vet vad det är
ss visar namn och pid. Sedan:
sudo systemctl status <pid>
sudo lsof -i :8080
Det första kommandot namnger den systemd-enhet processen tillhör — det räcker vanligen för att förstå vad det är och om det behövs. En okänd process som lyssnar på en hög port och startats utanför systemkatalogerna — till exempel från /tmp eller /dev/shm — är inte längre en konfigurationsfråga utan skäl för en egen utredning.
Kontroll utifrån är obligatorisk
ss svarar på frågan ”vad lyssnar”, inte ”vad går att nå”. Mellan de två står brandväggen, NAT och leverantörens regler. Det enda ärliga svaret ger en skanning från en annan maskin:
nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1
Hoppa inte över det andra kommandot: nästan varje VPS har en IPv6-adress, reglerna för den skrivs separat, och tjänsten lyssnar på båda protokollversionerna samtidigt.
Det här är ingen engångskontroll
Listan över öppna portar förändras av sig själv. Du installerade ett paket — det tog med sig en tjänst och öppnade en port. Du uppdaterade panelen — den återställde standardvärdet. Du startade en container — den publicerade en port förbi brandväggen. En engångskontroll svarar för dagens läge och inget mer.
Värdet ligger inte i själva listan utan i dess förändringar: en ny port som inte fanns i går är en kort och mycket talande signal. Det är så listan är värd att betraktas — som en ögonblicksbild med historik, inte som utdata från ss återgiven ur minnet. Demonstrationssidan nedan visar just det.