Linux Server absichern - Erste Schritte unter Debian 10

14.12.2019
In diesem Beitrag möchte ich möglichst kompakt beschreiben, wie man einen frisch aufgesetzten Debian Server absichern kann. Diese Anleitung richtet sich vor allem an Neulinge mit wenig Erfahrung beim Administrieren von Linux Servern. Beschrieben wird nachfolgend, wie man unter Debian 10 'buster' einen SSH KeyLogin einrichtet und SSH, fail2ban, portsentry und einen Mail Alarm konfiguriert.

Hinweis: Im Allgemeinen wird empfohlen, SSH Login für den root User zu verbieten und einen neuen User anzulegen. Ich persönlich halte das allerdings für vernachlässigbar, sofern man ausschließlich mit einem KeyLogin arbeitet und sonst kein Anderer SSH Zugriff auf den Server hat. Daher habe ich mich entschieden, diese Anleitung für einen Login mit root User zu schreiben. Nutzt ihr stattdessen einen User mit sudo Rechten, müsst ihr natürlich bei den angegebenen Befehlen "sudo" voranstellen, z.B. "sudo apt update".

Sprungmarken: KeyLogin SSH Konfiguration fail2ban Portsentry E-Mail Alarm bei SSH Login

Server Update

Bevor ihr mit der eigentlichen Anleitung beginnt, solltet ihr vorab den Server updaten!

apt update && apt dist-upgrade && apt autoremove && apt clean

Mit dieser Befehls-Kombination aktualisiert ihr die Paketquellen, sucht nach Upgrades für installierte Pakete, entfernt überflüssige Abhängigkeiten und leert den Paket-Cache. "dist-upgrade" hat gegenüber "upgrade" den Vorteil, dass zusätzlich geprüft wird, ob durch geänderte Abhängigkeiten bestimmte Pakete deinstalliert bzw. neu installiert werden sollten.

KeyLogin

Als Erstes solltet ihr einen KeyLogin einrichten. Beim KeyLogin findet die Authentifizierung mittels Public-Key-Verfahren statt. Dazu wird ein Schlüsselpaar erstellt, der öffentliche Teil der Schlüssel bleibt auf dem Server und der private Teil wird heruntergeladen und von eurem Client (eurem PC) zu Authentifizierung gegenüber dem Server genutzt. Theoretisch wäre damit ein Login ohne Eingabe eines Passwortes möglich, ich empfehle aber ausdrücklich die Verwendung einer Passphrase - also ein Passwort für die Verwendung des Schlüssels. Zuerst generiert ihr auf dem Server das Schlüsselpaar.

ssh-keygen -b 4096

Den Speicherort bestätigt ihr einfach mit Enter, anschließend solltet ihr eine Passphrase eingeben. Ihr könnt das mit Enter auslassen, ich rate allerdings davon ab. Nachdem ihr die Passphrase zwei mal eingegeben habt, wird das Schlüsselpaar erstellt. Dieses befindet sich nun in /root/.ssh. Nun fügt ihr den öffentlichen Schlüssel zu den authorisierten Schlüsseln hinzu, damit der Server diesen akzeptiert und löscht ihn anschließend.

touch /root/.ssh/authorized_keys
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
rm /root/.ssh/id_rsa.pub

Nun benötigt ihr den privaten Schlüssel in /root/.ssh/id_rsa auf eurem PC, ihr könnt entweder die Datei runterladen oder diese mit nano öffnen und den Inhalt kopieren.

Wenn ihr Putty nutzt, müsst ihr den Key vorher mit dem Programm puttygen umwandeln, da Putty mit dem OpenSSH Key nichts anfangen kann. Öffnet puttygen, klickt oben auf "Conversions", anschließend auf "Import Key" und wählt euren privaten Schlüssel (id_rsa) aus. Ihr müsst dann die Passphrase für den Zugriff eingeben. Danach müsst ihr nur noch auf "Safe private Key" klicken und den Schlüssel an einem Ort eurer Wahl abspeichern. Diesen Schlüssel müsst ihr in Putty dann unter "Connection > SSH > Auth" bei "Private key file for authentication" auswählen. Nun solltet ihr euch mit diesem Schlüssel via SSH anmelden können.

SSH Konfiguration

Nachdem ihr nun ein KeyLogin eingerichtet habt, solltet ihr noch die SSH Konfiguration anpassen.

nano /etc/ssh/sshd_config

Tipp: Mit Strg + O speichert ihr und mit Strg + X schließt ihr eine Datei in nano.

Als erstes solltet ihr den SSH Port ändern, da die meisten automatisierten Angriffe über SSH auf den Standardport 22 abzielen. Ihr könnt diesen im Prinzip frei wählen, solltet allerdings einen Port wählen, der nicht von einem anderen Dienst genutzt wird, z.B. 30022. Desweiteren solltet ihr den SSH Login via Passwort verbieten, damit nur ein Login mit dem gerade erstellten Key möglich ist. Ändert bzw. ergänzt folgendes in der Konfigurationsdatei:

Port 30022
LoginGraceTime 120
AllowGroups root
PermitRootLogin without-password
PasswordAuthentication no
MaxAuthTries 1
StrictModes yes

Mit diesen Einstellungen habt ihr den Port auf 30022 geändert, die Zeit bis die Verbindung ohne Login abbricht auf 120 Sekunden gesetzt, nur der Gruppe root den Login erlaubt, für Root Login und Login mit anderen Usern die Verwendung eines Passwortes untersagt, die maximalen Versuche zum Login bis SSH die Verbindung trennt definiert und den Strict Mode aktiviert (für die Gesamtsicherheit rund um OpenSSH wichtig).

Nach der Anpassung der Konfiguration müsst ihr den SSH Daemon neustarten. Wichtig: Beendet nicht die aktuelle Verbindung, bevor ihr den Login mit Key über den neuen Port in einer neuen Session getestet habt, ansonsten könntet ihr euch selbst von eurem Server aussperren.

service ssh restart

Ihr müsst nun in eurem SSH Programm, z.B. Putty, den Port auf den von euch definierten ändern und solltet euch dann nur noch mit eurem Key einloggen können.

fail2ban

Mit fail2ban sollen Server gegen DoS- und Brute-Force-Angriffe abgesichert werden. Dazu prüft fail2ban nach definierbaren Mustern Logdateien und sperrt bei einer konfigurierbaren Anzahl von fehlgeschlagenen Zugriffen die entsprechede IP Adresse für eine konfigurierbare Zeit. Um fail2ban zu nutzen, muss es natürlich zuerst installiert werden, was ihr mit folgendem Befehl tun könnt

apt install fail2ban

Anschließend müsst ihr die Konfigurationsdatei jail.conf in eine neue Datei jail.local kopieren, da Erstere bei jeder Paketaktualisierung überschrieben wird. Das könnt ihr bequem mit cp machen.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Nun könnt ihr die Konfiguration noch nach euren Wünschen anpassen.

nano /etc/fail2ban/jail.local

Ihr könnt darin zum einen die Standard Parameter festlegen, zum anderen aber auch Parameter für einzelne Dienste wie beispielsweise SSH. Fürs Erste reicht es, nur die Standard Parameter zu ändern und euch ggf. später mit der Konfiguration für einzelne Dienste zu beschäftigen. Ich würde euch empfehlen, die Zeit der Sperrung und die Zeit innerhalb welcher Versuche gezählt werden zu erhöhen und die maximalen Versuche zu verringern. Dies geschieht über folgende Parameter:

[DEFAULT]
bantime  = 86400
findtime  = 1200
maxretry = 3

In diesem Beispiel wird die Zeit der Sperrung auf 86400 Sekunden bzw. 24 Stunden, die Zeit innerhalb welcher Versuche gezählt werden auf 1200 Sekunden bzw. 20 Minuten und die Anzahl der maximalen Versuche auf 3 gesetzt.

Nach der Anpassung der Konfiguration müsst ihr fail2ban einmal neustarten.

service fail2ban restart

Damit ist fail2ban fürs erste fertig eingerichtet und ihr besser vor DoS- und Brute-Force-Angriffen geschützt.

Portsentry

Mit Portsentry sollen Portscans gegen einen Server unterbunden werden. Mit einem Portscan könnten Angreifer feststellen, welche Dienste auf welchem Port laufen bzw. welche Ports geöffnet sind. Neben dem Erfassen eines Portscans in einer Logdatei, kann Portsentry auch definierte Aktionen bei einem Portscan ausführen, beispielsweise die entsprechender IP Adresse aussperren. Um Portsentry zu nutzen, muss es natürlich zuerst installiert werden, was ihr mit folgendem Befehl tun könnt.

apt install portsentry

Es erscheint ein Hinweis, dass Portsentry ohne entsprechende Konfiguration nichts weiter tut, außer einen Logeintrag zu schreiben. Dies bestätigt ihr mit Enter, anschließend könnt ihr die Konfigurationsdatei bearbeiten.

nano /etc/portsentry/portsentry.conf

und bei den nachfolgenden Einträgen die 0 zu 1 ändern, damit Portsentry die Scans nicht nur in eine Logdatei schreibt, sondern auch blockiert.

BLOCK_UDP="1"
BLOCK_TCP="1"

Außerdem könnt ihr sinnvollerweise noch die folgende Zeile direkt darunter schreiben:

KILL_ROUTE="/sbin/iptables -A INPUT -s $TARGET$ -j DROP"

Damit weist ihr Portsentry an, die entsprechende IP Adresse bei einem Portscan auszusperren. Danach könnt ihr die Datei speichern und direkt die nächste Konfigurationsdatei öffnen, die noch bearbeitet werden sollte.

nano /etc/default/portsentry

Hier sollten die beiden Einträge wie nachfolgend angepasst werden:

TCP_MODE="stcp"
UDP_MODE="sudp"

Durch diese Anpassung reagiert Portsentry sensibler und erkennt auch Stealth-Scans.

Nach der Anpassung der Konfiguration müsst ihr Portsentry einmal neustarten.

service portsentry restart

Damit ist Portsentry fertig eingerichtet und sollte fortan alle Portscans gegen euren Server abwehren.

E-Mail Alarm bei SSH Login

Update Juni 2020: Ich selbst nutze den nachfolgend beschriebenen Alarm per E-Mail nicht mehr, sondern stattdessen eine automatische Nachricht via Telegram. Der Vorteil ist, dass kein Mailserver bzw. MTA auf dem Server installiert werden muss. Bei Interesse findet ihr die entsprechende Anleitung dort: Telegram Nachricht bei SSH Login

Wer möchte, kann zum Abschluss noch einen Mail Alarm für das SSH Login einrichten. So erhaltet ihr eine E-Mail, wenn sich Jemand via SSH einloggt und bemerkt sofort einen fremden Login. Dafür benötigt ihr natürlich einen "Mail Server" bzw. Mail Transfer Agent (MTA). Für eine kleine send-only Lösung empfehle ich exim4. Dieser ist wie folgt zu installieren und konfigurieren.

apt install exim4-daemon-light mailutils
dpkg-reconfigure exim4-config

In der durch den zweiten Befehl auftauchenden "Mail Server configuration" wählt ihr internet site; mail is sent and received directly using SMTP und bestätigt dies mit Enter. Anschließend kommen noch einige andere Konfigurationsmöglichkeiten, die könnt ihr aber alle einfach mit Enter bestätigen, da der Standard für eure Zwecke reichen sollte. Im Anschluss könnt ihr auch schon den Mail Versand mit folgendem Befehl testen.

echo "Das ist eine Testmail" | mail -s Testnachricht mail@domain.tld

Die E-Mail Adresse (Empfänger) müsst ihr natürlich anpassen.

Nun könnt ihr auch schon den Mail Alarm einrichten. Erstellt dazu eine Datei im profile.d Ordner, damit diese bei einem SSH Login automatisch ausgeführt wird.

nano /etc/profile.d/mailalert.sh

Füllt diese dann mit folgendem Inhalt:

echo "login from `who --ips | awk 'END{print $5}'` on `hostname -f` detected" | mail -s "ssh login alert" mail@domain.tld

Diese Mail informiert euch darüber, mit welcher IP Adresse sich zuletzt auf dem entsprechenden Server (hostname) eingeloggt wurde. Ihr könnt den Inhalt natürlich nach euren Vorlieben anpassen. Anschließend passt ihr noch die Rechte der Datei an, damit diese ausführbar ist.

chmod +x /etc/profile.d/mailalert

Das war es auch schon, bei eurem nächsten SSH Login solltet ihr eine E-Mail erhalten.

Zuletzt bearbeitet: 14.06.2020