Debian Server / vServer grundlegend absichern

Debian Server / vServer grundlegend absichern
Photo by FLY:D / Unsplash

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
Eingabe im Terminal um Verbindung zum Server herzustellen

(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
Eingabe um Paketquellen aktualisieren

Ausführen der Updates:

sudo apt upgrade
Eingabe um gefundene Upgrades zu installieren

Nicht mehr benötigte Pakete vom System automatisch entfernen lassen:

sudo apt autoremove
Eingabe um nicht mehr benötigte Pakete zu entfernen

Ändern des Zeichensatzes

sudo dpkg-reconfigure locales
Eingabe um den Assistenten "Konfiguriere locales" zu starten

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.
Ausgabe nach Bestätigung mit "Ok"

Anpassen der Zeitzone

sudo timedatectl set-timezone "Europe/Berlin"
Eingabe um die Zeitzone zu ändern

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
Eingabe um Passwort für "root" zu ändern

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
Ausgabe nach erfolgreicher Änderung des Passworts

Wir testen das Passwort bevor wir mehr Arbeit in den Server investieren:

exit
Eingabe - Verbindung trennen
ssh root@HOSTNAME/IP
Eingabe - Verbindung mit neuem Passwort neu aufbauen

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
Eingabe um neuen Benutzer anzulegen
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:
Ausgabe / Abfrage eines Passworts

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]
Abfrage weiterer Informationen und beispielhafte Eingaben.

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
Eingabe um dem neuen Benutzer die Gruppe "sudo" zuzuweisen

Wir loggen uns jetzt direkt mit dem neuen Benutzer ein um root auszusperren.

exit
ssh viertelwissen@HOSTNAME/IP
Eingaben - Verbindung erneut trennen und mit neu erstelltem Benutzer anmelden

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
Eingabe - Sicherheitskopie der sshd_config im home-Verzeichnis

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:
Ausgabe erste Verwendung "sudo" - Abfrage unseres Passworts

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
Eingabe - Öffnen der sshd_config im Editor "nano"

Wir suchen in der Datei einen Eintrag der in etwa so aussehen sollte:

PermitRootLogin yes
#PermitRootLogin yes
#PermitRootLogin no
Eine dieser Zeilen sollte in der sshd_config zu finden sein

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
So soll die Zeile geändert, oder am Ende der Daei ergänzt aussehen

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
Eingabe um sshd neu zu starten

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
Eingabe - Verbinden auf den Server in neuem "Terminal" Fenster um sicher zu gehen keinen Fehler gemacht zu haben der uns aussperrt

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
Eingabe - Abmelden vom Server
ssh root@HOSTNAME/IP
Eingabe - Verbindungsversuch auf den Server als "root"

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).
Passwortabfrage mit richtigem und falschem Passwort testen

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
Eingabe - "ufw" über apt installieren

Testen ob die Installation erfolgreich war:

sudo ufw status
Eingabe - "ufw" Status abfragen
Status: inactive
Ausgabe - "ufw" installiert und inaktiv
💡
Aktivieren wir die Firewall jetzt genau so ist der Server zu. KEINE Verbindung wäre mehr möglich.

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"
Eingabe - Ausnahme für Port 22 über TCP einrichten. Damit sind SSH Verbindungen möglich.
Rules updated
Rules updated (v6)
Ausgabe - Bestätigung der Regeländerungen für ipv4 und ipv6

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
Eingabe - Ausgabe der "ufw"-Regeln
/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
Ausgabe

Wir haben die Bestätigung. Damit können wir mehr oder weniger beruhigt die Firewall starten

sudo ufw enable
Eingabe - Aktivieren der Firewall

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
Ausgabe

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.

💡
Alles was von außen erreichbar sein soll muss jetzt mit dem Entsprechend angepassten Befehl über ufw freigegeben werden.
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
Eingabe - Herunterladen und ausführen des CrowdSec Installationsscripts
-bash: curl: Kommando nicht gefunden.
Ausgabe - In meinem Fall war curl auf dem Server nicht vorinstalliert. Bekommt ihr diese Meldung nicht steigt ihr bei "CrowdSec über apt installieren" wieder ein.

Wir holen die Installation von "curl" nach.

sudo apt install curl
Eingabe - Herunterladen und ausführen des CrowdSec Installationsscripts
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]
Ausgabe - Installation "curl" - Nachfrage ob wir das wirklich möchten

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
Eingabe - Herunterladen und ausführen des CrowdSec Installationsscripts
The repository is setup! You can now install packages.
Ausgabe - Nur die letzte Zeile. Wir haben die Vorbereitungen getroffen und können ...

CrowdSec über apt installieren

sudo apt install crowdsec
Eingabe - CrowdSec über apt installieren

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
Ausgabe - Erfolgreiche CrowdSec Einrichtung

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
Eingabe - CrowdSec Firewall-Bouncer installieren

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
Eingabe - CrowdSec Blocklist Mirror installieren
sudo systemctl start crowdsec-blocklist-mirror
Eingabe - CrowdSec Blocklist Mirror service hinzufügen und starten.

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

Join the Viertelwissen Discord Server!
Check out the Viertelwissen community on Discord - hang out with 17 other members and enjoy free voice and text chat.