Root-Server absichern #1: Nutzer und SSH

Blick auf drei Serverschränke. Durch die Mesh-Gitter sind viele Switche und Netzwerkkabel zu sehen.
Photo by Taylor Vick / Unsplash

Obwohl ich seit vielen Jahren offizieller Mieter eines Root-Servers bin habe ich bisher kaum Ahnung davon, wie man einen Server richtig einrichtet und absichert. In der Vergangenheit hat das ein Freund von mir übernommen, mit welchem ich mir den Server teile. Dank eines Black Friday Angebots meines Hosters Netcup haben wir für den selben Monatspreis einen deutlich besseren Server ergattern können. Nachteil: Man muss alles von A nach B migrieren. Und ratet mal, wer keine Zeit hatte... Da ich mit diesem Blog hier auf dem neuen Server starten wollte habe ich mich also selbst hingesetzt.

🗨️
Wie am Titel erkennbar werde ich zur Absicherung eines Root-Server eine kleine Reihe veröffentlichen. Solltest du noch keine Erfahrung haben, dann lies dir auf jeden Fall die ganze Reihe durch, sobald sie komplett veröffentlicht ist.

Ich gehe einfach mal davon aus, dass du bereits ein Linux auf deinem Server installiert hast. Wir verwenden ein Debian 11 minimal, also komplett ohne grafische Oberfläche. Diese und die folgenden Anleitungen beziehen sich dementsprechend auf Debian, sollte aber auch unter Ubuntu funktionieren.

Nachdem ein Server vom Anbieter eingerichtet wurde sind wenige Programme vorinstalliert und die meisten Konfigurationen auf den Standardwerten. Als Zugangsdaten erhälst du normalerweise eine IP und/oder Domain sowie ein Passwort für den Nutzer root. Der Nutzer root ist dabei der Administrator des Linux Systems und kann in einem System alles tun und lassen. Deine erste Aufgabe sollte also sein, diesen Benutzer maximal abzusichern.

Einrichtung der Nutzer

sudo statt root

Der erste Schritt ist, dass du dich per SSH auf deinen Server verbindest. Wenn du Linux oder MacOS verwendest, dann hast du Glück. SSH ist auf den beiden System bereits vorinstalliert. Ab Windows 10 liefert Microsoft SSH auch auf ihrem Betriebssystem mit. Öffne also das Terminal (Linux, MacOS) oder PowerShell beziehungsweise die Eingabeaufforderung. Mit folgendem Befehl verbindest du dich mit deinem Server:

ssh USERNAME@domain.tdl

Dabei ersetzt du domain.tdl durch deine eigene Domain oder die IP Adresse, die dir mitgeteilt wurde. Nach dem Drücken der ENTER Taste wird dir bei der ersten Verbindung die Frage gestellt, ob der Fingerabdruck des Servers stimmt. Bestätige die Abfrage, indem du yes eintippst und ENTER drückst. Als nächstes musst du das Passwort eingeben, welches dir dein Hoster geschickt hat. Herzlich Willkommen auf deinem Server.

Als erstes solltest du dein System auf den aktuellen Stand bringen! Bei Debian geht das mit:
apt-get update && apt-get upgrade

Der Benutzer root ist der Administrator des Systems und hat alle Berechtigungen auf dem System. Daher solltest du dich niemals wieder als root auf deinem System anmelden. Im Gegenteil, wir werden später sogar den Login als root verhindern. Dazu musst du aber erst eine Alternative schaffen - ein neuer Benutzer.

adduser USERNAME
Anlegen eines Benutzers

USERNAME ersetzt du durch einen Benutzernamen deiner Wahl. Anschließend muss du ein Passwort vergeben und dieses nochmals bestätigen. Die weiteren Fragen sind optional, du kannst sie also leer lassen. Damit hast du einen Nutzer mit eingeschränkten Rechten erstellt. Dieser wird der einzige Benutzer sein, mit welchem du dich auf deinen Server verbindest.

Terminal-Anzeige des Befehls sudo adduser peter.
Anlageprozess für den Nutzers 'peter'.

Da der Benutzer nur beschränkte Rechte hat, musst du aber eine Möglichkeit schaffen, dass du auch Befehle und Aktionen ausführen kannst, für welche die Berechtigungen eines Administrators benötigt werden. Linux hat hier schon seit vielen Jahren ein einfaches Tool mitgeliefert, welches dir erlaubt, einen Befehl mit root Berechtigung auszuführen: sudo. Damit aber nicht jeder sudo benutzen kann muss ein Benutzer der Benutzergruppe sudo zugewiesen werden. Dies machst du mit folgendem Befehl:

usermod -aG sudo USERNAME
Benutzer der Gruppe root hinzufügen

Zusammenfassung:

  • Du hast dich das erste Mal mit deinem Server verbunden.
  • Dein System ist jetzt auf den neusten Stand.
  • Ein Nutzer mit eingeschränkten Rechten ist angelegt.
  • Der Nutzer wurde der Benutzergruppe root zugewiesen und ist damit in der Lage sudo zur Erweiterung der Rechte zu verwenden.

SSH Konfiguration

root verbieten und SSH Konfiguration anpassen

Trenne die Verbindung zum Server, indem du exit eintippst, und verbinde dich anschließend wieder. Aber nicht als root, sondern mit deinem Usernamen.

ssh USERNAME@domain.tdl

SSH ist die einzige direkte Verbindung zu deinem Server. Es ist die Eingangstüre auf dein System und sollte auch entsprechend abgesichert werden. Also alte unsichere Funktionen deaktivieren, root Login verbieten und verhindern, dass du dauerhaft angemeldet bleibst.

# Kernic.net example configuration
# 
# Settings not present are used with default value.

# Include additional configuration files, when present
Include /etc/ssh/sshd_config.d/*.conf

# Close connection after 4*15=60 seconds of no response
ClientAliveCountMax 4		# Maximum number of connection checks
ClientALiveInterval 15		# Time between the checks

# Protocol and authentication
PasswordAuthentication yes	# Password login allowed? Prefere keyfile!
PermitRootLogin no		# Disallow login as root
Protocol 2			# Use newest and most secure SSH version
X11Forwarding no			# No X11 session allowed
PrintMotd no			# Don't show MOTD after login
ChallengeResponseAuthentication no

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem       sftp    /usr/lib/openssh/sftp-server
/etc/ssh/sshd_config

Um die Konfiguration von SSH zu bearbeiten öffnest du die Konfigurationsdatei mit Administratorrechten. Das wird also dein erster Einsatz von sudo. Du musst die Ausführung des Befehls deshalb nochmals mit deinem Passwort bestätigen. Ich verwende den Texteditor nano, natürlich kannst du auch jeden anderen verwenden. Wenn du nano verwendest, dann kannst du mit STRG+K ganze Zeilen löschen, mit STRG+X speicherst du die Datei und schließt sie. Die Befehle unten am Rand werden mit STRG+Buchstabe aufgerufen.^X heißt also STRG+X.

Befehlsleiste des Texteditors nano
Befehle von nano. STRG+Buchstage
sudo cp /etc/ssh/sshd_config ~/sshd_config_backup
sudo nano /etc/ssh/sshd_config
Backup der Konfiguration anlegen, dann mit nano öffnen.

Du hast nun die Konfiguration verändert und gespeichert. Dadurch wird diese aber nicht automatisch aktiv. SSH liest die Konfiguration beim Start ein. Da SSH schon läuft wird die Konfiguration also nicht neu eingelesen. Du musst also SSH einmal neu starten, damit deine Einstellungen aktiv werden - je nach Linux entweder ssh oder sshd.

sudo systemctl restart ssh	# Debian/Ubuntu
sudo systemctl restart sshd 	# CentOS / RHEL / Fedora / Redhat Linux
Trenne auf keinen Fall deine SSH Verbindung nach einer Konfigurationsänderung, prüfe erst deinen Zugriff!

Stelle jetzt auf jeden Fall sicher, dass du dich nicht ausgesperrt hast. Das merkst du in deiner aktuellen Verbindung nicht, da diese von einer Änderung der Konfiguration nicht unterbrochen wird. Trotzdem könntest du dich ausgesperrt haben. Deshalb öffne ein neues zusätzliches Terminal oder Putty Fenster und verbinde dich wieder mit deinem Server. Funktioniert dies, dann hast du dich nicht ausgesperrt und kannst die alte Verbindung beenden.

exit
Trenne die Verbindung zu deinem Server.

Du hast es geschafft. Dein Server ist jetzt schon ein ganzes Stück sicherer. Es werden nur aktuelle Protokolle zur Verbindung verwendet und der Login als Administrator ist unterbunden.

Ergänzungen

Weitere Tipps und Erklärungen

SSH Port ändern

In vielen Anleitungen wird auch empfohlen, dass man den Port von SSH abändert. Dieser ist standardmäßig auf den Port 22 festgelegt. Die Idee dahinter ist, dass ein potentieller Angreifer seine Attacke zuerst auf Port 22 versuchen wird. Eine Änderung des Ports soll einen Angriff erschweren. Das hat zu früheren Zeiten eventuell Sinn ergeben, als jede Verbindung aufwändig war. Heutzutage dauert es keine 20 Millisekunden, bis der tatsächliche Port gefunden wurde. Im Gegenzug müsstest du aber bei jeder Verbindung angeben, dass diese nicht über den normalen Port läuft. Also Komfortverlust für dich, ohne wirklichen Sicherheitsgewinn.

Keyfile statt Passwort

In der oben genannten Konfiguration haben wir die Anmeldung mit einem Passwort erlaubt. Dies ist für Änfänger die einfachste Option mit dem geringsten Risiko, sich auszusperren. Besser ist aber die Anmeldung mit einem Keyfile und Passwörter nicht zuzulassen. Dann kann niemand das Passwort erraten und ohne Keyfile kommt man nicht auf den Server. Das Risiko: Verlierst du die Keyfile, dann verlierst du den Zugriff auf deinen Server.

Wegen des Risikos und weil die Erstellung von keyfiles je nach Betriebssystem anders funktioniert wird es dazu eine getrennte Anleitung in dieser Serie geben.

Schaue über den Tellerrand

Diese Anleitung wurde so geschrieben, dass du auch ohne Wissen deinen Server absichern kannst. Das ist gut für den Start, aber es ist auch wichtig, dass du verstehst, was du tust und warum. Lies dir auf jeden Fall die Dokumentationen der hier ewähnten Programme und Befehle durch. Eine Kurzbeschreibung bekommst du, wenn du ein --help an den Befehl anhängst. Weitere Details findest du, indem du den Befehl in einer Suchmaschine suchst oder Folgendes eingibst:

man BEFEHL

Versuche zu verstehen, was du tust und warum du es tust. Nur dann kannst du einschätzen, ob meine Anleitung richtig, aktuell und für dich passend ist!

Warte! Hier gibt's noch mehr!