Wie sichere ich meinen Linux Server ab?
Dinge die man beachten sollte:
So wenig Angriffsfläche wie möglich bieten – sprich so wenig Services von extern erreichbar machen wie nötig. Dinge wie Webmin, PHPmyadmin usw... sind zwar nett aber ein riesiges Sicherheitsrisiko wenn mans vom Internet aus erreichbar hat. Wenn man wirklich Ports offen lassen will damit man Dinge administrieren kann dann kann man diese auf 127.0.0.1 binden und deren Port per SSH auf den Rechner zuhause tunneln. SSH verschlüsselt alles, somit kann man z.b. Webmin nutzen ohne dass dieses vom Internet aus erreichbar ist.
Wenn das Service von extern erreichbar ist ist es angreifbar, egal wie abgesichert es ist. Deswegen sollte man die von außen erreichbaren Services immer aktuell halten. Um von eventuellen Sicherheitslücken schnell zu erfahren sollte man sich in die Security Mailing Liste seiner Distribution und in die Security Mailing Listen aller von extern erreichbaren Services eintragen. Ein RSS Bookmark auf Heise Security ist auch zu empfehlen.
Wie kann ich sehen welche Services offen sind?
Als root folgendes Commando ausführen, dann sieht man welches Programm welches Port belegt und auf welchen IPs:
netstat -anp | grep "LISTEN "
example output:
Ersteres hört auf Port 2208 und ist nur auf der IP Adresse 127.0.0.1 erreichbar, sprich nicht vom Internet aus. So sollten alle Services konfiguriert werden die man zwar benötigt, aber nicht vom Internet aus erreichbar sein müssen. (z.b. mysql bei einem Apache/PHP Server der auf mysql Datenbanken zurückgreift)
Zweiteres hört auf Port 3493 und auf ALLEN IP Adressen, so sollten nur Services aussehen die vom Internet aus erreichbar sein müssen (z.b. SSH oder Apache)
Am Ende der Zeile steht jeweils die Process ID und der Name des Prozesses der diesen Port belegt.
Wie kann ich ein Port über SSH tunneln?
Angenommen ein Service rennt nun auf der IP 127.0.0.1 auf dem Linux Server und ich will auf dieses zugreifen (nehmen wir als Beispiel Webmin her, also Port 10000). Wenn man sich von einem Linux Client auf den Server einloggt ist es relativ einfach:
ssh -p 43242 -l Hansi mein.server.de -L 11000:127.0.0.1:10000
-L bedeutet local port forwarding. Sprich mein lokales Port 11000 wird durch SSH forgewardet, und zwar auf die Ziel IP/Port 127.0.0.1:10000
Somit kann man nun auf dem Linux Client einen Browser öffnen und auf 127.0.0.1:11000 verbinden.
-l hier kann man den Usernamen angeben mit dem man sich anmelden will
-p hier gibt man das Port an auf dem der SSH Server am Linux Server läuft
Hier dasselbe mit Putty unter Windows:
1. ins den Menüpunkt Tunnel wechseln.
2. das Lokale Port angeben
3. die IP + Port des Services angeben welches man tunneln will
4. nicht vergessen auf ADD drücken!
Wenn der Linux Server in einem Lan steht kann man z.b. auch auf die PCs im Lan des Linux Servers forwarden.
ssh -p 43242 -l Hansi mein.server.de -L 3389:192.168.1.20:3389
So würde es aussehen wenn ich mich durch einen SSH Tunnel auf einen Windows Server mit RDP anmelden wollte der im Lan des Linux Servers steht. Nützlich wenn man zuhause z.b. einen WRT54GL stehen hat und gerne RDP nutzen möchte, dieses aber nicht dem ganzen Internet zugänglich machen will.
Keine FTP Server nutzen wenn SSH eh schon offen ist.
Wenn SSH schon läuft (und das ist auf 99,9% aller root/vroot Server so) gibt es keinen Grund einen FTP Server zu nutzen. Standardmäßig bietet SSH noch SFTP/SCP an. Man braucht z.b. unter Windows nur einen SFTP/SCP Client (WINSCP) und schon kann man Files up und downloaden. Allerdings verschlüsselt und nicht wie bei FTP unverschlüsselt. Desweiteren bietet man so keine zusätzliche Angriffsfläche, SSH ist sowieso schon offen also kann mans auch in vollem Umfang nutzen anstatt ein zusätzliches Service anzubieten.
Wie sichere ich SSH ab?
Man sollte SSH nicht auf dem Standardport (Port 22 TCP) belassen!
Wenn mans auf Port 22 laufen lässt wird man von vielen Scannern/Scripten durchgescannt. Die scannen einfach riesige IP Bereiche auf ein offenes Port 22, wenns offen ist versuchen sie Standardlogins wie test/test, root/root, root/linux usw... und sie versuchen auch Exploits für Sicherheitslücken.
Die Datei /etc/ssh/sshd_config im Editor öffnen
Dort findet man die Zeile:
Port 22
Diesen Port dann in den gewünschten Port abändern (z.B. Port 50000). Bitte wählt eine Portnummer zwischen 49152 und 65535.
Danach den Editor verlassen, vorher natürlich speichern.
Jetzt noch den SSH Deamon neustarten:
/etc/ini.d/sshd restart
Hier ein Szenario wenn ich die 2 Punkte nicht beachte:
Eine Sicherheitslücke wird gefunden, ich bekomme davon nichts mit. Patch gibt es noch keinen, oder er wird nicht automatisch installiert. Die Scanner/Scripte haben schon einen Exploit dafür, scannen zufällig deinen Server -> BUMM
Wenn ich nur einen der oberen Punkte beachte falle ich aus dem Schema schon raus.
Nur SSH Protocol 2 erlauben.
Protocol 1 braucht niemand und es ist etwas unsicherer.
In der sshd_config wäre das folgende Zeile:
Protocol 2
Keinen root Login erlauben.
Wenn man der alleinige Administrator des Systems ist ist es ganz einfach. Man erstellt sich einen normalen User (Hansi) der in der Linux Gruppe wheel ist. Nun vergibt man dem User Hansi ein kryptisches Passwort (~9 Zeichen mit nem Sonderzeichen) und erlaubt in der sshd_config ausschließlich diesem User einen Login, das geht mit folgender Zeile:
AllowUsers hansi
Dies verschafft uns wiedereinmal eine geringere Angriffsfläche. Der Angreifer müsste jetzt schon den Usernamen kennen bevor er eine Bruteforceattacke versucht. Den User root gibt’s ja auf jedem Linux System und ist deswegen meist der erste mit dem sie es versuchen. (bei *buntu Systemen wurde der root User ja schon etwas entschärft, da ist sowieso kein direkter root Login möglich)
Selbst wenn der Angreifer nun den User Hansi knackt, wäre er nicht root. Da müsste er nun ein zweites Passwort knacken ...
Optional: Die Verbindungsversuche limitieren.
Mit iptables kann man schön festlegen wieviel Verbindungen pro Minute auf ein Port aufgemacht werden dürfen. Das ist aber eher optional und für Services gedacht die auf dem Standardport laufen und die von Scannern/Scripten abgegrast werden.
NetworkerZ empfiehlt: Ich kann das Tool fail2ban empfehlen, es überwacht die auth.log und setzt automatisch dynamische IPTables Regeln, falls mehrere Loginversuche registriert werden.
SFTP für mehrere Nutzer?
Ist relativ einfach möglich. Linux User anlegen und per SSH einloggen erlauben. Aber einfach heißt leider auch unsicher. Die können sich eben nicht nur per SFTP einloggen sondern auch per SSH und bekommen dann eine normale Linux Shell. Dies lässt sich etwas weniger einfach mit RSSH umgehen. Das ist im Prinzip eine Login Shell (wie bash) die für User verwendet werden kann die nur SFTP/SCP Funktionalität benötigen und sich explizit nicht per normalen SSH verbinden sollen.
Um das ganze noch sicherer zu machen sollte man ein chroot verwenden. So werden die SFTP user dann in ein Unterverzeichnis eingesperrt und können nicht auf die Dateien des restlichen Systems zugreifen. Hier gibt’s dazu ein schönes Howto: http://gentoo-wiki.com/HOWTO_SFTP_Server_(chrooted,_without_shell)
Das sind mal die ersten und wichtigsten Punkte. Wird erweitert, wenn jemand Beispiele für spezielle Software hat, immer her damit
Kritik immer erwünscht, bin alles andere als gut in Themen strukturiert wiedergeben
Dinge die man beachten sollte:
So wenig Angriffsfläche wie möglich bieten – sprich so wenig Services von extern erreichbar machen wie nötig. Dinge wie Webmin, PHPmyadmin usw... sind zwar nett aber ein riesiges Sicherheitsrisiko wenn mans vom Internet aus erreichbar hat. Wenn man wirklich Ports offen lassen will damit man Dinge administrieren kann dann kann man diese auf 127.0.0.1 binden und deren Port per SSH auf den Rechner zuhause tunneln. SSH verschlüsselt alles, somit kann man z.b. Webmin nutzen ohne dass dieses vom Internet aus erreichbar ist.
Wenn das Service von extern erreichbar ist ist es angreifbar, egal wie abgesichert es ist. Deswegen sollte man die von außen erreichbaren Services immer aktuell halten. Um von eventuellen Sicherheitslücken schnell zu erfahren sollte man sich in die Security Mailing Liste seiner Distribution und in die Security Mailing Listen aller von extern erreichbaren Services eintragen. Ein RSS Bookmark auf Heise Security ist auch zu empfehlen.
Wie kann ich sehen welche Services offen sind?
Als root folgendes Commando ausführen, dann sieht man welches Programm welches Port belegt und auf welchen IPs:
netstat -anp | grep "LISTEN "
example output:
Code:
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 7412/hpiod
tcp 0 0 0.0.0.0:3493 0.0.0.0:* LISTEN 8133/upsd
Zweiteres hört auf Port 3493 und auf ALLEN IP Adressen, so sollten nur Services aussehen die vom Internet aus erreichbar sein müssen (z.b. SSH oder Apache)
Am Ende der Zeile steht jeweils die Process ID und der Name des Prozesses der diesen Port belegt.
Wie kann ich ein Port über SSH tunneln?
Angenommen ein Service rennt nun auf der IP 127.0.0.1 auf dem Linux Server und ich will auf dieses zugreifen (nehmen wir als Beispiel Webmin her, also Port 10000). Wenn man sich von einem Linux Client auf den Server einloggt ist es relativ einfach:
ssh -p 43242 -l Hansi mein.server.de -L 11000:127.0.0.1:10000
-L bedeutet local port forwarding. Sprich mein lokales Port 11000 wird durch SSH forgewardet, und zwar auf die Ziel IP/Port 127.0.0.1:10000
Somit kann man nun auf dem Linux Client einen Browser öffnen und auf 127.0.0.1:11000 verbinden.
-l hier kann man den Usernamen angeben mit dem man sich anmelden will
-p hier gibt man das Port an auf dem der SSH Server am Linux Server läuft
Hier dasselbe mit Putty unter Windows:
1. ins den Menüpunkt Tunnel wechseln.
2. das Lokale Port angeben
3. die IP + Port des Services angeben welches man tunneln will
4. nicht vergessen auf ADD drücken!
Wenn der Linux Server in einem Lan steht kann man z.b. auch auf die PCs im Lan des Linux Servers forwarden.
ssh -p 43242 -l Hansi mein.server.de -L 3389:192.168.1.20:3389
So würde es aussehen wenn ich mich durch einen SSH Tunnel auf einen Windows Server mit RDP anmelden wollte der im Lan des Linux Servers steht. Nützlich wenn man zuhause z.b. einen WRT54GL stehen hat und gerne RDP nutzen möchte, dieses aber nicht dem ganzen Internet zugänglich machen will.
Keine FTP Server nutzen wenn SSH eh schon offen ist.
Wenn SSH schon läuft (und das ist auf 99,9% aller root/vroot Server so) gibt es keinen Grund einen FTP Server zu nutzen. Standardmäßig bietet SSH noch SFTP/SCP an. Man braucht z.b. unter Windows nur einen SFTP/SCP Client (WINSCP) und schon kann man Files up und downloaden. Allerdings verschlüsselt und nicht wie bei FTP unverschlüsselt. Desweiteren bietet man so keine zusätzliche Angriffsfläche, SSH ist sowieso schon offen also kann mans auch in vollem Umfang nutzen anstatt ein zusätzliches Service anzubieten.
Wie sichere ich SSH ab?
Man sollte SSH nicht auf dem Standardport (Port 22 TCP) belassen!
Wenn mans auf Port 22 laufen lässt wird man von vielen Scannern/Scripten durchgescannt. Die scannen einfach riesige IP Bereiche auf ein offenes Port 22, wenns offen ist versuchen sie Standardlogins wie test/test, root/root, root/linux usw... und sie versuchen auch Exploits für Sicherheitslücken.
Die Datei /etc/ssh/sshd_config im Editor öffnen
Dort findet man die Zeile:
Port 22
Diesen Port dann in den gewünschten Port abändern (z.B. Port 50000). Bitte wählt eine Portnummer zwischen 49152 und 65535.
Danach den Editor verlassen, vorher natürlich speichern.
Jetzt noch den SSH Deamon neustarten:
/etc/ini.d/sshd restart
Hier ein Szenario wenn ich die 2 Punkte nicht beachte:
Eine Sicherheitslücke wird gefunden, ich bekomme davon nichts mit. Patch gibt es noch keinen, oder er wird nicht automatisch installiert. Die Scanner/Scripte haben schon einen Exploit dafür, scannen zufällig deinen Server -> BUMM
Wenn ich nur einen der oberen Punkte beachte falle ich aus dem Schema schon raus.
Nur SSH Protocol 2 erlauben.
Protocol 1 braucht niemand und es ist etwas unsicherer.
In der sshd_config wäre das folgende Zeile:
Protocol 2
Keinen root Login erlauben.
Wenn man der alleinige Administrator des Systems ist ist es ganz einfach. Man erstellt sich einen normalen User (Hansi) der in der Linux Gruppe wheel ist. Nun vergibt man dem User Hansi ein kryptisches Passwort (~9 Zeichen mit nem Sonderzeichen) und erlaubt in der sshd_config ausschließlich diesem User einen Login, das geht mit folgender Zeile:
AllowUsers hansi
Dies verschafft uns wiedereinmal eine geringere Angriffsfläche. Der Angreifer müsste jetzt schon den Usernamen kennen bevor er eine Bruteforceattacke versucht. Den User root gibt’s ja auf jedem Linux System und ist deswegen meist der erste mit dem sie es versuchen. (bei *buntu Systemen wurde der root User ja schon etwas entschärft, da ist sowieso kein direkter root Login möglich)
Selbst wenn der Angreifer nun den User Hansi knackt, wäre er nicht root. Da müsste er nun ein zweites Passwort knacken ...
Optional: Die Verbindungsversuche limitieren.
Mit iptables kann man schön festlegen wieviel Verbindungen pro Minute auf ein Port aufgemacht werden dürfen. Das ist aber eher optional und für Services gedacht die auf dem Standardport laufen und die von Scannern/Scripten abgegrast werden.
NetworkerZ empfiehlt: Ich kann das Tool fail2ban empfehlen, es überwacht die auth.log und setzt automatisch dynamische IPTables Regeln, falls mehrere Loginversuche registriert werden.
SFTP für mehrere Nutzer?
Ist relativ einfach möglich. Linux User anlegen und per SSH einloggen erlauben. Aber einfach heißt leider auch unsicher. Die können sich eben nicht nur per SFTP einloggen sondern auch per SSH und bekommen dann eine normale Linux Shell. Dies lässt sich etwas weniger einfach mit RSSH umgehen. Das ist im Prinzip eine Login Shell (wie bash) die für User verwendet werden kann die nur SFTP/SCP Funktionalität benötigen und sich explizit nicht per normalen SSH verbinden sollen.
Um das ganze noch sicherer zu machen sollte man ein chroot verwenden. So werden die SFTP user dann in ein Unterverzeichnis eingesperrt und können nicht auf die Dateien des restlichen Systems zugreifen. Hier gibt’s dazu ein schönes Howto: http://gentoo-wiki.com/HOWTO_SFTP_Server_(chrooted,_without_shell)
Das sind mal die ersten und wichtigsten Punkte. Wird erweitert, wenn jemand Beispiele für spezielle Software hat, immer her damit
Kritik immer erwünscht, bin alles andere als gut in Themen strukturiert wiedergeben
Zuletzt bearbeitet: