Eine der wichtigsten Aufgaben eines Serveradmins ist es sein System zu kennen. Und einige der kritischten Faktoren sind die offenen Ports…
Theoretisch ist die Sache ganz einfach: Jeder offene Port ist eine Gefahr und sollte vermieden werden!
Praktisch ist es aber nicht ganz so einfach, denn wenn mein Server keine Ports offen hat kann er auch keine Dienste anbieten.
Also kommt man nicht drum rum doch den einen oder anderen Port aufzumachen.
Was nun aber wichtig ist: Man sollte exakt wissen welches Programm einen Port offen hat und dieses so aktuell wie möglich halten.
Manchmal wache ich nachts schweißgebadet auf und denke mir „Hat mein Datenbankserver eigentlich einen Port für die ganze Welt offen, und tausende Hacker sind gerade mit dem User ‚test‘ und Passwort ‚test123′ auf meiner Datenbank unterwegs?“!
Die Lösung dagegen?
Selber nachsehen!
Das Kommando ’netstat -tapen‘ hilft hier weiter, gucken wir uns das auf meinem System (Ubuntu 16.04) an:
(Mein System hat die IP: 176.30.32.128 und mein Computer der gerade per SSH drauf ist hat die 103.20.30.40)
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 111 20505 1155/mysqld tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 0 16734 1234/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 0 16748 1234/dovecot tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 20559 1435/master tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 0 19550 1119/sshd tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 0 16750 1234/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 0 16736 1234/dovecot tcp 0 280 176.30.32.128:1234 103.20.30.40:12032 ESTABLISHED 0 20008 1738/sshd: heinz [priv tcp 0 0 176.30.32.128:1234 103.20.30.40:11569 ESTABLISHED 0 19648 1486/sshd: heinz [priv tcp6 0 0 :::110 :::* LISTEN 0 16735 1234/dovecot tcp6 0 0 :::143 :::* LISTEN 0 16749 1234/dovecot tcp6 0 0 :::80 :::* LISTEN 0 14074 1284/apache2 tcp6 0 0 :::25 :::* LISTEN 0 20560 1435/master tcp6 0 0 :::443 :::* LISTEN 0 14078 1284/apache2 tcp6 0 0 :::1234 :::* LISTEN 0 19552 1119/sshd tcp6 0 0 :::993 :::* LISTEN 0 16751 1234/dovecot tcp6 0 0 :::995 :::* LISTEN 0 16737 1234/dovecot
Und jetzt gehen wir das Zeile für Zeile durch 🙂
(Leider sind die Zeilen hier umgebrochen)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 111 20505 1155/mysqld
Mein Mysql-Server horcht auf IPv4 Port 3306, aber nur auf der IP 127.0.0.1. Somit horcht er nur lokal. Seine Prozess-ID ist 1155.
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 0 16734 1234/dovecot
Mein Dovecot Server horcht auf dem IPv4 Port 110, aber auf der lokalen IP-Adresse 0.0.0.0 was soviel heißt wie ‚weltweit‘ -> Das ist also ein Dienst der auch von extern aufgerufen werden kann!
Der Port 110 ist POP3 – das will ich ja auch weltweit zur Verfügung stellen!
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 0 16748 1234/dovecot tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 20559 1435/master tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 0 19550 1119/sshd tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 0 16750 1234/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 0 16736 1234/dovecot
Die nächsten Zeilen zeigen weiterhin meinen Dovecot der wieder weltweit horcht (lokale Adresse 0.0.0.0) und zwar für die IPv4 Ports 143 + 993 + 995. Das ist IMAP, IMAP-S und POP3-S. Auch das will ich zur Verfügung stellen!
Sonst haben wir hier noch das Programm ‚master‘ auf IPv4 Port 25 – das ist SMTP und somit mein Postfix. Der soll ja SMTP machen, also darf er horchen.
Zuletzt haben wir noch das Programm ’sshd‘ (den SSH-Server) auf Port 1234. Den hab ich da hingesteckt, also alles wie gewünscht!
tcp 0 280 176.30.32.128:1234 103.20.30.40:12032 ESTABLISHED 0 20008 1738/sshd: heinz [priv tcp 0 0 176.30.32.128:1234 103.20.30.40:11569 ESTABLISHED 0 19648 1486/sshd: heinz [priv
Diese beiden Freunde sind zwei SSH-Verbindungen die gerade nicht horchen (LISTEN) sondern aufgebaut sind (ETABLISHED).
Da ich gerade zwei Puttys zu meinem Server offen habe ist das so erwartet.
Der lokale Port ist 1234 (also mein SSH) und der entfernte Port ist einmal 12032 und 11569 – das ist ein nicht-priviligesierter Port meines Windows Computers auf dem Putty läuft.
Die nächsten Zeilen sind wieder alle horchenden Programme nur für IPv6.
Das einzige was mich noch stutzig gemacht hat ist das hier:
tcp6 0 0 :::80 :::* LISTEN 0 14074 1284/apache2 tcp6 0 0 :::443 :::* LISTEN 0 14078 1284/apache2
Es sieht so aus als würde mein Apache nur auf IPv6 horchen.
(Port is 80 für http und 443 für https, also wie erwartet!)
Aber warum sehen wir ihn nicht im IPv4?
Das liegt daran dass Apache unter Ubuntu mit Parameter ‚enable-v4-mapped‘ kompiliert wird.
Heißt also er horcht scheinbar nur auf einem IPv6 Port, wenn aber was über IPv4 kommt kann er das trotzdem über den IPv6 Socket annehmen.
Zusammenfassend also:
Alle die als Status ‚LISTEN‘ und als lokale Adresse entweder 0.0.0.0 (IPv4) oder ::: (IPv6) haben, sind Programme die man sich näher ansehen sollte.
Und da man -gerade bei Computern- grundsätzlich nichts aufs erste Mal glauben soll prüfen wir unsere Ergebnisse nochmal mit dem Programm ‚lsof -i‘ nach. ‚lsof‘ zeigt eigentlich die Dateien die ein Programm im Zugriff hat. Da aber ein Netzwerksocket in Linux auch nur eine Datei ist, kann das Programm auch alle hörenden Verbindungen anzeigen:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 1004 root 6u IPv4 11988 0t0 UDP *:bootpc sshd 1119 root 3u IPv4 19550 0t0 TCP *:1234 (LISTEN) sshd 1119 root 4u IPv6 19552 0t0 TCP *:1234 (LISTEN) mysqld 1155 mysql 21u IPv4 20505 0t0 TCP localhost:mysql (LISTEN) dovecot 1234 root 24u IPv4 16734 0t0 TCP *:pop3 (LISTEN) dovecot 1234 root 25u IPv6 16735 0t0 TCP *:pop3 (LISTEN) dovecot 1234 root 26u IPv4 16736 0t0 TCP *:pop3s (LISTEN) dovecot 1234 root 27u IPv6 16737 0t0 TCP *:pop3s (LISTEN) dovecot 1234 root 38u IPv4 16748 0t0 TCP *:imap2 (LISTEN) dovecot 1234 root 39u IPv6 16749 0t0 TCP *:imap2 (LISTEN) dovecot 1234 root 40u IPv4 16750 0t0 TCP *:imaps (LISTEN) dovecot 1234 root 41u IPv6 16751 0t0 TCP *:imaps (LISTEN) apache2 1284 root 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1284 root 6u IPv6 14078 0t0 TCP *:https (LISTEN) apache2 1343 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1343 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) apache2 1344 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1344 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) apache2 1345 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1345 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) apache2 1346 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1346 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) apache2 1347 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1347 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) master 1435 root 12u IPv4 20559 0t0 TCP *:smtp (LISTEN) master 1435 root 13u IPv6 20560 0t0 TCP *:smtp (LISTEN) sshd 1486 root 3u IPv4 19648 0t0 TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:11569 (ESTABLISHED) sshd 1572 heinz 3u IPv4 19648 0t0 TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:11569 (ESTABLISHED) apache2 1737 www-data 4u IPv6 14074 0t0 TCP *:http (LISTEN) apache2 1737 www-data 6u IPv6 14078 0t0 TCP *:https (LISTEN) sshd 1738 root 3u IPv4 20008 0t0 TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:12032 (ESTABLISHED) sshd 1770 heinz 3u IPv4 20008 0t0 TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:12032 (ESTABLISHED)
Wir sehen dass sich hier alles mit netstat deckt – bis auf:
dhclient 1004 root 6u IPv4 11988 0t0 UDP *:bootpc
Das scheint ein DHCP-Client zu sein. Warum haben wir den in netstat nicht gesehen? -> Weil wir netstat nicht gesagt haben dass wir auch gerne UDP sehen wollen.
’netstat -tapen‘ bedeutet:
- t: TCP-Verbindungen
- a: Zeige Verbindungen im Status ‚LISTEN‘ und ‚ESTABLISHED‘ (sonst nur established!)
- p: Programm-ID und PID anzeigen
- e: Ausführliche Informationen anzeigen
- n: Zeige Port-Nummern, nicht Namen (wie http, ssh…)
Und damit wissen wir auch wie unser (mein) Lieblingskommando geht:
netstat -tulpen
- t: Zeige auch TCP-Verbindungen
- u: Zeige auch UDP-Verbindungen
- l: Zeige nur Verbindungen im Status LISTEN
- p: Programm-ID und PID
- e: Erweiterte Informationen anzeigen (Besitzer des Sockets z.B.)
- n: Port-Nummern anzeigen
Mit „netstat -tulpen“ finden wir nun auch unseren DHCP-Client der auf Port 68 horcht:
udp 0 0 0.0.0.0:68 0.0.0.0:* 0 11988 1004/dhclient
Wenn man ganz geschickt ist passt man das Kommando noch so an dass man nur die anzeigt die auch weltweit horchen. Dazu muss man nur die mit IP-Adresse ‚127.0.0.1‘ (IPv4) und „::1“ (IPv6) ausschließen:
netstat -tulpen | grep -v 127.0.0.1 | grep -v ::1:
Und das letzte was wir jetzt noch benötigen ist die Verifizierung von außen. Also nehmen wir einen anderen Computer und starten
nmap myhostname.de -p-
Dabei bedeutet „-p-“ das wir wirkliche alle Ports des Zielcomputers „myhostname.de“ scannen wollen – nicht nur die bekannten!
(nmap ist in den Paketquellen von Ubuntu beinhaltet und kann mit „apt-get install nmap“ installiert werden!)
Das Ergebnis ist wie erwartet:
PORT STATE SERVICE 25/tcp open smtp 80/tcp open http 110/tcp open pop3 143/tcp open imap 443/tcp open https 993/tcp open imaps 995/tcp open pop3s 1234/tcp open unknown
Warum ist unser DHCP-Client nicht dabei?
Ganz einfach, nmap scannt normalerweise nur TCP!
Es kann auch UDP-Dienste scannen, aber da ein UDP-Dienst nicht antworten muss (und der DHCPClient tut das nicht!) bringt einem das nichts.
Das Kommando um also den Port 68 per UDP zu scannen wäre:
„nmap myhostname.de -p68 -sU“.
Leider ist (wie erwartet) die Antwort nichts sagend:
PORT STATE SERVICE 68/udp open|filtered dhcpc
So, und wenn ich noch Lust finde dann gehen wir demnächst mal ein paar Firewall-Grundlagen durch 🙂
Schreibe einen Kommentar