Debian Server / vServer grundlegend absichern
Voraussetzungen:
Ihr solltet einen Server oder vServer beim Anbieter eures Vertrauens gemietet haben. Im Beispiel benutzen wir einen Server von netcup. Hier konntest du dich entscheiden welche Version des Systems installiert wurde. Die Standardinstallation von netcup ist debian 10 minimal. Wir gehen von Debian 11 aus. Solltet ihr Debian 10 nutzen haben wir einen Anleitung wie wir auf Debian 11 Upgraden.
Wir gehen davon aus, dass ihr einen neuen Server habt. Oder euch noch mit "root" auf dem Server anmelden könnt und genau das ist der erste Schritt.
Anmeldung auf dem Server mit "root"
ssh root@HOSTNAME/IP
(Sollte das nicht möglich sein meldet euch mit einem Benutzer der über "sudo"-Rechte verfügt auf dem Server an.)
Server auf den neusten Stand bringen
Aktualisieren der Paketquellen:
sudo apt update
Ausführen der Updates:
sudo apt upgrade
Nicht mehr benötigte Pakete vom System automatisch entfernen lassen:
sudo apt autoremove
Ändern des Zeichensatzes
sudo dpkg-reconfigure locales
Konfiguriere locales - Zu generierende Locales wählen
Pfeiltasten hoch/runter Einträge suchen
Leertaste Einträge wählen oder abwählen.
Wir wählen:
[*] de_DE.UTF-8 UTF-8
[*] en-GB.UTF-8 UTF-8
[*] en_US.UTF-8 UTF-8
Die Taste "Tabulator" bringt uns nach unten um zwischen "Ok" und "Abbrechen" wählen zu können.

Konfiguriere locales - Standard-Standorteinstellung für die Systemumgebung.
Pfeiltasten "hoch" und "runter" wählen den Eintrag
Pfeiltaste "rechts" oder "Tabulator" bringen uns nach unten um "Ok" oder "Abbruch" zu wählen.

Generating locales (this might take a while)...
en_US.UTF-8... done
de_DE.UTF-8... done
en_GB.UTF-8... done
Generation complete.
Anpassen der Zeitzone
sudo timedatectl set-timezone "Europe/Berlin"
Passwort des root-Benutzeraccounts ändern
Das "root"-Passwort wurde uns irgendwie mitgeteilt, egal auf welchem Weg, wir wollen mitwissende möglichst ausschließen.
passwd root
An der Stelle muss auf Passwort Manager hingewiesen werden, denn wir möchten natürlich in Zukunft nicht überall das gleiche oder leicht abgewandelte Passwörter verwenden.
Ich habe das Passwort an der Stelle 40-stellig generieren lassen - von Bitwarden - es direkt in die Zwischenablage kopiert und einen Eintrag im Passwortmanager gespeichert/geprüft bevor ich das Passwort verwende. Sicher ist sicher. Ich möchte mit dem Server ja nicht direkt von vorn beginnen ...
Wir geben oder fügen das neue Passwort ein, drücken "ENTER".
Passwort ein zweites mal eingeben oder -fügen, "ENTER".
passwd: Passwort erfolgreich geändert
Wir testen das Passwort bevor wir mehr Arbeit in den Server investieren:
exit
ssh root@HOSTNAME/IP
Ihr seid wieder auf dem Server? Perfekt!
Neuen Benuter mit "sudo"-Rechten erstellen & "root" die Anmeldung verbieten
Unseren Recherchen mit dem Telekom Honeypot nach erfolgen die meisten Versuche, auf einen Server über ssh einzubrechen, mit dem User "root".
Wir sprechen hier nicht von gezielten Angriffen, sondern von standarisierten Angriffen die auf jeden Server automatisch erfolgen sobald dieser im Netz ist.
Darüber hinaus ist es keine gute Idee immer mit root Rechten zu arbeiten. Wir legen uns also einen neuen Benutzer an von dem nicht jeder ausgeht ihn auf dem System zu finden.
In meinem Fall soll "viertelwissen" der Name des neuen Benutzers werden.
An allen Stellen an denen wir hier "viertelwissen" schreiben benutzt ihr den Benutzernamen eurer Wahl.
adduser viertelwissen
Lege Benutzer »viertelwissen« an ...
Lege neue Gruppe »viertelwissen« (1000) an ...
Lege neuen Benutzer »viertelwissen« (1000) mit Gruppe »viertelwissen« an ...
Erstelle Home-Verzeichnis »/home/viertelwissen« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues Passwort ein:
Wir vergeben wieder ein sicheres Passwort.
Geben Sie ein neues Passwort ein:
Geben Sie das neue Passwort erneut ein:
passwd: Passwort erfolgreich geändert
Benutzerinformationen für viertelwissen werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
Vollständiger Name []: viertelwissen
Zimmernummer []: 69
Telefon geschäftlich []:
Telefon privat []:
Sonstiges []:
Sind die Informationen korrekt? [J/n]
Wir bestätigen mit "J" oder "Y" und einer Betätigung der "ENTER"-Taste
Der neue Benutzer soll natürlich auch die Möglichkeit haben "sudo" zu nutzen.
Dazu fügen wir ihn der Gruppe "sudo" hinzu:
usermod -aG sudo viertelwissen
Wir loggen uns jetzt direkt mit dem neuen Benutzer ein um root auszusperren.
exit
ssh viertelwissen@HOSTNAME/IP
Sind wir erfolgreich mit dem neuen Benutzer verbunden können wir root aussperren. Hierzu verändern wir die Datei sshd_config
Wir legen uns eine Sicherungskopie an - für den Fall der Fälle:
sudo cp /etc/ssh/sshd_config /home/viertelwissen/sshd_config.bkup
ACHTUNG: Das ist der erste Befehl den dieser Nutzer mit "sudo" benutzt also werden ihm einige Dinge erklärt:
Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:
#1) Respektieren Sie die Privatsphäre anderer.
#2) Denken Sie nach, bevor Sie tippen.
#3) Mit großer Macht kommt große Verantwortung.
[sudo] Passwort für viertelwissen:
Wir geben unser Benutzerpasswort ein.
Datei im Editor öffnen und bearbeiten. (wir suchen die einträge von unten nach oben, denn so wird die Datei abgearbeitet.)
sudo nano /etc/ssh/sshd_config
Wir suchen in der Datei einen Eintrag der in etwa so aussehen sollte:
PermitRootLogin yes
#PermitRootLogin yes
#PermitRootLogin no
Eine dieser Varianten sollte in der Datei zu finden sein. Diese ändern wir.
Finden wir diese Zeile nicht ergänzen wir sie einfach ganz unten in der Datei.
Welche Variante auf euch zu trifft ist egal. Die Zeile soll so aussehen:
PermitRootLogin no
Speichern und schließen des Editors.
Im Falle des "nano"-Editors erledigen wir das mit STRG+O, bestätigen die Rückfrage mit Y und schließen mit STRG+X
ACHTUNG: Wir testen jetzt bevor wir uns abmelden ob die neuen Einstellungen funktionieren!
SSH-Dienst neu starten
sudo systemctl restart sshd
Dieses Fenster lassen wir jetzt genau so stehen und öffnen ein neues Terminal-Fenster.
In dem neuen Fenster oder Tab verbinden wir uns jetzt neu auf den Server:
ssh viertelwissen@HOSTNAME/IP
Kommen wir mit der Passworteingabe ganz normal auf den Server haben wir uns zumindest nicht ausgesperrt. Perfekt.
In diesem neuen Fenster testen wir jetzt ob wir uns noch als root verbinden können:
exit
ssh root@HOSTNAME/IP
Der Server sollte uns nach einem Passwort fragen und egal ob wir das korrekte oder ein falsches Passwort eingeben sollte er das ablehnen:
root@HOSTNAME/IP's password: (Richtiges Passwort)
Permission denied, please try again.
root@HOSTNAME/IP's password: (falsches Passwort zum Test)
Permission denied, please try again.
root@HOSTNAME/IP's password: (Richtiges Passwort)
root@HOSTNAME/IP: Permission denied (publickey,password).
Wir haben den root damit ausgesperrt und können uns mit dem/den user/n die wir definiert haben weiterhin per SSH auf den Server verbinden.
Firewall
Wir benutzen dafür "ufw"
sudo apt install ufw
Testen ob die Installation erfolgreich war:
sudo ufw status
Status: inactive
Freigabe/Allow für SSH-Zugriff erstellen
SSH läuft in der Standardkonfiguration über den Port 22, also geben wir diesen frei.
sudo ufw allow 22/tcp comment "SSH"
Rules updated
Rules updated (v6)
Der Ausgabe vertrauen wir nicht blind. Wir schauen uns an ob die Zeilen wirklich in der Konfiguration ankamen
sudo grep '^### tuple' /etc/ufw/user*.rules
/etc/ufw/user6.rules:### tuple ### allow tcp 22 ::/0 any ::/0 in comment=535348
/etc/ufw/user.rules:### tuple ### allow tcp 22 0.0.0.0/0 any 0.0.0.0/0 in comment=535348
Wir haben die Bestätigung. Damit können wir mehr oder weniger beruhigt die Firewall starten
sudo ufw enable
Nachfrage mit dem Hinweis, dass eine mangelhafte Konfiguration dazu führen kann den Server nicht mehr über SSH erreichen zu können. Wir bestätigen mit "y" und betätigen die "ENTER"-Taste.
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Damit haben wir eine Firewall und die Ausnahme für SSH eingerichtet. Es sind alle Ports zu, außer dem Port 22 für eine erfolgreiche SSH-Verbindung.
Mehr dazu in unserem gesonderten Eintrag über "ufw" -> LINK
Der Server ist jetzt nur noch über SSH im Internet erreichbar und der Benutzer root kann sich nicht mehr anmelden. Wir sind fast fertig.
CrowdSec - Angriffe auf SSH und die Systemanmeldung automatisch abwehren
Natürlich möchten wir bekannte Angreifer aussperren und zu viele Anmeldeversuche über SSH mit falschen Eingaben sperren. Automatisch. Dazu installieren und verwenden wir "CrowdSec".
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
-bash: curl: Kommando nicht gefunden.
Wir holen die Installation von "curl" nach.
sudo apt install curl
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
Die folgenden zusätzlichen Pakete werden installiert:libcurl4
Die folgenden NEUEN Pakete werden installiert:curl libcurl
40 aktualisiert, 2 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 615 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 1.196 kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]
Wir antworten mit "y", bestätigen mit "ENTER". Nächster Versuch.
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
The repository is setup! You can now install packages.
CrowdSec über apt installieren
sudo apt install crowdsec
Die letzten Zeilen der Ausgabe sagen uns welche "collections" Installiert wurden und bestätigen damit die erfolgreiche Installation.
INFO[06.11.2022:19:04:51] crowdsec_wizard: Installing collection 'crowdsecurity/linux'INFO
[06.11.2022:19:04:53] crowdsec_wizard: Installing collection 'crowdsecurity/sshd'
Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec.service → /lib/systemd/system/crowdsec.service.
You can always run the configuration again interactively by using '/usr/share/crowdsec/wizard.sh -c
CrowdSec überwacht demnach Anmeldungen am System selbst "collection 'crowdsecurity/linux'" und Anmeldungen über SSH "Installing collection 'crowdsecurity/sshd'".
Diese Daten müssen jetzt noch in Firewall regeln umgesetzt werden, angreifende IPs werden damit automatisch gesperrt. Das erledigen bei CrowdSec sogenannte "Bouncer" (Rausschmeisser).
sudo apt install crowdsec-firewall-bouncer-iptables
Wir erkennen jetzt zu viele falsche Angaben von Usern oder Passworten bei der Systemanmeldung und über SSH nicht nur, sondern sperren auch IPs die dafür verantwortlich sind. Allerdings gibt es sehr viele IPs die nur dafür da sind Server anzugreifen. Diese können wir über CrowdSec auch sperren lassen. Jede IP die CrowdSec auf unserem Server blockt wird an CrowdSec übermittelt - fällt diese IP auf verschiedenen Servern oft genug negativ auf kommt sie auf eine zentrale Blocklist.
Wir profitieren noch nicht von der "Cummunity" Funktion von CrowdSec, damit können wir automatisch bekannte IP Adressen welche die CrowdSec Community als schädlich ermittelt hat blocken lassen. Finden wir gut - installieren und benutzen wir.
sudo apt install crowdsec-blocklist-mirror
sudo systemctl start crowdsec-blocklist-mirror
Damit haben wir unseren Server grundlegend abgesichert.
Wir haben deiner Meinung nach etwas vergessen was hier unbedingt rein soll?
Du hast Fragen dazu?
Schau doch gerne mal auf unserem Discord Server vorbei oder hinterlasse uns einen Kommentar