SSH auf Linux-Servern grundlegend Absichern

Nachfolgend möchte ich mit euch meine Erfahrungen und Gedanken zum Absichern des ssh-Dienstes bei Linux-Servern teilen:

Wer kennt es nicht: man mietet sich einen Linux-Server bei einen Cloud/Server Anbieter und bekommt dann automatisiert den Zugang, welcher in der Regel „root“ mit einem Passwort und einer IP ist.
Damit sollten wir uns erstmal Zugang zum System verschaffen und als erstes mit

passwd

das root Passwort ändern, damit nur noch wir das Passwort kennen.

Ein guter Ansatz ist es den ssh-Port zu ändern, um einfach die üblichen Bots und Skripte, welchen diesen abklopfen und ausprobieren, keine Angriffsfäche zu bieten.
Das ganze ist einfach gemacht in der

/etc/ssh/sshd_config

dort suchen wir uns den Punkt

#Port 22

und ändern diesen in

Port 2007

zum Beispiel.
Anschließend noch mit

systemctl restart ssh.service


oder

service ssh restart


den ssh-Dienst neustarten.

Die Wahl des Portes ist frei, sollte aber anhand der standardisierten Ports und Portgrenzen gewählt werden, also irgendetwas zwischen 1024 und 65635.

Kontrollieren kann man das mit

ss -tulpen | grep ssh

auf neueren Linux-Distributionen und mit

netstat -tulpen | grep ssh

auf älteren.

Die nächste Sache die wir durchdenken sollten ist das die ssh Verbindung mit dem root user zustande kommt.
Also dem user der uneingeschränkt alles auf dem System machen darf. Wollen wir das? Nein natürlich nicht, dementsprechend legen wir uns einen neuen Benutzer dafür an.

useradd -g users -d /home/username -m -s /bin/bash username

Mit useradd realisieren wir das ganze:
-g gibt eine Gruppe mit
-d /pfad/zum/verzeichnis/ gibt ein home-Verzeichnis an
-m gibt an das home-Verzeichnis zu erstellen, sofern es noch nicht existiert
-s definiert die shell
zum Schluss kommt der Name des neuen Benutzers

kleiner Tipp: je verrückter eure Benutzernamen sind desto unwahrscheinlicher ist es das diese bei brute-force-Angriffen benutzt werden.

Mit

passwd username

kann dann das Passwort für den Benutzer geändert werden(sofern das root macht oder mit sudo).

Mit diesem neuen Benutzer sollten wir uns anschließend verbinden um das zu testen einfach

ssh -p vergebenderport username@host

und anschließend sollte gesteste werden ob der user zu root werden darf mit

su -

.

Damit können wir die ssh-Anmeldung von root verbieten, dazu genen wir wieder in die

/etc/ssh/sshd_config

und dort ändern wir

PermitRootLogin yes

zu

PermitRootLogin no

.
Das ganze schließt root schon per ssh aus aber um noch etwas mehr Kontrolle und Sicherheit zu bekommen definieren wir zusätzlich explizit Benutzer die sich per ssh anmelden dürfen:
Dazu wieder in der

/etc/ssh/sshd_config

folgenden hinzufügen:

AllowUsers username optionaluser
DenyUsers root
DenyGroups root


spechern und den ssh-Dienst neustarten.

Zur Kontrolle können wir eine neue Session öffnen und uns per ssh mit root anmelden, sollte: Access denied zurück kommen, ist alles so wie wir es wollen.
Mit dem erstellten Benutzer sollte es funktionieren und wir können zu root wechseln.

Jetzt wäre es noch ideal wenn wir die Anmeldung ohne Passwort realisieren könnten, da jedes Passwort mit brute-force früher oder später geknackt werden kann.
Dementsprechend stellen wir die ssh-Anmeldung auf ssh mit keyfile um.
Dazu erstellen wir mit

ssh-keygen -b 4096 -t rsa -f .ssh/filename


unser Schlüsselpaar.
-b gibt die bitlänge des Schlüssels an
-t den Typ
-f Pfad und Name des Schlüsselpaares

Beim erstellen wird nach einer Passphrase gefragt, diese würde ich empfehlen zu vergeben, weil die den Schlüssel an sich schützt.(für die Benutzung in Skripten etc. ist das natürlich ungeeignet, da muss dann der Kompromiss eingegangen werden und keine Passphrase vergeben werden, also 2x mit „enter“ bestätigen beim erstellen)

Jetzt wo wir ein ssh-Schlüsselpaar haben, muss das auch auf dem Server hinterlegt werden. Das geht am leichtesten mit

ssh-copy-id -i ~/.ssh/filename -p vergebenderport user@host

. Damit wird per ssh eine Anmeldung am Server gemacht und der ssh-Schlüssel(pubkey) bei dem angegebenen Benutzer in der

.ssh/authorized_keys

hinterlegt.

Jetzt machen wir alles dicht:
Nachdem der ssh-Schlüssel auf dem Server ist gehen wir auf dem Server in die

/etc/ssh/sshd_config

und suchen

PasswordAuthentication yes

ändern das in

PasswordAuthentication no

und kontrollieren ob

PubkeyAuthentication yes

gesetzt ist. Danach wieder den ssh-Dienst neustarten und WICHTIG mit einer neuen Session das ganze testen mit

ssh -p vergebenderport -i .ssh/filename user@host

.
Funktioniert das nicht und ihr habt keine Session mehr zum Server offen habt ihr den Hauptgewinn gezogen, weil ihr entweder Cloud/Hosting-Provider-Konsole euch anmelden dürft(mit denen zu arbeiten ist immer etwas sperrig) oder ihr dürft euer Server neu installieren und von vorne anfangen weil ihr euch ausgesperrt habt.

An dieser Stelle ist folgendes umgesetzt:
Nur ausgewählte Benutzer können sich mit ssh-Schlüssel am Server anmelden und der ssh-Port ist geändert. Bedeutet das Bots euch nicht finden und wenn doch kann euer ssh-Server nicht gebrute-forced werde, da mit Passwort sich nicht angemeldet werden darf.
Das hat natürlich die Konsequenz das eure ssh-Schlüssel extrem wichtig sind, also backupen und nicht an andere weitergeben!!!

Die Admins unter euch werden das große Glück haben das eure Arbeitsstätte eine feste IP hat. Das können wir uns zu nutze machen und ssh noch etwas mehr absichern indem wir die Anmeldung von einer IP abhänig machen und alles was nicht von dieser IP kommt wird geblockt.

Das ganze realisieren wir in der

/etc/hosts.allow


und dort fügt ihr

sshd: eureip


ein und in der

/etc/hosts.deny


wird

sshd: ALL


eingefügt und abgespeichert.
Diese Regeln greifen sofort und benötigen keinen neustart des ssh-Dienstes.

Das ganze ist Teil der Youtube Serie von Hauke, Jean und mir und kann hier gefunden werden:
YT Playlist

5 Kommentare zu „SSH auf Linux-Servern grundlegend Absichern“

  1. Sehr nice 😉

    Ich musste allerdings von Putty auf MobaXTerm wechseln damit ich schlussendlich den Loginbefehl an meine Maschine schicken konnte.
    Aber es funktioniert und das ist das wichtigste!

  2. Hi,
    danke für das Feedback.
    Der Befehl setzt das .pub automatisch um vermutlich Tipparbeit zu sparen.
    In der manpage von ssh-copy-id steht unter -i identity_file „… If the filename does not end in .pub this is added…“.
    Und ja dein private key hat definitiv nicht dein System zu verlassen, was er mit ssh-copy-id auch nicht tut.

  3. Hallo,
    danke für die Erklärung und das Video bei Youtube.
    Ich habe folgende Frage:
    Warum lautet der Befehl beim kopieren des ssh-key auf den Server
    ssh-copy-id -i ~/.ssh/filename -p vergebenderport user@host und nicht
    ssh-copy-id -i ~/.ssh/filename.pub -p vergebenderport user@host
    Sollte der Private key nicht nur auf meinem lokalen System bleiben?
    Danke

  4. Das ist die beste Schritt-für-Schritt Anleitung die ich bisher bei YouTube zu Linux gesehen habe. Auf den Punkt, gut erklärt und in einer perfekten Geschwindigkeit zum mitmachen und dabei lernen. Danke!

  5. Ralf Ochsenfahrt

    Sehr gut auf YouTube erklärt. Sachlich hervorragend, unaufgeregt und ohne Schnörkel. BESTENS. Vielen Dank.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht.