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.

IP-Adresse abfragen (lokal)

 # 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.

IP-Adresse abfragen mit cURL

 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.

Netzwerkscan

 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.

Client-PC

 telnet 192.168.188.5 22

telnet - Verbindung erfolgreich

 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 - nicht erfolgreich

 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.

Remote/Server-PC

 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 Verbindung vom Client zum Server

 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.

Benutzerkonfigurationdatei: ~/.ssh/config

 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:
  1. Optionen von der Befehlszeile
  1. Optionen aus der Benutzerkonfiguration ~/.ssh/config
  1. Systemweite Optionen aus /etc/ssh/ssh_config

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:

Client-PC

 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.

Remote/Server-PC

 #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:

  1. Erstellen eines Schlüsselpaar (privater und öffentlicher Schlüssel) auf dem lokalen PC (Client).
  2. Kopieren bzw. anhängen des öffentlichen Schlüssel in die Datei ~./.ssh/authorized_key des Nutzers auf dem Remote PC (SSH-Server).
  3. Anschalten der Public Key Authentifizierung auf dem Remote PC (SSH-Server) in der Datei /etc/ssh/sshd_config.
  4. 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.

Client-PC

 # 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.

Kopieren mi scp

 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.

  1. Der SSH-Daemon (Server) muss am Remote-PC gestartet sein.
  2. 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.
  3. Die öffentliche IP-Adresse muss bekannt sein.
  4. 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

ssh-wiki-cff
ssh-wiki
ssh-wiki-ubuntu
ssh-absichern
ssh-absichern-modern
Elektronik-Kompendium
Netzwerktechniken

Stichworte (tags)