updated: | 2024 11. September |
published: | 2022 11. April |
ssh - Secure Shell
SSH - Einrichtung und Anwendung.Was ist SSH?
Mit Secure Shell (ssh-wiki) wird über ein lokales oder öffentliches Netzwerk auf ein PC zugegriffen. Der PC kann somit über einen entfernten Ort gewartet werden.
Funktionsprinzip
Ein lokaler PC (Client) verbindet sich zu einem weit entfernten sog. Remote PC (Server) um Befehle auf dem Remote PC auszuführen. Durch dieses Prinzip kann der Remote PC aus der Ferne gewartet werden. Die Verbindung erfolgt verschlüsselt.

IP-Adresse abfragen
Für eine Verbindung mit dem Remote PC (Server) wird dessen IP-Adresse benötigt.
# Linux Bash
ip -br address
ip -br a
ifconfig
# Windows CMD
ipconfig
nslookup # IP des lokalen PC
nslookup \\Netzlaufwerk # IP des Netzlaufwerkes
Mit dem Programm cURL kann die IP-Adresse von “außen” abgefragt werden.
curl https://ifconfig.me
curl https://ifconfig.co
curl https://icanhazip.com
curl https://ipecho.net/plain
curl -w "n" -s https://api.ipify.org
- Abfrage der öffentlichen IP-Adresse im Browser:
- https://www.wieistmeineip.de/
- https://www.dein-ip-check.de/
- https://www.heise.de/tools/
Netzwerk-Scan
Für weitere Abfragen der IP-Adressen im lokalen Netz, wie z.B. des Routers, ist ein Netzwerkscanner sinnvoll.
ip route
ip n
arp -n
nmap -sP -oG - 192.168.188.0/24 # Eingrenzen auf Subnetz
# als root ausführen
arp-scan -l
netdiscover # beenden mit [Strg] + [C]
netdiscover -r 192.168.188.0/24 # Eingrenzen auf Subnetz 192.168.188.xxx
Hinweis: Auf den Seiten des Elektronik-Kompendium werden Netzwerktechniken sehr umfangreich erläutert.
SSH Options
ssh -G host # SSH-Konfiguration anzeigen
ssh -Q help # Anzeigen aller möglichen Abfragen
ssh -Q cipher # Abfrage Support cipher
ssh -Q cipher-auth
ssh -Q mac
ssh -Q kex
ssh -Q key
ssh -Q hostkeyalgorithms
ssh -Q pubkeyacceptedkeytypes
# oder mit nmap alle cipher-Methoden anzeigen
nmap -p22 -n -sV --script ssh2-enum-algos localhost
Aufbau einer lokalen SSH Verbindung und Test
Mit dem Programm telnet
kann vom lokalen PC (Client) getestet werden, ob auf dem Remote PC ein SSH-Server aktiviert ist. Als Adresse ist die IP des Remote PC und der Port (meistens 22) einzugeben.
telnet 192.168.188.5 22
Trying 192.168.100.3...
Connected to 192.168.100.3.
Escape character is '^]'.
SSH-2.0-OpenSSH_3.8.1p1 Debian-8.sarge.4
telnet: Unable to connect to remote host: Connection refused
Der Abbruch erfolgt mit: [Strg]+[C]. Ist der Test nicht erfolgreich, dann ist vermutlich der SSH-Daemon (Server) auf dem Remote PC nicht gestartet oder nicht installiert oder wird durch eine Firewall blockiert.
Auf Linuxsystem befindet sich ein SSH-Server, ein Client und alles weitere meist in den Paketen mit der Bezeichnung: openssh
.
Sind diese Pakete installiert, kann der SSH-Server gestartet werden.
systemctl start ssh
# SSH-Server beim Bootvorgang starten
systemctl enable ssh
# Check
systemctl is-enabled ssh
systemctl is-active ssh
systemctl status ssh
Eine Verbindung zu einem Remote PC (Server) kann vom einem lokalen PC (Client) mit folgendem Befehl aufgebaut werden:
ssh username@192.168.188.5
Benutzerkonfiguration
Mit der Konfigurationsdatei ~/.ssh/config
besteht die Möglichkeit verschiedene SSH-Optionen zu speichern, die für eine Verbindung mit dem Remote-PC notwendig sind.
Insbesondere wenn die Verbindung mit vielen Optionen auf der Befehlszeile erfolgt, erleichtert eine benutzerdefinierte Konfigurationsdatei die Tastenanschläge.
Host LinuxV5
HostName xxx.xxx.xxx.xxx
User ed
Port 1234
IdentityFile ~/.ssh/keyfile.priv
- Mit dieser Konfigurationsdatei wird der Befehl:
ssh -i ~/.ssh/keyfile.priv -p 1234 ed@xxx.xxx.xxx.xxx
vereinfacht zu:ssh LinuxV5
. Alternativ kann auch ein Alias definiert werden. - Der SSH-Client liest seine Optionen nach folgender Präzedenzanordnung:
- Optionen von der Befehlszeile
- Optionen aus der Benutzerkonfiguration
~/.ssh/config
- Optionen aus der Benutzerkonfiguration
- Systemweite Optionen aus
/etc/ssh/ssh_config
- Systemweite Optionen aus
Z.B. überschreibt der Aufruf ssh -o "User=fred" LinuxV5
die entsprechende Option.
SSH-Fingerprint
Ein Fingerprint ist eine Folge von Zahlen und Buchstaben, mit der die Echtheit durch einfaches manuelles Vergleichen überprüft werden kann.
Beim ersten Verbindungsaufbau wird ein Fingerprint des SSH-Servers auf der Clientmaschine ausgegeben. Die Ausgabe sieht z.B. so aus:
The authenticity of host '192.168.1.33 (192.168.1.33)' can't be established.
RSA key fingerprint is 29:78:a1:2c:56:b8:88:d5:e7:cb:5d:dd:17:b9:bb:5b.
Are you sure you want to continue connecting (yes/no)?
Nach dem Bestätigen mit yes wird der Fingerprint auf dem Client in der Datei ~/.ssh/known_hosts
gespeichert.
Mit dem Fingerprint kann geprüft werden, ob tatsächlich der angesprochene Server auf der anderen Seite der Leitung ist.
Den Fingerprint des SSH-Servers erfährt man auf dem Remote PC mit dem Systemprogramm ssh-keygen
.
#RSA-Fingerprint
ssh-keygen -f /etc/ssh/ssh_host_rsa_key.pub -l
#ECDSA-Fingerprint
ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key.pub -l
# weitere Optionen
-E sha256 Ausgabeformat sha256 (default)
-E md5 Ausgabeformat md5
#Alle Server-Fingerprint's (Remote PC)
for keyfile in /etc/ssh/*.pub; do ssh-keygen -l -f "${keyfile}"; done
#Alle User-Fingerprint's (Host PC)
for keyfile in ~/.ssh/id*.pub; do ssh-keygen -l -f "${keyfile}"; done
Wer auf sicher gehen möchte, lässt sich vom Administrator des Servers die Ausgabe des Fingerprints mitgeben (evtl. ausdrucken) um eine manuelle Prüfung vor zunehmen.
SSH einrichten für PublicKey Authentifizierung
Die allgemeine Vorgehensweise ist folgende:
- Erstellen eines Schlüsselpaar (privater und öffentlicher Schlüssel) auf dem lokalen PC (Client).
- Kopieren bzw. anhängen des öffentlichen Schlüssel in die Datei
~./.ssh/authorized_key
des Nutzers auf dem Remote PC (SSH-Server). - Anschalten der Public Key Authentifizierung auf dem Remote PC (SSH-Server) in der Datei
/etc/ssh/sshd_config
. - Nach einem erfolgreichen Test kann die Authentifizierungsmethode mit SSH-Passwort abgeschaltet werden.
Um in einem lokalen Netzwerk von einem Client (PC1) auf einem Rechner (PC2 mit SSH-Server) ohne Passworteingaben zu zugreifen, kann ein Schlüsselpaar auf dem Client erzeugt werden.
# RSA Schlüsselpaar erzeugen (Standard)
ssh-keygen -t rsa
# ED25519 Schlüsselpaar ist besser
ssh-keygen -t ed25519 -a420 -f ~/.ssh/id_25519_Name
ssh-keygen -t ed25519 -a100 -N "" -f ~/.ssh/keyfile_Name -C "Comment"
# Öffentl. Schlüssel vom Client zum Remote-PC kopieren, und anhängen an ~/.ssh/authorized_key
ssh-copy-id -i ~/.ssh/keyfile_Name username@192.168.188.5
# Einloggen mit keyfile
ssh -i .ssh/keyfile_Name username@192.168.188.5
Im Verzeichnis ~/.ssh
des lokalen PC (Client) werden zwei Dateien angelegt. Eine Datei mit dem privaten Schlüssel und eine Datei mit dem öffentlichen Schlüssel *.pub
.
Der öffentliche Schlüssel des lokalen PC (Client) muss auf dem Remote PC (SSH-Server) an die Datei ~/.ssh/authorized_keys
angehängt werden.
- Auf dem Remote PC (SSH-Server) sind in der Serverkonfigurationsdatei:
/etc/ssh/sshd_config
für die PublicKey Authentifizierung mindestens folgende Einstellungen vorzunehmen: - PubkeyAuthentication yes
- PasswordAuthentication no
Im Prinzip erfolgt eine Verbindung mit PublicKey Authentifizierung so, dass der Server mit dem öffentlichen Schlüssel des Client einen Datenblock generiert und dem Client sendet. Der Client entschlüsselt den Datenblock mit seinem privaten Schlüssel und teilt dem Server das Ergebnis mit. Damit ist der Client gegenüber dem Server identifiziert.
Passphrase
Erfolgt der Zugriff über ein öffentliches Netzwerk (Internet), dann sollte der öffentliche Schlüssel noch mit einer Passphrase abgesichert werden. Denn wenn jemand den öffentlichen Schlüssel zufällig erhält, hat er kein Zugriff ohne Passphrase.
Mit dem Befehl ssh-keygen -y -P "" -f keyfile.priv
kann abgefragt werden, ob eine Passphrase vorliegt oder nicht. Wird der öffentliche Schlüssel ausgegeben,
dann existiert keine Passphrase (Option: -P “”). Eine Ausgabe mit: incorrect passphrase ...
zeigt an, dass eine Passphrase vorhanden ist.
SSH-Agent
Beim ersten Login wird die Passphrase abgefragt. Eine weitere Eingabe der Passphrase erübrigt sich durch die Nutzung des Authentifizierungsvermittlers ssh-agent
.
Für Tests können die aktuell hinterlegten Identitäten durch den Befehl ssh-add -D
gelöscht werden. Entsprechend wird weiterhin die Passphrase verlangt.
Um zu überprüfen ob ein SSH-Agent auf dem System existiert, stehen folgende Mittel zur Verfügung:
echo $SSH_AUTH_SOCK # Umgebungsvariable existiert
ssh-add -l # Liste alle bekannten Fingerabdrücke auf
ps -ef | grep ssh-agent # Prozess ist vorhanden
Kopieren mit scp
Mit scp
(Secure File Copy) können Dateien und ganze Verzeichnis kopiert werden.
scp Dateiname username@192.168.188.5:./Unterverzeichnis
scp Verzeichnis -r username@192.168.188.5:./Unterverzeichnis
# Beispiel mit PublicKey Authentifizierungsdatei und Port 5555
scp -i ~/.ssh/keyfile.priv -P 5555 Dateiname username@192.168.188.5:./Unterverzeichnis
SSH-Verbindung aus einem öffentlichen Netz (Internet)
Für eine Verbindung zu einem entfernten PC (Server, Remote) aus dem Internet müssen drei Bedingungen erfüllt sein.
- Der SSH-Daemon (Server) muss am Remote-PC gestartet sein.
- Auf dem Router muss der Port 22 (oder ein anderer Port) freigegeben werden. Im Weiteren muss der Port an den Remote-PC (SSH-Server) weitergeleitet werden.
- Die öffentliche IP-Adresse muss bekannt sein.
- Um die Sicherheit zu erhöhen sollte unbedingt die PublicKey Authentifizierung mittels Passphrase eingerichtet werden.
SSH absichern
In der Datei /etc/ssh/sshd_config
werden Einstellungen zum SSH-Server vorgenommen.
Root-Login unterbinden
Um Root-Login auf dem SSH-Server zu unterbinden, muss in der Datei /etc/ssh/sshd_config
der Schalter PermitRootLogin auf no gesetzt werden.
Außerdem ist ein neuer Benutzer anzulegen.
# User "ed" anlegen und der Gruppe sudo zuweisen
useradd -m -s /bin/bash ed
usermod -aG sudo ed
passwd ed
# PermitRootLogin in Datei /etc/ssh/sshd_config
sed -ri -e 's/\ *PermitRootLogin\ *yes/PermitRootLogin no/' -e 's/#\ *PermitRootLogin no/PermitRootLogin no/' /etc/ssh/sshd_config
# SSh-Server neustart
systemctl restart ssh
Authentifizierungen abschalten
- Nicht benötigte Authentifizierungsmethoden abschalten.
- HostbasedAuthentication no
- KerberosAuthentication no
sed -ri -e 's/\ *HostbasedAuthentication\ *yes/HostbasedAuthentication no/' -e 's/#\ *HostbasedAuthentication no/HostbasedAuthentication no/' /etc/ssh/sshd_config
sed -ri -e 's/\ *KerberosAuthentication\ *yes/KerberosAuthentication no/' -e 's/#\ *KerberosAuthentication no/KerberosAuthentication no/' /etc/ssh/sshd_config
Bestimmte Benutzer erlauben oder blockieren
Die Optionen AllowUsers
und DenyUsers
gestattet es Benutzer die Anmeldung zu erlauben oder zu blockieren. Ist keine dieser Optionen vorhanden, dann können sich erstmal alle anmelden.
AllowUsers UserName1 UserName2
DenyUsers UserName4 UserName5
SSH abhärten
Lies mal diesen interessanten Artikel zum absichern von OpenSSH in Ubuntu Jammy 22.04.
In der Datei /etc/hosts.deny
kann durch die Zeile sshd: ALL EXCEPT LOCAL
alle Anfragen von außen blockiert werden.
Um einzelnen IP-Adressen den Zugang zu erlauben wird in der Datei /etc/hosts.allow
die IP eingetragen. Z.B. sshd: XX.YYY.XXX.ZZZ
oder sshd: xx.xx.xxx.*
.
Fehlermeldungen, Probleme
SSH-Verbindung ist gescheitert wg. Firewall
- Problem:
- Die SSH-Verbindung kommt nicht zustande und endet mit der Meldung:
ssh: connect to host 192.168.188.8 port 22: Connection refused
- Erläuterung:
- Ein möglicher Grund für eine erfolglose Verbindung zu einem SSH-Server kann eine Firewall auf dem Remote-PC (SSH-Server) sein.
- Lösung:
- UFW-Firewall prüfen und ggf. einrichten.
Signatur nicht korrekt
- Problem:
- Nach dem Einlogen zu einem SSH-Server erscheint folgende Meldung:
client_global_hostkeys_private_confirm: server gave bad signature for ECDSA key 1: incorrect signature
Fingerprint
- Problem:
- Bei einem Verbindungsaufbau zu einem Server stimmt der Fingerprint nicht überein und es erscheint folgende Meldung:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
- Erläuterung:
- Der Fingerprint des Server-PC (Remote, SSH-Server) in der Datei
/etc/ssh/*.pub
stimmt nicht mit dem Fingerprint des Client-PC in der Datei~/.ssh/known_hosts
überein, weil z.B. ein neues System auf dem Server aufgesetzt wurde. - Lösung:
- Die Zeile mit der Server-Adresse xx.xxx.xxx.xxx. in der Datei
~/.ssh/known_hosts
entfernen/löschen.
# Suche nach der Server-Adresse in der Datei know_host ssh-keygen -F 192.168.100.3 # Entfernt die Server-Adresse aus der Datei know_host ssh-keygen -R 192.168.100.3
Zugriffsrechte
- Problem:
- Gelegentlich taucht folgende Meldung bei einer Datei mit öffentlichem Schlüssel auf (z.B. bei diesem Befehl:
ssh-keygen -y -f keyfile.pub
).
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions ... are too open.
- Erläuterung:
- Die Zugriffsrechte der Datei sind nicht optimal gesetzt.
- Lösung:
- Zugriffrechte ändern.
chmod 0600 keyfile.pub # oder chmod a-wrx,u+wr keyfile.pub # oder für alles unter ~/.ssh chmod -R go= ~/.ssh
Weblinks
ssh-wiki-cff
ssh-wiki
ssh-wiki-ubuntu
ssh-absichern
ssh-absichern-modern
Elektronik-Kompendium
Netzwerktechniken