Secure Shell (SSH)

Transcrição

Secure Shell (SSH)
Secure Shell (SSH)
DFN-CERT: Zentrum für sichere Netzdienste GmbH
Oberstraße 14b
D-20144 Hamburg
2. Dezember 2002
Informationsbulletin Dib-2002:01 vom 07.10.2002
letzte Änderung: 07.10.2002
1 Einleitung
In vielen Computernetzwerken werden Daten immer noch ungesichert übertragen. Die Gefahr, dass Dritte vertrauliche Daten abfangen oder verfälschen können, ist vielen Nutzern nicht bewusst. Besonders in
öffentlichen Netzen, wie z. B. dem Internet, ist dieses Risiko hoch.
Dass es sich hierbei nicht nur um ein theoretisches Risiko handelt, belegen die zahlreichen Sicherheitsvorfälle der letzten Jahre. Frei verfügbare Programme, wie z. B. dsniff 1 oder sniffit,2 zeigen sehr
deutlich, wie leicht es ist, ungesicherte Übertragungen abzufangen oder zu manipulieren.
Die Risiken sind vielfältig: Kundendaten und ähnlich vertrauliche Daten, die „irgendwo im Internet“
auftauchen, enthüllte Firmengeheimnisse, Produktionsausfälle, Betrug, ein illegaler „Warez-Server“ oder
ähnlich missbräuchliche Benutzung von wertvollen Ressourcen sind mehr als nur ein Ärgernis. Der mögliche Vertrauensverlust, der finanzielle Schaden, sowie eventuelle rechtliche Folgen sind Teil des Horrorszenarios, dem viele Anwender und Firmen täglich nur knapp entgehen.
Für den Bereich des sicheren „remote login“ und der sicheren Übertragung von Dateien bietet die „Secure Shell“ (SSH) geeignete Werkzeuge für Anwender und Systemadministratoren, um den beschriebenen
Problemen zu begegnen.
2 Was ist SSH?
Der Ausdruck „SSH“ steht sowohl für das Programmpaket SSH, als auch für die eigentliche Anwendung
„ssh“, sowie für das zugrunde liegende Protokoll.
SSH ist als Ersatz für die sog. „R-Tools“ (rsh, rlogin) und telnet gedacht, die unverschlüsselt
arbeiten. In der Regel macht es für den Benutzer keinen Unterschied, ob er mit SSH oder den „R-Tools“
arbeitet.
SSH wurde 1995 von Tatu Ylönen an der Technischen Universität Helsinki als Reaktion auf einen Vorfall, bei dem Passwörter „abgehört“ wurden, entwickelt. SSH hat sich seit dem weit verbreitet, Schätzungen
gehen von mehr als zwei Millionen Benutzern3 aus.
2.1 Definitionen
Um zwischen den Programmen, Protokollen und Implementationen unterscheiden zu können verwendet
dieses Bulletin folgende Definitionen analog zu [SSHTDG].4
1 http://www.monkey.org/~dugsong/dsniff/
2 http://reptile.rug.ac.be/~coder/sniffit/sniffit.html
3 SSH
4 SSH
- The Secure Shell, Daniel J. Barett u. Richard E. Silverman, O’Reilly 2001, ISBN 0-596-00011-1, S.12
- The Secure Shell, Daniel J. Barett u. Richard E. Silverman, O’Reilly 2001, ISBN 0-596-00011-1
1
SSH Ist ein universeller Ausdruck, der sich allgemein auf SSH bezieht und sowohl das Protokoll, als auch
die Software meinen kann.
SSH-1 Das SSH-Protokoll, Version 1.
SSH-2 Das SSH-Protokoll, Version 2.
SSH1 Die ursprüngliche SSH-Implementation von Tatu Ylönen.
SSH2 Das Produkt „SSH Secure Shell“ von SSH Inc.
OpenSSH Die freie SSH-Implementation des OpenBSD-Projektes.
ssh Der SSH-Klient, der in fast allen SSH-Implementationen enthalten ist. Der Klient kann im Fall von
SSH1 und SSH2 auch ssh1, bzw. ssh2 heißen.
sshd Der SSH-Server, der den Dienst SSH bereitstellt.
lokaler Computer bezeichnet den Rechner, auf dem der SSH-Klient ausgeführt wird.
entfernter Computer ist normalerweise ein weiterer Rechner, an dem man sich anmelden möchte.
lokaler Benutzer wird ein Benutzer-Konto genannt das auf einem ‚lokalen Computer‘existiert.
entfernter Benutzer benennt ein Benutzer-Konto, das auf einem entfernten Computer angelegt ist.
Server ist das SSH-Server-Programm, üblicherweise sshd.
Serversystem soll der Computer genannt werden, auf dem ein SSH-Server ausgeführt wird.
Klient soll das Programm heißen, mit dem die Verbindung zu einem SSH-Server aufgebaut wird.
Klientensystem meint den Rechner, auf dem der SSH-Klient läuft.
SSH ist eine inzwischen weit verbreitete5 Software-Lösung, die eine verschlüsselte Kommunikation in
Netzwerken ermöglicht. SSH arbeitet nach einem „Client-Server“-Modell. Die Verschlüsselung ist für den
Benutzer transparent, d. h. er kann in ähnlicher Weise mit SSH arbeiten, wie er es von Programmen wie
telnet, rcp oder ftp gewohnt ist.
In der Regel wird ein SSH-Server von der Systemadministration auf einem Serversystem installiert.
Anwender, die die Dienste des Serversystems nutzen wollen, melden sich mit ihrem SSH-Klienten am
SSH-Server an. Die Authentifizierung kann dabei, je nach Konfiguration, z. B. per Passwort oder mit einem
speziellen, kryptographischen Schlüssel erfolgen.
2.2 Was leistet SSH?
Die Secure Shell bietet:
Verschlüsselte „remote logins“.
Ausführen von Kommandos auf entfernten Systemen.
Verschlüsselte Dateiübertragung mit scp und sftp.
Vertraulichkeit, alle übertragenen Daten werden automatisch verschlüsselt.
Gewährleistung der Datenintegrität durch CRC6 (SSH-1) oder MAC7 (SSH-2)
5 http://www.openssh.org/usage/index.html
6 cyclic
redundancy checking, CRC wird benutzt, um über Prüfsummen Transportfehler zu erkennen
authentication code, Ein MAC wird aus einem (geheimen) Schlüssel, sowie der Eingabe berechnet. Der Hashwert kann
nur mit Kenntnis des Schlüssels geprüft werden.
7 message
2
Die Verwendung von rechnerspezifischen, krypotografischen Schlüsseln hilft DNS- und IP-„Spoofing“
zu erkennen.
Geringer Schulungsaufwand für Benutzer, die vorher mit rsh, rlogin oder telnet gearbeitet
haben.
Datenkompression, z. B. für Wählleitungen.
automatische Umlenkung und Verschlüsselung des X11-Datenverkehrs.
TCP Port-Weiterleitung, SSH kann verschlüsselte „Tunnel“ zu anderen Rechnern aufbauen, über die
auch ungesicherte Protokolle verschlüsselt übertragen werden können.
Plattformunabhängigkeit, SSH ist für fast jedes Betriebsystem (einschliesslich Linux, Mac OS, MS
Windowsund Unix) und für die meisten Hardware-Plattformen verfügbar.
2.3 Was leistet es nicht?
SSH ist ein mächtiges Werkzeug. Es macht ein Netzwerk aber nicht automatisch sicher. Es bietet seinen
Anwendern aber eine sehr gute Hilfestellung, ihr Netzwerk sicherer zu machen.
SSH schützt z.B. nicht bei einer Kompromittierung eines der beteiligten Systeme. So kann z. B. ein
Nutzer mit Systemrechten ihre Passwort- oder Passphraseeingaben auf dem kompromittierten System mitschneiden. Dies ist ein allgemeines Problem, für das SSH keine Lösung anbietet.
2.4 Implementationen
Es existiert eine Vielzahl unterschiedlicher SSH-Implementationen für die meisten Betriebssysteme und
Hardware-Plattformen. Viele Betriebssystemhersteller liefern inzwischen SSH standardmäßig mit aus. 8
Einen Überblick bieten die folgenden Webseiten:
http://www.freessh.org/windows.html,
http://www.openssh.com/windows.html,
http://www.freessh.org/unix.html,
http://www.openssh.com/unix.html,
http://www.freessh.org/java.html,
http://www.openssh.com/java.html,
http://www.freessh.org/other.html,
http://www.openssh.com/palmos.html
Die beiden wichtigsten Implementationen sind:
OpenSSH ist eine Weiterentwicklung der ursprünglich freien SSH-Version von Tatu Ylönen (SSH1).
OpenSSH benutzt Teile von OpenSSL.9 OpenSSH unterstützt derzeit die meisten Plattformen10 und
ist die verbreitetste11 SSH-Implementation.
SSH2 Die kommerzielle Version von SSH wird über http://www.ssh.com vertrieben. Der Einsatz
ist für kommerzielle Anwender kostenpflichtig. Diese SSH-Version gibt es für viele Plattformen. 12
Es unterstützt nur die SSH-Protokollversion 2.
8 http://www.openssh.com/users.html
9 http://www.openssl.org
10 http://www.openssh.com/portable.html
11 http://www.openssh.com/usage/graphs.html
12 http://www.ssh.com/products/ssh/portability.html
3
2.5 Protokolle
Es existieren zwei inkompatible Versionen des SSH-Protokolls, Version 1 und Version 2. Dieses Bulletin
wird sich hauptsächlich mit der Protokollversion 2 befassen, weil Version 1 einige Designschwächen 13
aufweist, weswegen die Verwendung des neueren Protokolls anzuraten ist. In Ausnahmefällen kann die
Verwendung von Protokollversion 1 notwendig sein, so verwendet z. B. Cisco fuer sein Betriebssystem
IOS SSH-1.
SSH wird derzeit von der IETF14 standardisiert.15
2.6 Ablauf einer normalen SSH-Verbindung
Der Klient baut eine TCP-Verbindung zum Server auf. In der Regel nimmt der Server Verbindungen
auf Port 22 an.
Klient und Server einigen sich auf eine Protokollversion.
Der Server authentifiziert sich gegenüber dem Klienten in einem „Challenge-Response“ -Verfahren.
Jetzt werden die Verbindungs-Parameter festgelegt, hier wird z. B. das Verschlüsselungsverfahren
festgelegt.
Bis jetzt wurde noch unverschlüsselt gearbeitet. Jetzt schickt der Klient dem Server den geheimen
Sitzungsschlüssel mit dem die Verbindung verschlüsselt wird.
Der Benutzer kann sich jetzt dem Server gegenüber authentifizieren, je nach Konfiguration des Servers z. B. mit seinem Passwort, einem zuvor hinterlegtem kryptografischen Schlüssel, mit einer
Smartcard, . . .
2.7 Bestandteile
Die verschiedenen Funktionen des „Gesamtsystems SSH“ (Serverdienst, Klient, Schlüsselerzeugung, . . . )
sind auf einzelne Programme verteilt.
ssh:
Der SSH-Klient, er dient zur entfernten Ausführung von Kommandos und für
interaktive Logins.
sshd:
Der SSH-Server, an dem sich der Klient anmeldet.
ssh-agent:
Ein Agent, der private SSH-Schlüssel vorhalten kann.
ssh-add:
Ein Werkzeug, mit dem private Schlüssel an den Agenten übergeben werden.
sftp:
Ein FTP-ähnliches Programm zur Übertragung von Dateien.
scp:
Programm zum Kopieren von Dateien, das sich ähnlich wie rcp verhält.
ssh-keygen: Werkzeug zum Erzeugen und Verwalten von Schlüsselpaaren.
Bei der kommerziellen SSH-Version sind die Programmnamen zusätzlich mit dem Suffix „2“ versehen.
Es existieren aber normalerweise symbolische Links zu den Namen ohne Suffix.
3 Verwendung
Dieser Abschnitt zeigt die gängigsten Anwendungen für SSH. Die Beispiele sollten mit allen Implementationen funktionieren, die über einen SSH-Kommandozeilen-Klienten verfügen. Die Beispiele sind mit
SSH2 und OpenSSH getestet. Programmnamen, Bildschirmausgaben und Optionen können sich unterscheiden. Bei deutlichen Abweichungen sind die Beispiele für SSH2 und OpenSSH getrennt angegeben.
Die Beispiele wurden mit OpenSSH-3.4p1 und SSH2 3.2.0 getestet. Verwendetes Betriebssystem ist SuSELinux 7.3, die Beispiele wurden zusätzlich mit SUN Solaris 9 überprüft.
13 http://www.ssh.com/products/ssh/advisories/vulnerability.cfm
14 http://www.ietf.org
15 http://www.ietf.org/ids.by.wg/secsh.html
4
In den folgenden Beispielen wird von einer Benutzerin „Alice “ ausgegangen, die auf ihrem lokalen
Rechner ein Benutzer-Konto mit dem Namen „alice“ hat. Der Rechner von Alice heisst klient. Der
Rechner, auf den Alice zugreifen will, heisst server. Eingegebene Passwörter werden nicht dargestellt.
Benutzereingaben sind fett hervorgehoben. Lange Zeilen sind mit einem Gegenschrägstrich ( ) umgebrochen.
3.1 Erster Verbindungsaufbau
Wird das erste Mal eine Verbindung zu einem Server aufgebaut und ist der öffentliche Schlüssel des Servers
nicht bekannt, fordert SSH eine explizite Bestätigung des Benutzers an. Den kryptografischen „Fingerabdruck“ sollte man dann z. B. telefonisch mit dem Administrator des Servers vergleichen.
Beispiel für OpenSSH:
alice@klient:~> ssh server
The authenticity of host ’server (192.168.1.1)’ can’t be established.
DSA key fingerprint is c3:07:ef:07:95:4d:c8:56:b5:0f:06:d5:a2:03:b6:a2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’server,192.168.1.1’ (DSA) to the list
of known hosts.
alice@server’s password:
Last login: Tue Apr 30 15:32:36 2002 from klient
alice@server:~>
Beispiel für SSH2:
alice@klient:~> ssh2 server
Host key not found from database.
Key fingerprint:
xinoh-vefes-duvyt-dorev-bocib-mybil-pogap-gyfeg-vigak-buzop-gixox
You can get a public key’s fingerprint by running
% ssh-keygen -F publickey.pub
on the keyfile.
Are you sure you want to continue connecting (yes/no)? yes
Host key saved to /home/alice/.ssh2/hostkeys/key_22_server.pub
host key for server, accepted by alice Tue Apr 30 2002 17:14:02 +0200
alice’s password:
Authentication successful.
alice@server:~>
Wichtiger Unterschied hier ist das unterschiedliche Format der Fingerabdrücke. Das Format von OpenSSH und SSH1 ist hexadezimal, das von SSH2 nennt sich „Bubble Babble“, es ist z. B. für den Abgleich
am Telefon besser geeignet. SSH2 unterstützt nur Bubble Babble, OpenSSH zusätzlich das hexadezimale
Format.16
3.1.1 Geänderte Hostkeys
Wenn der Hostkey nicht mit dem in ˜/.ssh/known_hosts, bzw. ˜/.ssh2/hostkeys/ abgelegten
Schlüssel übereinstimmt, warnt SSH. Eine Änderung des Hostkeys kann technische Gründe haben oder auf
einen „Man-in-the-middle“-Angriff hindeuten. Man sollte sich bei dem entsprechenden Systemadministrator versichern, dass er den Schlüssel geändert hat und erneut den Fingerabdruck vergleichen.
SSH warnt sehr deutlich bei falschen Schlüsseln:
16 siehe
Abschnitt 3.5.2
5
alice@klient:~> ssh server
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now
(man-in-the-middle attack)!
It is also possible that the DSA host key has just been changed.
The fingerprint for the DSA key sent by the remote host is
56:f2:9b:f4:78:8c:16:9d:a4:2f:01:aa:38:6b:81:9d.
Please contact your system administrator.
Add correct host key in /home/alice/.ssh/known_hosts to get rid of
this message.
Offending key in /home/alice/.ssh/known_hosts:5
DSA host key for server has changed and you have requested strict
checking.
Host key verification failed.
alice@klient:~>
3.2 Anmeldung an fremden Systemen mit ssh
Alice möchte sich auf dem Rechner server per ssh anmelden. Alternativ existiert meist ein symbolischer Link auf slogin.
alice@klient:~> ssh server
alice@server’s password:
Last login: Tue Apr 30 13:16:54 2002 from klient
alice@server:~>
Dies war ein einfaches Beispiel, meist wird ssh auch in dieser Form benutzt. Angenommen, Alice
möchte für einen Test nicht ihr eigens Konto auf dem Server benutzen, sondern ein Test-Konto, z. B.
test.
alice@klient:~> ssh test@server
test@server’s password:
Last login: Tue Apr 30 12:11:24 2002 from klient
test@server:~>
In beiden Fällen handelt es sich um Alice. Lokal arbeitet sie mit dem Benutzer-Konto alice, entfernt
einmal als alice, einmal als test. Wenn ssh kein Benutzername übergeben wird, wird die Anmeldung
am entfernten System mit dem aktuellen Benutzernamen versucht. 17
3.3 Ausführen von Kommandos auf entfernten Systemen
Alice möchte die Laufzeit (Uptime) des Serversystem abfragen. Sie könnte sich per SSH anmelden, uptime
ausführen und sich wieder ausloggen. Oder sie macht es sich einfacher:
alice@klient:~> ssh server uptime
alice@server’s password:
4:13pm up 5 days, 3:17, 5 users,
test@klient:~>
17 Statt
load average: 0.00, 0.00, 0.00
mit einem „@“vor dem Hostnamen kann der Benutzername, wie bei rsh auch mit -l bob übergeben werden.
6
3.4 Kopieren von Dateien
SSH bietet zwei Möglichkeiten, Dateien von einem System auf ein anderes zu kopieren. Die einfache
Variante ist das Kopieren mit scp, hierbei müssen Datei- und Pfadnamen für das Zielsystem bekannt
sein. scp benötigt eine gültige Login-Shell. Die zweite Möglichkeit ist das SFTP-Subsystem. Die sftpBedienung ist FTP nachempfunden und interaktiv. Eine Verwandtschaft zum FTP-Protokoll besteht nicht.
Eine Login-Shell ist nicht notwendig.
3.4.1 Kopieren von Dateien mit scp
Alice hat lokal eine Datei erstellt, z. B. kaffee.txt, die sie jetzt auf den Server kopieren möchte. Dafür
bietet sich das Programm scp an.
alice@klient:~> scp kaffee.txt server:
alice@server’s password:
kaffee.txt
100% |*****************************|
alice@klient:~>
795
00:00
Das obige Kommando macht einige Annahmen zu Benutzernamen und Verzeichnissen, die für die
tägliche Arbeit sehr angenehm sind, die aber auch explizit angegeben werden können:
alice@klient:~> scp kaffee.txt alice@server:/home/alice/kaffee.txt
alice@server’s password:
kaffee.txt
100% |*****************************|
795
00:00
alice@klient:~>
Wenn die Namen der Benutzer-Konten gleich sind, kann der Name weggelassen werden. Das gilt auch
für den Dateinamen, es sei denn, er soll beim Kopieren geändert werden. Im ersten Beispiel wird als
Ziel server: angegeben, im zweiten server:/home/alice/. SSH impliziert bei der abkürzenden
Schreibweise server: das Home-Verzeichnis des jeweiligen Benutzers.
Möchte Alice die Datei kaffee.txt jetzt auf dem Server, als Benutzer test, im Verzeichnis /tmp/,
als kaffee.bak ablegen, würde es so funktionieren:
alice@klient:~> scp kaffee.txt test@server:/tmp/kaffee.bak
test@server’s password:
kaffee.txt
100% |*****************************|
795
alice@klient:~>
00:00
Die umgekehrte Richtung des Kopierens ist genauso einfach. Alice möchte die Datei kaffee.bak
von server in ihr Home-Verzeichnis auf klient kopieren.
alice@klient:~> scp server:/tmp/kaffee.bak .
alice@server’s password:
kaffee.bak
100% |*****************************|
alice@klient:~>
795
00:00
In dem Beispiel ersetzt der Punkt das aktuelle Verzeichnis. Die Annehmlichkeiten der Shell sind auch
mit SSH verfügbar. Die längere Version könnte so aussehen:
alice@klient:~> scp server:/tmp/kaffee.bak /home/alice/kaffee.bak
alice@server’s password:
kaffee.bak
100% |*****************************|
795
00:00
alice@klient:~>
7
3.4.2 Kopieren von Dateien mit sftp
Der sftp-Klient arbeitet interaktiv. Das folgende Beispiel zeigt, wie Alice die Datei keks-verbrauch.txt
vom Klientensystem auf das Serversystem kopiert.
alice@klient:~> sftp server
Connecting to server...
alice@server’s password:
sftp> put keks-verbrauch.txt
Uploading keks-verbrauch.txt to /home/alice/keks-verbrauch.txt
sftp> quit
alice@klient:~>
Später möchte Alice die Datei zurückkopiern:
alice@klient:~> sftp server
Connecting to server...
alice@server’s password:
sftp> get keks-verbrauch.txt
Fetching /home/alice/keks-verbrauch.txt to keks-verbrauch.txt
sftp> quit
alice@klient:~>
3.5 Beispiele mit „public key“-Authentifizierung
Bequemer als die Authentifizierung mit einem Passwort ist es, sich mit digitalen Schlüsseln anzumelden.
Dabei wird auf dem Server eine Datei hinterlegt, in der die öffentlichen Schlüssel gespeichert sind, denen
die Anmeldung mit den korrespondierenden geheimen Schlüsseln für dieses Konto erlaubt sein soll. Die
geheimen Schlüssel sind in der Regel verschlüsselt gespeichert und werden mit einer Passphrase entschlüsselt. Im Gegensatz zu den Systempasswörtern, gelten die Passphrasen nur für die Anmeldung mit digitalen
Schlüsseln per SSH.
3.5.1 Erzeugen eines Schlüsselpaares
Um ein Schlüsselpaar zu erzeugen wird das Programm ssh-keygen aufgerufen. Zuerst wird nach einer
Datei gefragt, in der der Schlüssel gespeichert werden soll, normalerweise reicht es, hier zu bestätigen. Anschließend wird nach einer „Passphrase“ gefragt, hier sollte unbedingt eine längere und zufällig gewählte
Zeichenkette, die sowohl große als auch kleine Buchstaben, als auch Ziffern und Sonderzeichen enthält,
eingegeben werden.
Beispiel für OpenSSH (Protokoll-Version 2, RSA-Schlüssel):
alice@klient:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alice/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alice/.ssh/id_rsa.
Your public key has been saved in /home/alice/.ssh/id_rsa.pub.
The key fingerprint is:
f6:7b:47:7f:5e:39:fb:f6:fb:24:fa:52:e3:c1:4b:e7 alice@klient
Beispiel für SSH2 (Protokoll-Version 2, DSA-Schlüssel):
alice@klient:~> ssh-keygen2
Generating 1024-bit dsa key pair
1 oOo.oOo.oOo.
8
Key generated.
1024-bit dsa, alice@klient, Tue Apr 30 2002 17:59:28 +0200
Passphrase :
Again
:
Private key saved to /home/alice/.ssh2/id_dsa_1024_c
Public key saved to /home/alice/.ssh2/id_dsa_1024_c.pub
alice@klient:~>
3.5.2 Fingerprints
Alle verwendeten Schlüsselpaare haben einen eindeutigen digitalen „Fingerabdruck“. Wenn man sich die
Echtheit eines öffentlichen Schlüssels z. B. per Telefon bestätigen lassen will, ist es praktisch, nicht den
ganzen Schlüssel zu vergleichen, sondern nur einen so genannten Fingerabdruck.
Das ist besonders für noch unbekannte Hostkeys wichtig, gilt aber auch für die benutzerbezogenen
Schlüssel.
Zum Einen kommen hexadezimale Fingerabdrücke, aber auch „Bubble Babble“-Fingerabdrücke vor,
die sich z. B. am Telefon besser vergleichen lassen.
Anzeigen kann man sich den Fingerabdruck eines Schlüssels mit SSH2 folgendermaßen:
alice@klient:~> ssh-keygen2 -F ~/.ssh2/id_dsa_1024_b.pub
Fingerprint for key:
xinoh-vefes-duvyt-dorev-bocib-mybil-pogap-gyfeg-vigak-buzop-gixox
alice@klient:~>
Hexadezimaler Fingerabdrücke mit OpenSSH:
alice@klient:~> ssh-keygen -l
Enter file in which the key is (/home/alice/.ssh/identity):
1024 f3:30:dd:f6:80:cc:73:89:da:15:0c:4f:6c:4c:56:5d alice@klient
„Bubble Babble“-Fingerabdrücke lassen sich wie folgt mit OpenSSH anzeigen:
alice@klient:~> ssh-keygen -B
Enter file in which the key is (/home/alice/.ssh/identity):
1024 xolor-fuler-namud-rygas-risop-vecyn-buter-vucyt-nerym-fetoz-vyxyx
alice@klient
alice@klient:~>
3.5.3 Anmelden mit Schlüssel
Zuerst muss der öffentliche Schlüssel des eben generierten Schlüsselpaars auf dem Zielsystem hinterlegt
werden.
OpenSSH In der Datei ˜/.ssh/authorized_keys werden auf dem SSH-Server alle gewünschten
Schlüssel abgelegt. In jeder Zeile dieser Datei steht ein Schlüssel.
SSH2 Bei SSH2, wird in der Datei ˜/.ssh2/authorization, auf dem SSH-Server eine Liste von
Schlüsseln angelegt, mit denen man sich auf diesem System anmelden darf.
˜/.ssh2/authorization könnte folgenden Inhalt haben:
# authorization
Key
id_dsa_2048_a.pub
Die Schlüssel werden im Verzeichnis ˜/.ssh2/ erwartet.
In der Datei ˜/.ssh2/identification werden auf dem Klientensystem die Schlüssel eingetragen, mit denen man sich an fremden Systemen anmelden möchte.
9
# identification
KeyId
id_dsa_2048_a
SSH2 bring das Script ssh-pubkeymgr mit, dass zum Erstellen und Kopieren dieser Dateien
benutzt werden kann.
Jeder, der im Besitz des zugehörigen, entschlüsselten, geheimen Schlüssels ist, kann sich nun an diesem
System anmelden.
3.5.4 Beispiele zur Schlüsselhinterlegung
OpenSSH Die Datei ˜/.ssh/authorized_keys enthält diejenigen öffentlichen Schlüssel, deren Eigentümer sich per ssh-key anmelden dürfen. Der erste Schlüssel kann mit scp kopiert werden.
alice@klient:~> scp ~/.ssh/id_rsa.pub server:.ssh/authorized_keys
alice@server’s password:
id_rsa.pub
100% |*****************************|
332
00:00
alice@klient:~>
SSH2 Für SSH2 muss der öffentliche Schlüssel hinterlegt werden und zusätzlich muss dieser Schlüssel
dann in der Datei ˜/.ssh2/authorization eingetragen werden.
alice@klient:~> scp2 ~/.ssh2/id_dsa_1024_a.pub server:.ssh2/
alice@servers’s password:
id_dsa_1024_a.pub
|
0B |
0.0 kB/s | TOC: 00:00:01 | 100%
alice@klient:~>
alice@klient:~>
ssh2 server ’echo "Key id_dsa_1024_a.pub" >> ~/.ssh2/authorization’
alice’s password:
Authentication successful.
alice@klient:~>
Wird jetzt mit ssh eine Verbindung zum Server aufgebaut, so wird die Passphrase des hinterlegten
Schlüssels abgefragt.
alice@klient:~> ssh server
Enter passphrase for key ’/home/alice/.ssh/id_rsa’:
Last login: Tue Apr 30 16:48:09 2002 from klient
alice@server:~>
Es wird also nicht das Passwort, sondern die Passphrase des hinterlegten Schlüssels abgefragt. Wird die
Passphrase nicht oder nicht richtig eingegeben, wird das Passwort abgefragt.
alice@klient:~> ssh server
Enter passphrase for key ’/home/alice/.ssh/id_rsa’:
alice@server’s password:
Last login: Thu May 2 14:22:10 2002 from klient
alice@server:~>
Wo ist jetzt der entscheidende Unterschied zur Passwort-Authentifizierung? Für den Benutzer ist es in
der gezeigten Form kein großer Unterschied, außer dass er einmal seinen öffentlichen Schlüssel hinterlegen
muss. Die Authentifizierung ist sicherer, weil der Benutzer über den geheimen Schlüssel verfügen muss und
keine Übertragung des Passwortes über das Netz erfolgt. Ausserdem braucht der Nutzer sich jetzt nur noch
eine Passphrase merken, das ist besonders bei vielen verschiedenen Benutzerkonten von Vorteil.
Deutlich einfacher und für den Anwender angenehmer ist die Verwendung des SSH-Agenten (s. Abschnitt 3.5.6).
10
3.5.5 Interoperabilität
Das Zusammenspiel zwischen SSH2 und OpenSSH klappt in der Regel problemlos, wenn man mit dem
ssh-keygen von OpenSSH die Schlüssel in das jeweils benötigte Format konvertiert.
Konvertieren von OpenSSH zu SSH2 mit:
alice@klient:~> ssh-keygen -e -f ~/.ssh/id_dsa.pub > ~/.ssh2/id_dsa.pub
Die andere Richtung ist ähnlich einfach:
alice@klient:~>
ssh-keygen -i -f ~/.ssh2/id_dsa_2048_a.pub > ~/.ssh/id_dsa_2048_a.pub
3.5.6 SSH-Agenten
Eine sehr mächtige Anwendung sind die SSH-Agenten. Sie verbinden die Vorteile der starken Authentifizierung mit der Einfachheit einer Anmeldung, ohne dass ein Passwort angegeben werden muss. Das
macht es auch für Batchjobs interessant. Der Agent entschlüsselt nach der Eingabe der Passphrase den
geheimen Schlüssel und hält ihn im Speicher vor. Er übernimmt jetzt alle Schlüsselbezogenen Aktionen
der SSH-Klienten.
Aber ohne Fleiß kein Preis. Der SSH-Agent muss gestartet werden und es müssen die Schlüssel bei
ihm angemeldet werden.
alice@klient:~> ssh-agent $SHELL
alice@klient:~> ssh-add ~/.ssh/id_rsa
Enter passphrase for .ssh/id_rsa:
Identity added: .ssh/id_rsa (.ssh/id_rsa)
alice@klient:~> ssh server
Last login: Thu May 2 14:25:05 2002 from klient
alice@server:~>
Der Gewinn liegt darin, dass einmal, z. B. bei Arbeitsbeginn der SSH-Agent gestartet wird, um dann
den ganzen Tag mit ihm zu arbeiten. Die folgenden Anmeldungen erfordern dann weder Passwort, noch
Passphrase, denn der SSH-Agent übernimmt die Authentifizierung.
alice@klient:~> ssh server
Last login: Thu May 2 14:36:02 2002 from klient
alice@server:~>
Statt ssh-agent $SHELL kann auch eval ‘ssh-agent‘ oder eval $(ssh-agent) verwendet werden. Die geladenen Schlüssel kann man sich mit:
alice@klient:~> ssh-add -l
1024 f6:7b:47:7f:5e:39:fb:f6:fb:24:fa:52:e3:c1:4b:e7 .ssh/id_rsa (RSA)
anzeigen lassen. Möchte man später einen Schlüssel wieder entfernen, verwendet man die Option -d.
alice@klient:~> ssh-add -d ~/.ssh/id_rsa
Identity removed: .ssh/id_rsa (.ssh/id_rsa.pub)
Das Starten des SSH-Agenten geschieht zweckmäßigerweise bei der Anmeldung an die eigene Arbeitsplatzmaschine. Entweder an der Konsole oder unter X11. In der Regel bietet es sich an, dies in der Datei
˜/.xsession vorzunehmen. Viele Hersteller haben in ihren Anmelde-Scripten SSH bereits berücksichtigt, oft reicht es die Kommentarzeichen zu entfernen oder eine Option auf yes zu setzen.
11
3.6 X11-Weiterleitung
SSH unterstützt die sicherer Weiterleitung einer X11-Verbindung. Allerdings müssen sowohl Klient als
auch Server dies zulassen. Nur dann funktioniert folgendes Beispiel. Wie dieses Verhalten beeinflusst werden kann wird im Rahmen der Beispielkonfigurationen behandelt.
alice@klient:~> ssh server
Last login: Thu May 2 14:42:02 2002 from klient
alice@server:~> xeyes &
[1] 11025
alice@server:~>
Auf dem eigenen Monitor sollten jetzt die xeyes erscheinen. Bewegt man jetzt die Maus, folgen die
Augen dem Mauszeiger. Um sich zu veranschaulichen, dass das Programm auf dem Server und nicht
auf dem Klient ausgeführt wird, kann man die Prozesslisten des Serversystems und des Klientensystems
prüfen. Ungläubige, aber mutige Anwender können jetzt das Netzwerkkabel ziehen. Die Augen hören
sofort auf sich zu bewegen, da die Datenverbindung unterbrochen ist. Wird nun die Verbindung wieder
hergestellt, rollen die Augen weiter.
Obwohl SSH die übertragenen Daten verschlüsselt, ist dieses Verfahren an seinen Endpunkten, d. h.
am Klienten- und Serversystem anfällig. X11-Weiterleitungen sollten nur zu Servern aufgebaut werden,
die man für vertrauenswürdig hält.18 Es ist möglich, ausgehend vom entfernten System, über die Datenverbindung, wie bei einer normalen X11-Weiterleitung, den X-Server des darstellenden Systems abzuhören,
beispielsweise Tastatureingaben mitzulesen. Die Datenverbindung selbst ist sicher.
4 Installation von SSH
Sofern SSH nicht bereits Teil des verwendeten Betriebssystems ist, gibt es zwei Möglichkeiten SSH zu
installieren.
1. Installation der Binärdistribution des jeweiligen Herstellers,
2. Übersetzen der Quellen und anschließende Installation.
In jedem Fall sollte die digitale Signatur des zu installierenden Paketes geprüft werden, um die Authentizität der Software zu garantieren. Wie das geht erklären die folgenden Webseiten:
http://www.cert.dfn.de/infoserv/dib/dib-9405.html,
http://www.gnupg.org/howtos/de/GPGMiniHowto-1.html#ss1.3,
http://www.gnupg.org/de/gnupg.html,
http://www.pgp.com/
4.1 Binärdistribution
Sowohl SSH2 als auch OpenSSH kann für die meisten Plattformen (Windows, Linux, Solaris,. . . ) in Form
einer Binärdistribution, also vorkompiliert, bezogen werden.
http://www.openssh.com/portable.html,
http://www.ssh.com/products/ssh/download.cfm
18 siehe
auch 2.3
12
4.2 Selber kompilieren
Die größtmöglichen Eingriffsmöglichkeiten hat man natürlich, wenn man die Software selber übersetzt.
Sowohl SSH2, als auch OpenSSH stellen die Quellen bereit. Durch die großen Eingriffsmöglichkeiten besteht hier die Gefahr, unbeabsichtigt Lücken zu öffnen.
Das Vorgehen für SSH2 und OpenSSH ist im wesentlichen gleich:
Download der Quellen,
Prüfen der digitalen Signatur,
Entpacken der Quellen,
./configure...,
– Unterstützung für TCP-Wrapper aktivieren, um die Herkunft der eingehenden TCP-Verbindungen
zu protokollieren, bzw. darauf basierend Verbindungen anzunehmen oder abzulehnen.
– SUID-Binaries vermeiden, um unnötige Schwachstellen zu verhindern.
– Protokollversion 1 deaktivieren, es soll nur die neuere Version 2 verwendet werden. 19
– Unterstützung für nicht benötigte Authentifikations-Mechanismen (SmartCards, Kerberos, etc.)
deaktivieren.
– Auf manchen Systemen kann es gewünscht sein, PAM-Unterstützung zu aktivieren.
– Es kann auf manchen Systemen notwendig sein, Unterstützung für MD5-Passwörter zu aktivieren.
make,
make install,
sshd starten und dauerhaft einrichten.
Das Vorgehen und die jeweiligen Optionen unterscheiden sich jedoch. Gängige Fragen werden z. B.
unter http://www.snailbook.com/faq/ beantwortet.
4.2.1 SSH2
Die aktuellen Quellen können von http://www.ssh.com/products/ssh/download.cfm oder
einem der Spiegel-Server (z. B. ftp://ftp.cert.dfn.de/pub/tools/net/ssh/) bezogen werden. Das Beispiel hier bezieht sich auf die Evaluations-Version.
Nach dem Überprüfen der Signatur werden die Quellen ausgepackt.
alice@server:~/src> gunzip ssh-3.2.0.tar.gz
alice@server:~/src> tar xf ssh-3.2.0.tar
alice@server:~/src> cd ssh-3.2.0
Anschließend sollten die Dateien README und FAQ gelesen werden. Die Optionen für das configureScript sind vielfältig. Die Optionen müssen den lokalen Gegebenheiten angepasst werden, wie bei jeder anderen Software auch. Um dieses Beispiel einfach zu halten, ist es auf die wichtigsten Optionen beschränkt.
Die wichtigsten für dieses Beispiel sind:
--with-libwrap schaltet die Unterstützung für TCP-Wrapper20 ein. Aber Vorsicht, ohne die richtigen
Einträge in /etc/hosts.allow lehnt der Server alle Verbindungen ab.
19 http://www.ssh.com/products/ssh/advisories/vulnerability.cfm
20 http://www.cert.dfn.de/infoserv/dib/dib-9307.html
13
--without-internal-ssh1-compat SSH1-Kompatibilität abschalten.
--without-ssh-agent1-compat Unterstützung der SSH1-Agenten deaktivieren.
--disable-suid-ssh-signer SUID-Binaries vermeiden.
Die Ausgaben der folgenden Befehle fehlen. Die Ausgaben sind zwar wichtig, aber zu umfangreich um
hier aufgenommen zu werden.
alice@server:~/src/ssh-3.2.0> ./configure
--with-libwrap
--without-internal-ssh1-compat
--disable-suid-ssh-signer
alice@server:~/src/ssh-3.2.0> make
alice@server:~/src/ssh-3.2.0> su Password:
root@server:~# cd ~alice/src/ssh-3.2.0
root@server:~# make install
Die Hostkeys werden automatisch erstellt und unter /etc/ssh2/ gespeichert.
4.2.2 OpenSSH
Die aktuellen Quellen können von einem der Spiegel-Server unter http://www.openssh.com/portable.
html bezogen werden. Hier sollte ebenfalls die Signatur überprüft werden.
OpenSSH benötigt zusätzlich das OpenSSL-Paket (http://www.openssl.org). Falls das Betriebssystem nicht von sich aus eine Möglichkeit bietet Pseudozufallszahlen zu generieren, z. B. über
/dev/random, wird der EGD (http://egd.sourceforge.net/) oder ein anderes Hilfsprogramm
benoetigt (z.B. prngd).
Seit Version 3.3 kennt OpenSSH „privilege seperation“21 . Damit ist es möglich, den Dienst auf einen
privilegierten Server und einen eingeschränkten Server zu verteilen. Die meisten Funktionen werden dabei von einem unprivilegierten sshd ausgeführt. Nur noch ein kleinerer Teil läuft mit root-Rechten und
übernimmt die Authentifizierung. Dadurch wird der sshd zusätzlich abgesichert. Der sshd, der die Verbindungen annimmt, ist zusätzlich in eine chroot-Umgebung eingesperrt.
Das Auspacken der der Quellen sollte nicht schwer fallen.
alice@server:~/src> gunzip openssh-3.4p1.tar.gz
alice@server:~/src> tar xvf openssh-3.4p1.tar
alice@server:~/src> cd openssh-3.4p1
--disable-suid-ssh Der SSH-Klient (ssh) wird nicht mit suid-Flag installiert.
--with-tcp-wrappers Der SSH-Server (sshd) benutzt die libwrap.
Die Ausgaben der folgenden Kommandos sind aus Platzgründen z. T. nicht enthalten.
alice@server:~/src/openssh-3.4p1> ./configure
--disable-suid-ssh
--with-tcp-wrappers
alice@server:~/src/openssh-3.4p1> make
alice@server:~/src/openssh-3.4p1> su Password:
root@server:~# cd ~alice/src/openssh-3.4p1
root@server:~# make install
Die Hostkeys werden automatisch generiert und unter /etc/ssh/ gespeichert. Das Benutzerkonto
sshd, sowie das chroot-Verzeichnis (/var/empty/) müssen manuell angelegt werden. Unterhalb
von /var/empty/ sollten sich keine Dateien befinden. Das Verzeichnis sollte so angelegt werden, dass
der Benutzer sshd dort keine Schreibrechte hat.
21 http://www.citi.umich.edu/u/provos/ssh/privsep.html
14
5 Beispielkonfigurationen
Die folgenden Beispiele sind leicht abgewandelte Versionen der jeweils mitgelieferten Beispiele. In diesen
Beispielen hier wird nur Protokollversion 2 benutzt. Version 1 ist deaktiviert. Die folgenden Einstellungen
sind restriktiver und bewusst kurz gehalten. Auf selten Benötigte Funktionen wird verzichtet.
5.1 Klient
Es gibt drei Möglichkeiten, dem SSH-Klienten Optionen zu übergeben:
1. In der Datei /etc/ssh/ssh_config,
2. über die persönliche Konfigurationsdatei in ˜/.ssh/config oder ˜/.ssh2/config und
3. über die Kommandozeile,
Das ist auch die Reihenfolge, in der die Optionen gesetzt werden, später ausgewertete Optionen überschreiben ihre Vorgänger.
5.1.1 /etc/ssh/ssh_config
In /etc/ssh/ssh_config sind systemweit die Optionen für den SSH-Klienten gesetzt. Sowohl bei
SSH2, als auch bei OpenSSH ist hier keine Option aktiviert. Sinnvoll ist es, den Klienten standardmäßig Protokoll 2 sprechen zu lassen, bei geänderten Hostkeys abzubrechen und keine X11-Umleitungen zu
gestatten. Zusätzlich sollte die Unterstützung für rsh abgestellt werden. Die Funktion „ForwardAgent“
sollte, wenn sie nicht benutzt wird, abgeschaltet sein.
Host *
ForwardX11 no
Protocol 2
StrictHostKeyChecking yes
ForwardAgent no
FallBackToRsh no
5.1.2 ˜/.ssh/config
Nach /etc/ssh/ssh_config wird ˜/.ssh/config ausgewertet. Hier bietet es sich an, benutzerspezifische Einstellungen vorzunehmen, z. B. abweichende Benutzernamen anzugeben und X11-Umlenkungen
für einzelne Rechner zu erlauben.
Host server
ForwardX11 yes
User test
5.2 Server
5.2.1 /etc/ssh/sshd_config
Beispiel für OpenSSH:
# Beschränkung auf Protokollversion 2
Protocol 2
# Nur Verbindungen zur angegebenen Netzwerkadresse zulassen.
ListenAddress 192.168.123.123
# Direkte Anmeldungen des Benutzers root verbieten.
15
PermitRootLogin no
# Die unsichere Authentifizierung mit rhost-Dateien wird abgeschaltet.
RhostsAuthentication no
# Die Authentifizierungs-Variante mit RSA-Rhosts wird deaktiviert.
RhostsRSAAuthentication no
# .rhosts-Benutzerdateien ignorieren...
IgnoreRhosts yes
# Genaue Prüfung, ob die Dateiberechtigungen in ~/.ssh/ richtig sind.
StrictModes yes
# X11-Umleitungen verbieten.
X11Forwarding no
# Leere Passwörter nicht zulassen.
PermitEmptyPasswords no
# SFTP-Subsystem definieren.
Subsystem sftp /usr/lib/ssh/sftp-server
# Privilegientrennung
PriviligeSeperation yes
5.2.2 /etc/ssh2/sshd2_config
Beispiel für SSH2:
# Nur Verbindungen zur angegebenen Netzwerkadresse annehmen.
ListenAddress 192.168.123.123
# Direkte Anmeldungen des Benutzers root verbieten.
PermitRootLogin no
# .rhosts-Benutzerdateien ignorieren...
IgnoreRhosts yes
# Genaue Prüfung, ob die Dateiberechtigungen in ~/.ssh/ richtig sind.
StrictModes yes
# X11-Umleitungen verbieten.
X11Forwarding no
# Leere Passwörter nicht zulassen.
PermitEmptyPasswords no
# SFTP-Subsystem definieren.
subsystem-sftp sftp-server
5.2.3 sftp-Subsystem
SFTP bietet die Möglichkeit, Dateien in einer FTP ähnlichen Weise per SSH zu kopieren. Der Klient
heißt sftp, der Server ist als Subsystem, das vom sshd aufgerufen wird implementiert. Dazu muss in
16
der Server-Konfiguration (/etc/ssh/sshd_config, bzw. /etc/ssh2/ssd2_config) das Subsystem explizit definiert werden.
Beispiel für SSH2:
# SFTP-Subsystem definieren.
subsystem-sftp sftp-server
Beispiel für OpenSSH:
# SFTP-Subsystem definieren.
Subsystem sftp /usr/lib/ssh/sftp-server
Der Benutzer kann in der Regel frei wählen, ob er Dateien per scp, sftp oder per rsync 22 (durch
ssh getunnelt) übertragen will.
Es ist aber möglich, den Benutzer auf den reinen Dateitransfer per sftp zu beschränken und interaktive
Logins nicht zu gestatten. Das macht natürlich nur Sinn, wenn der Benutzer nicht auf Umwegen doch noch
Programme ausführen kann, z. B. über den Webserver.
Für OpenSSH kann man hierzu die Login-Shell auf /usr/local/bin/sftp-server setzen, für
SSH2 auf /usr/local/bin/ssh-dummy-shell.
22 http://rsync.samba.org
17

Documentos relacionados