secure-shell

Secure Shell ssh

Dienste:

  • Bereitstellen einer Kommandozeile (Shell) auf einem entferntem Rechner
  • Sichere verschlüsselte Dateiübertragung von und zu einem entferntem Rechner
  • sicherer Tunnel)

Umsetzung:

  • Client-Server Architektur unter Benutzung von Public/Private Key Technologie

Überlicherweise verbindet sich ein Client mit einem Server indem eine Verbindung (connection) aufgebaut wird, eine Authentifikation stattfindet und dann eine (remote) Shell auf dem Client zur Verfügung steht (Pseudo-Terminal). Dabei gibt es verschiedene Möglichkeiten der Authentifikation (abhängig von der gegenseitigen Unterschützung und den Präferenzen des Client und Server), wie z.B. Passwörter oder Schlüsselaustausch.

Der lokale Rechner an dem die Nutzerin sitzt, ist also der Client. Der entfernte Rechner ist der Server.

Implementation openssh

Programme von openssh

  • ssh client
  • sshd server daemon
  • ssh-keygen Programm zum Erzeugen des private-pubic Schlüsselpaares
  • ssh-add und ssh-agent Werkzeuge zum Managen der Schlüssel zur Authentifikation
  • ssh-keyscan Herunterladen der öffentlichen Schlüssel von den Servern
  • sftp-server Server-Prozess für Dateiübertragung via SFTP
  • sftp und scp Client-Werkzeuge für die Dateiübertragung

aus der ssh man-Page:

ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine.It is intended to provide secure encrypted communications between two untrusted hosts over an insecure network."

Mit ssh kann man sich auf einem entfernten Rechner einloggen und hat typischerweise so eine Kommandozeile, wie eine bash-Shell, zur Verfügung. Dies leisten auch telnet und rlogin. Diese sollten aber aus Sicherheitsgründen in der Praxis nicht mehr verwendet werden.

Auf dem Rechner, auf dem Sie sich einloggen, muss ein ssh-Server, d.h. ein ssh-Dämonenprozess (sshd), laufen. Firewalls dürfen den Port 22 nicht blockieren.

Nutzung:

  • falls der lokale username der gleiche ist, wie auf dem entfernten Rechner:
    • ssh rechnername
  • sonst
    • ssh username@rechnername oder ssh -l username rechnername

Beispiel: herta@ssh uranus-ai.f4.htw-berlin.de

ssh öffnet eine TCP-Verbindung auf dem ssh-Standardport 22. Dann sendet der Server seinen Fingerprint (Hash des Server Public-Key) zur Verifikation. Falls der Server dem Client noch nicht bekannt ist, erhält der/die Nutzer/in eine Warnung bzw. einen Hinweis, ob er den Fingerprint akzeptiert.

The authenticity of host 'uranus-ai.f4.htw-berlin.de (...)' can't be established. ... key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added .... to the list of known hosts.


Die Idee dahinter ist, dass der/die Server-Administrator/in die Fingerprints im Vorfeld verteilt. So kann gewährleistet werden, dass sich der Client nicht mit einem falschen Server (Spoofing) verbindet (durch Prüfung der Identität des Servers). Dies wird allerdings oft nicht so gehandhabt und Clients akzeptieren in der Regel die Verbindung. Die Server-Schlüssel werden (nach dem Akzeptieren) beim Client in der Datei ~/.ssh/known_hosts eingetragen und beim nächsten Verbinden wird, die Verbindung ohne einen solchen Hinweis akzeptiert.

Die systemweite Konfiguration ist in /etc/ssh. Im Verzeichnis ~/.ssh liegen die öffentlichen und privaten Schlüssel der Nutzer/innen.

Nicht interaktive Nutzung

mittels:

  • ssh username@rechnername kommando optionen

Falls mehrere Kommandos ausgeführt werden sollen, kann man hierzu auch here-Dokumente verwenden.

Secure Copy scp

Mit scp lässt sich eine Datei zwischen Rechnern kopieren. scp wird analog cp genutzt. Es wird lediglich zusätzlich bei der Quelle bzw. dem Ziel der der Rechnername mit dem Nutzer:innennamen eingegeben.

Beispiele:

Vom lokalen Rechner auf entferneten Rechner kopieren:

  • scp mytext.txt herta@uranus-ai.f4.htw-berlin.de:~/meineTexte/

Vom entfernten Rechner auf lokalen Rechner kopieren:

  • scp herta@uranus-ai.f4.htw-berlin.de:~/meineTexte/mytext2.txt ~/meineEntwuerfe/

Secure File Transfer Protocol sftp

Mit sftp kann man sicher und verschlüsselt Dateien übertragen. Dies wird z.B. von Webhoster als Möglichkeit angeboten, Webseiten auf die Server hochzuladen. Hier ist oft ssh bzw. scp nicht aktiviert bzw. die Anfragen auf die entsprechenden Ports werden von einer Firewall geblockt.

Logins ohne Passwort

Mittels Public-Key Kryptographie kann man ssh etc. auch nutzen, ohne dass man jedes mal ein Passwort eingeben muss.

Dazu erzeugt man zuerst mittels ssh-keygen ein entsprechenden Schlüsselpaar:

ssh-keygen -t rsa

So werden tyischerweise zwei Dateien im versteckten Verzeichnis ~/.ssh/ angelegt:

  • ~/.ssh/id_rsa der private Schlüssel
  • ~/.ssh/id_rsa.pub der korresponiderende öffentliche Schlüssel

Hier kann man eine Passphrase angeben, die den privaten Schlüssel mit einem symmetischen Verfahren verschlüsselt. Falls man hier eine Passphrase angibt, muss/müsste man diese jedesmal bei der Nutzung wieder eingeben, um den privaten Schlüssel auf dem lokalen Rechner verwenden zu können. Hiermit hätte man nicht viel gewonnen, da man nun immer eine Passphrase eingeben muss. Der SSH-Agent speichert die privaten Schlüssel und stellt diese bei den Logins im Hintergrund zur Verfügung. Die Schüssel können dazu mittels ssh-add dem Agent hinzugefügt werden, mehr siehe z.B. https://wiki.ubuntuusers.de/SSH/#Der-SSH-Agent.

Im nächsten Schritt kopiert man mittels scp den öffentichen Schlüssel auf den entferneten Rechner (login noch mit Passwort):

scp ~/.ssh/id_rsa.pub herta@uranus-ai.f4.htw-berlin.de:~/.ssh/id_rsa.pub

Anschließend muss man noch auf dem entferneten Rechner den öffentlichen Schlüssel an die Datei ~/.ssh/authorized_keys anhängen, z.B. mit

ssh herta@uranus-ai.f4.htw-berlin.de cd ~/.ssh/ cat id_rsa.pub >> authorized_keys

oder alternativ mit einer Befehlskette:
cat .ssh/id_rsa.pub | ssh herta@uranus-ai.f4.htw-berlin.de 'cat >> ~/.ssh/authorized_keys'

oder "bequemer" mit
ssh-copy-id -i .ssh/id_rsa.pub ssh herta@uranus-ai.f4.htw-berlin.de

Danach kann man sich ohne Passwort mit dem entfernten Rechner mit ssh, scp etc. verbinden.

Konfiguration ~/.ssh/ssh_config

Hinweis: In der Datei ~/.ssh/ssh_config lassen sich für die einzelnen Serververbindungen verschiedene Konfigurationsoptionen zu Usernamen, Portforwarding etc. angeben, mehr siehe in der Manpage: man ssh_config.

SSH-Tunnel: Local Port Forwarding

Mittels local port forwarding kann eine TCP-Verbindung verschlüsseln, indem man sie in einem "ssh-Tunnel" führt. D.h. die Verbindung läuft zwischen dem Client und dem Server über den Standard ssh-Port (TCP-IP). Lokal und remote können beliebige Ports angesprochen werden. Auf dem Server natürlich der Port des Anwendungsdienstes. Ein SSH-Tunnel kann auch hilfreich sein, wenn die meisten Ports durch eine Firewall geblockt sind, ssh aber möglich ist.

Einen solchen Tunnel kan man durch folgenden Befehl einrichten:

ssh -f -N -C -L 9999:uranus-ai.f4.htw-berlin:10555 -l herta uranus-ai.f4.htw-berlin

  • -f "forkt" den ssh-Prozess in den Hintergrund und die shell wird nicht blockiert, sondern kann genutzt werden.
  • -N bewirkt, dass das dem Remote Rechner kein Kommando ausgeführt wird. Wir wollen ja nur den Tunnel aufbauen.
  • -C komprimiert die Verbindung, sodass die Datenübertragung beschleunigt wird.
  • -L 9999:uranus-ai.f4.htw-berlin:10555 bewirkt, dass bei einer "TCP-Anfrage" auf den lokalen Port 9999 des Klient diese in den ssh-Tunnel umgeleitet wird. Die Anfrage wird auf dem entfernten Rechner (hier uranus-ai.f4.htw-berlin) an Port 10555 wetergeleitet.
  • hinter -l folgt der Nutzername auf dem entfernten Rechner.

So wird eine Anfrage auf dem lokalen Rechner localhost:9999 zu einer Anfrage auf dem Server zu localhost:10555 (localhost entspricht hier uranus-ai.f4.htw-berlin).

Neben dem lokal port forwarding gibt es noch weitere Möglichkeiten von ssh-Tunneln, siehe z.B.

SSH-Server

Damit man sich auf einer entfernten Maschine per ssh etc. einloggen kann, müssen dort natürlich die entsprechenen Dienste installiert und konfiguriert sein.

  • openssh-server: Server-Software
  • /etc/ssh/sshd_config: Ort der Konfigurationsdatei

mehr siehe z.B. https://wiki.ubuntuusers.de/SSH/#Der-SSH-Server