Das Secure Shell Protokoll - Fachbereich Informatik und

Werbung
The Protocols that Run the Internet
Das Secure Shell Protokoll
Stefan Klinger
Fachbereich Informatik, Universität Konstanz
26. April 2003
Zusammenfassung
SSH bietet Sicherheit für remote login und andere Dienste über ein unsicheres Netzwerk.
Dieser Vortrag im Rahmen des Seminars The Protocols that Run the Internet soll einen Überblick über das Secure Shell Protokoll (Version 2.0) geben.
Schwerpunkt ist dabei die Darstellung des Schichtenkonzepts und der Flexibilität, indem am Beispiel einer einfachen“remote login session die betrof”
fenen Protokolle besprochen werden.
Eine vollständige Besprechung von SSH ist im gesteckten Rahmen leider nicht möglich. Aus diesem Grund wird auch nicht auf die verwendeten
Verschlüsselungs- und Authentifizierungsalgorithmen eingegangen.
1 SSH - Das Secure Shell Protokoll
SSH bietet Sicherheit für remote login und andere Dienste über ein unsicheres
Netzwerk.
Sicherheit bedeutet hier:
– Authentifizierung des Servers und des Clients bzw. Users
– Vertraulichkeit durch starke Verschlüsselung
– Integrität der Daten
Mit unsicherem Netzwerk ist gemeint:
– Daten können abgehört und verändert werden
– jedoch schützt das Protokoll vor Übertragungsfehlern
Meist setzt SSH auf TCP/IP auf.
[email protected]
1
2 Die Architektur
Einzelheiten über die Architektur erfährt man in [sshArch]
Das Protokoll ist erweiterbar
– Algorithmen und Formate können nach Bedarf ergänzt oder ersetzt
werden, z.B. wenn sich ein Algorithmus als unsicher erweist, oder
jemand gerne andere Algorithmen einsetzen möchte.
– Jede dieser Komponenten hat einen eindeutigen ASCII Bezeichner.
Die Eindeutigkeit bei lokalen1 Erweiterung wird durch Anhängen
des DNS Namens gewährleistet (z.B. [email protected]). Die Benamsung ist im Protokoll geregelt.
Das Protokoll ist flexibel. Für jede Verbindung werden – unabhängig für
beide Richtungen – die zu verwendenden Methoden verhandelt. Die verhandelten Methoden können später jederzeit gewechselt werden.
Das“ Protokoll sind eigentlich Die“ Protokolle. Die SSH-Protokolle bil”
”
den einen Stapel voneinander relativ unabhängiger Schichten. Nur die
unterste Schicht ist für Verschlüsselung und Integrität verantwortlich.
3 Die Protokollschichten
Was passiert hier?
Selbst bei einer einfachen“login session sind bereits mehrere der SSH Protokol”
le vertreten.
1. Das SSH T RANSPORT L AYER Protokoll [sshTrans]
2. Das SSH A UTHENTICATION Protokoll [sshAuth], hier in Verbindung mit
dem SSH A UTHENTICATION A GENT Protokoll [sshAgent]
3. Das SSH C ONNECTION Protokoll [sshConn]
Ich werde diese Protokolle im Folgenden kurz – und oberflächlich – besprechen, ohne dabei auf die zur Authentifizierung, Verschlüsselung und Integritätswahrung
verwendeten Algorithmen einzugehen. SSH ist weitgehend unabhängig von
kryptographischen Algorithmen da diese ausgetauscht werden können. Auch
1 Die Erweiterung wird nur in einem Netzwerk verwendet, z.B. innerhalb einer Universität, und
ist nicht für die weitere Verbreitung vorgesehen.
2
gehören weit mehr Protokolle zu SSH als hier gezeigt, diese findet man bei
[secsh].
Trotzdem bietet diese Besprechung einen ersten Einblick in die Konzepte und
Flexibilität von SSH.
Die folgende Grafik stellt die an einer interaktiven login session beteiligten Protokolle und ihre Beziehungen zueinander dar. Die gestrichelten Pfeile geben
an, welche Komponente welche andere startet (z.B. wird das SSH C ONNEC TION Protokoll meist vom SSH A UTHENTICATION Protokoll gestartet). Dünne
durchgezogene Linien stellen Kommunikation zur Authentifikation dar (z.B.
müssen sowohl Client als auch Server Zugriff auf den Server-Hostkey haben
damit sich der Server Authentifizieren kann; Der User teilt dem SSH A UTHEN TICATION A GENT seine passphrase mit). Die dicke durchgezogen Linie stellt
schließlich die Nutzdaten dar. Grau hinterlegt sind die einzelnen Protokollebenen.
Terminal
Login shell
z.B. tty oder xterm
z.B. bash
C l i e n t
SSH Client
SSH Server
Connection
Multiplexing
Startet Services
Connection
Multiplexing
Startet Services
Authentication
Authentifiziert
Client / User
Authentication
Authentifiziert
Client / User
Transport Layer
?
ver− & entschlüsselt
Authentifiziert Server
Server
Hostkey
TCP/IP
Transport Layer
ver− & entschlüsselt
Authentifiziert Server
Port 22
3.1 Das SSH T RANSPORT L AYER Protokoll
Das SSH T RANSPORT L AYER Protokoll ist in [sshTrans] definiert.
Setzt auf einem zuverlässigen binären 8-Bit Protokoll auf, meist TCP/IP.
Dieses schützt vor Übertragungsfehlern.
Es bietet Verschlüsselung, Authentifizierung des Servers, Integrität der
Daten und Kompression.
Nach dem Verbindungsaufbau (bei TCP/IP an Port 22) werden die zu
verwendenden Methoden zwischen Client und Server verhandelt, die
Schlüssel ausgetauscht, und der Server authentifiziert.
3
S e r v e r
startet
Kommunikation
für Nutzdaten...
...und für die
Authentifizierung
Authentication Agent
Verwaltet private
Schlüssel
3.1.1 Verbindungsaufbau
1. Schritt Der Client kontaktiert den Server an Port 22 [IANA]
2. Schritt Beide Seiten senden ihren Version-String
SSH-$ protokollversion -$ softwareversion <CR><LF>
Methoden zur Wahrung der Kompatibilität zwischen Protokollversion 2.0 (hier
beschrieben) und früheren Versionen sind hier implementiert.
3.1.2 Datenübertragung
Nach dem Version-String werden Daten ausschließlich in Binärpaketen übertragen:
uint32
byte
byte[ ]
byte[ ]
byte[m]
packet length padding length payload
random padding
mac
Diese Daten
werden alle
verschlüsselt
klartext
Ist ein Verschlüsselungs-Algo vereinbart, werden die Daten mit diesem
verschlüsselt.
Der Empfänger sollte die Paketlänge nach Empfangen der ersten vier Bytes entschlüsseln.
hängt vom verhandelten Message Authentication Code Algorithmus
ab.
Das random padding wird so gewählt, daß gilt:
wo
!" $#&% ('*)
Blockgröße des Verschlüsselungs-Algos Alle im Folgenden dargestellten Pakete sind der Inhalt des payload Feldes.
Das erste Byte identifiziert dabei jeweils den Inhalt.
Hinweis Initial (vor den Verhandlungen) wird nicht verschlüsselt, und es ist
+ da noch kein mac-Algo vereinbart wurde. Es gibt also noch keine Verschlüsselung und keine Integrität.
3.1.3 Schlüsselaustausch & Verhandlung der Methoden
1. Schritt Jede Seite sendet eine SSH MSG KEXINIT Nachricht
4
byte
byte[16]
string
string
string
string
string
string
string
string
string
string
boolean
uint32
SSH MSG KEXINIT
random cookie
kex algorithms
server host key algorithms
encryption algorithms c2s
encryption algorithms s2c
mac algorithms c2s
mac algorithms s2c
compression algorithms c2s
compression algorithms s2c
languages c2s
languages s2c
first kex packet follows
0
Jede Seite zählt die Algorithmen auf,
die sie unterstützt
Die Strings enthalten, durch Komma
getrennt, standardisierte Bezeichner
c2s: Client to Server
s2c: Server to Client
language tags nach [RFC1766]
Versuche Schlüsselaustausch
reserviert
Die Bedeutung des random cookie erschließt sich nicht ganz aus der
Protokolldefinition. Es soll wohl verhindern, daß eine Seite Wissen über
den verwendeten Schlüssel erlangen kann. Wie dies funktioniert wird
nicht ganz klar.
Die verwendeten Bezeichner für die Algorithmen sind festgelegt. Für lokale Erweiterungen ist die Art der Benamsung festgelegt.
Verwendet wird aus jeder Liste der erste Algo, der von beiden Seiten akzeptiert wird. Dabei ist auf Abhängigkeiten zwischen den Algos zu achten: z.B. unterstützen manche Host-Key Algorithmen nicht das Signieren
und Verschlüsseln von Daten, und sind daher nicht für alle Schlüsselaustausch -Methoden geeignet.
Optional (vollkommen beliebig, nur durch first kex packet follows
angezeigt) wird gleich danach noch das erste Paket für die Schlüsselaustausch -Methode verschickt. Dieses Paket ist genau dann zu beachten,
wenn der vermutete Algo auch angewendet wird.
2. Schritt Der verhandelte Schlüsselaustausch -Algo wird gestartet.
Der Schlüsselaustausch -Algo nach D IFFIE -H ELLMAN ist in [sshTrans] erklärt.
Mit einer speziellen Primzahl ist er als diffie-hellman-group1-sha1 Algorithmus im Protokoll vorgesehen. Eine Beschreibung dieses Algorithmus
findet man z.B. bei [rsa], eine sehr kurze Implementation in C bei [dh-C].
Der Algo liefert eine Hashfunktion , einen gemeinsamen Hash-Wert
, und ein gemeinsames Geheimnis welches nur den beiden Parteien bekannt ist. Obwohl in der Protokolldefinition nicht explizit erwähnt,
muß auch
ein gemeinsames Geheimnis sein. Dies folgt auch aus der
Definition des diffie-hellman-group1-sha1 Algorithmus.
Der Server wird authentifiziert (z.B. als Folge des erfolgreichen Schlüsselaustausch s: Es existieren Schlüsselaustausch -Methoden, die die Authentifizierung des Servers implizieren). Dazu ist ein Host-Key des Servers nötig, den der Client kennen muß.
5
Beim ersten Schlüsselaustausch nach dem Verbindungsaufbau wird
!"
gesetzt. Dieser eindeutige Bezeichner für eine Verbindung wird auch bei
späteren Verhandlungen nicht mehr geändert.
Alle Schlüssel werden wie folgt berechnet:
1. !"
% 2. solange zu kurz: !"
% ist ein im Protokoll festgelegtes byte im Bereich ’A’-’F’ Die nötige
Länge eines Schlüssels ergibt sich aus dem verhandelten Algorithmus.
Zur Authentifizierung des Servers muß der Client den Host-Key des Servers
kennen. Um die Verwendung von SSH zu vereinfachen, kann auf die Authentifizierung des Servers verzichtet werden. Dies sollte nur beim aller ersten Verbindungsaufbau zu dem fremden Server erfolgen.
Vorteil: SSH wird öfter angewendet, erhöht also insgesamt die Sicherheit.
Nachteil: Bei der ersten Verbindung kann eine man in the middle attac
durchgeführt werden. Dies ist jedoch sehr unwahrscheinlich.
Alternativen:
– Der Server-Key kann von einer zentralen vertrauenswürdigen (???)
Stelle signiert zur Verfügung gestellt werden.
– Der Server-Key kann per Fingerprint und persönlichem oder telefonischem Kontakt überprüft werden
3. Schritt Jede Seite sendet eine SSH MSG NEWKEYS Nachricht.
Diese Nachricht wird mit den alten Methoden (falls welche definiert waren, initial also keine) verschlüsselt. Auch ohne Verschlüsselung impliziert die Schlüsselaustausch -Methode jedoch die Integrität des Servers.
Danach sind ausschließlich die neuen Methoden erlaubt.
Jede Seite kann jederzeit (außer während dem Schlüsselaustausch ) mit
einer neuen SSH MSG KEXINIT Nachricht erneute Verhandlungen erzwingen. Dies sollte regelmäßig erfolgen, etwa jede Stunde oder nach 1GB
Daten.
Sichere Kommunikation
Alle Daten vom Client zum Server und umgekehrt werden unabhängig
voneinander durch die verhandelten Algorithmen verschlüsselt. Der Empfänger ist jeweils dafür verantwortlich die Daten zu entschlüsseln und
die Integrität zu prüfen.
6
Zur Sicherung der Integrität wird (bei verhandeltem MAC) an jede Nachricht noch eine Signatur
!" angehängt. Die Länge von mac ist beiden Seiten durch die Verhandlung des MAC-Algos bekannt.
Alle weiteren Protokollschichten kommunizieren über das SSH T RANS PORT L AYER Protokoll, müssen sich also weder um Verschlüsselung, Integrität noch Authentifizierung des Servers kümmern.
Nach dem Schlüsselaustausch
1. Schritt Der Client fordert einen Service vom Server an.
byte
string
SSH MSG SERVICE REQUEST
service name
Im Protokoll sind zwei Service definiert:
‘ssh-userauth’
‘ssh-connection’
2. Schritt Der Server bietet den Service an und erlaubt dem Client diesen zu
benutzen, indem er eine SSH MSG SERVICE ACCEPT Nachricht übergibt:
byte
string
SSH MSG SERVICE ACCEPT
service name
Andernfalls muß der Server die Verbindung unterbrechen (siehe unten)
3.1.4 Administrative Nachrichten
Abgesehen von den Datenpaketen die das Protokoll von den darüberliegenden
Protokollschichten empfängt, oder an diese weiterleitet, gibt es noch ein paar
Nachrichten, die das SSH T RANSPORT L AYER Protokoll steuern:
Die Verbindung wird durch eine SSH MSG DISCONNECT Nachricht getrennt.
byte
uint32
string
string
SSH MSG DISCONNECT
reason code
description
language tag
ist im Protokoll definiert
Beschreibung in Worten
language tags nach [RFC1766]
Versteht eine Seite den angegebenen Nachrichtentyp nicht, so antwortet
sie mit
byte
uint32
SSH MSG UNIMPLEMENTED
sequence number
7
der betreffenden Nachricht
Debug Nachrichten erleichtern die Fehlersuche
Es gibt sogar einen Nachrichtentyp der zwar akzeptiert wird, dessen Daten (ein string) jedoch ignoriert werden. Das Senden dieser Nachricht mit
zufälligen Daten erschwert known plaintext und traffic analysis Angriffe.
Auch kann diese Nachricht verwendet werden, um versteckte Nachrichten zu übermitteln. Client und Server müssen entsprechend modifiziert
werden.
3.2 Das SSH A UTHENTICATION Protokoll
Das SSH A UTHENTICATION Protokoll ist in [sshAuth] definiert.
Setzt auf dem SSH T RANSPORT L AYER Protokoll auf.
Es bietet den Aufsatzpunkt für eine Verbindung mit dem SSH C ONNEC TION Protokoll, bei der der User/Client authentifiziert ist.
um dieses Protokoll zu starten setzt der Client in seinem SSH MSG SERVICE REQUEST das Feld service name = ‘ssh-userauth’ .
1. Schritt Um sich zu authentifizieren sendet der Client eine SSH MSG USERAUTH REQUEST Nachricht an den Server
byte
string
string
string
...
SSH MSG USERAUTH REQUEST
user name
service name
method name
...
Name des Users
starte Service nach Authentifizierung
Authentifizierungsmethode
hängt von der Methode ab
2. Schritt Die jetzt ablaufende Kommunikation zwischen Server und Client
ist abhängig von der gewählten Methode.
3. Schritt Danach antwortet der Server mit
byte
SSH MSG USERAUTH SUCCESS
falls er die Authentifizierung akzeptiert, oder mit
byte
string
boolean
SSH MSG USERAUTH FAILURE
authentications continue
partial success
Liste möglicher Methoden
Letzter Versuch war erfolgreich
falls die Authentifizierung nicht vollständig war.
Besteht der Authentifizierungsvorgang aus mehreren Schritten, so sendet der Server auch nach jedem erfolgreichen Schritt der die Authentifizierung nicht erfolgreich abschließt eine SSH MSG USERAUTH FAILURE
Nachricht, bei der jedoch partial success auf TRUE gesetzt ist. Die
Liste authentications continue enthält dann eine Liste der noch
verbleibenden möglichen Methoden von der der Client eine auswählen
kann.
8
Wird als Authentifizierungsmethode none gewählt, so muß der Server
diesen Versuch zurückweisen. Zweck dieser Methode ist es, eine Liste
möglicher Authentifizierungsmethoden abzufragen: Der Server übermittelt eine Liste der möglichen Methoden (und muß nur diese akzeptieren),
der Client kann eine beliebige davon auswählen.
Ist eine Authentifizierung fehlgeschlagen, so darf der Server irreführende
Daten in der Liste authentications continue angeben, und trotzdem nie einen weiteren Versuch akzeptieren.
Die Authentifizierung ist abgeschlossen, sobald der Server SSH MSG USERAUTH SUCCESS meldet.
Solange die Authentifizierung noch nicht abgeschlossen ist kann der Server
Nachrichten an den Client senden. Der Client sollte diese anzeigen (vergleichbar mit /etc/issue bei guten Betriebssystemen).
byte
string
string
SSH MSG USERAUTH BANNER
message
language
Eine Nachricht
language tags nach [RFC1766]
3.2.1 Authentifizierungsmethoden
Das Protokoll ist auch hier erweiterbar, drei Methoden sind im Protokoll definiert. Insbesondere sind die Authentifizierungsmethoden unabhängig von den
beim Schlüsselaustausch verhandelten Methoden.
Beispiel ‘public key’ ist die einzige Methode die das SSH A UTHENTICA TION Protokoll vorschreibt. Der Besitz eines privaten Schlüssels authentifiziert
den Client. Meist ist dieser Schlüssel verschlüsselt beim User gespeichert und
muß erst mit einer passphrase freigeschaltet werden.
1. Schritt Der Client fragt nach dieser Authentifizierungsmethode mit
byte
string
string
string
boolean
string
string
SSH MSG USERAUTH REQUEST
user name
service name
‘public key’
FALSE
public key algorithm name
public keyblob
Diese Felder wie
oben besprochen
siehe unten
Name des Algos
z.B. Zertifikate des Schlüssels
2. Schritt Akzeptiert der Server diese Anfrage...
byte
string
string
SSH MSG USERAUTH PK OK
public key algorithm name
public keyblob
9
Daten aus der
Anfrage
3. Schritt ...so sendet der Client ein von ihm mit seinem privaten Schlüssel
signiertes Paket an den Server, um sich zu authentifizieren:
byte
string
string
string
boolean
string
string
string
SSH MSG USERAUTH REQUEST
user name
service name
‘public key’
TRUE
public key algorithm name
public key
signature
Diese Felder wie
oben besprochen
siehe unten
wie oben
der öffentliche Schlüssel
Signatur über das ganze Paket
Der Client darf auch gleich zu Beginn dieses Paket senden. Es es kann anhand
des boolean Feldes identifiziert werden.
4. Schritt Der Server kann anhand des öffentlichen Schlüssels des Benutzers
die Echtheit des Paketes überprüfen. Damit ist der Client authentifiziert.
Der öffentliche Schlüssel wurde zuvor an den Server übermittelt.
Hinweis Hier ist die Protokolldefinition nicht ganz eindeutig. Dort heißt es:
Der Server muß prüfen, ob der mit dem ‘public key’ Paket übergebene
öffentliche Schlüssel zur Authentifizierung akzeptiert wird.
In [OpenSSH] heißt es jedoch:
Der öffentliche Schlüssel des Clients/Users muß dem Server in
$SERVERHOST:$HOME/.ssh/authorized keys
bekannt sein.
So verhält sich auch die Implementation. Das Protokoll läßt hingegen offen,
wie der Schlüssel auf Akzeptanz geprüft werden soll, theoretisch könnte er
auch erst in dem Anfrage-Paket übermittelt werden.
Das SSH A UTHENTICATION A GENT Protokoll [sshAgent] erleichtert dem
User die Verwendung öffentlicher/privater Schlüssel zur Authentifizierung.
Auf dem Client-Host kann außer dem SSH Client noch ein SSH Agent
aktiv sein. In diesem Fall können Client und Agent über einen vertrauenswürdigen, plattform-abhängigen Kanal kommunizieren.
Der Agent verwaltet die privaten Schlüssel des Users, und kann Operationen mit ihnen durchführen. Der Agent gibt den privaten Schlüssel
nicht nach Außen weiter. Mögliche Operationen sind
– Signieren übergebener Daten.
– Entschlüsseln übergebener Daten.
– Challenge-Response Authentication, dabei werden übergebene Daten
entschlüsselt, mit der session id konkateniert und der MD5-Hash
davon zurückgegeben.
10
Die durchzuführende Operation wird durch einen string identifiziert.
Diese Liste kann – mit dem für SSH üblichen Mechanismus – erweitert
werden.
Um dem Agenten einen privaten Schlüssel zur Verwaltung zu übergeben,
muß der User ggf. die entsprechende passphrase eingeben.
Der User kann private Schlüssel wieder vom Agent entfernen, die Anzahl
ihrer Nutzungen und ihre Lebensdauer beschränken.
Weitere Authentifizierungsmethoden
1. Die Methode ‘password’ übermittelt den Benutzernamen und das passende Passwort an den Server. Obwohl das Passwort hier im Klartext
erscheint, wird es vom darunter liegenden SSH T RANSPORT L AYER Protokoll verschlüsselt.
2. Die Methode ‘host based’ identifiziert den User über einen hostspezifischen privaten Schlüssel und den Namen des Users auf diesem System.
Bei dieser Methode sollte man darauf achten, daß keine unautorisierten
Benutzer auf dem Client-Host Zugang zum privaten Schlüssel haben.
3.3 Das SSH C ONNECTION Protokoll
Das SSH C ONNECTION Protokoll ist in [sshConn] definiert.
Setzt auf dem SSH A UTHENTICATION Protokoll auf. In diesem Fall ist
der service name beim SSH A UTHENTICATION Protokoll auf ‘ssh-connection’ zu setzen.
Bietet interaktive login sessions (login shell auf dem Server-Host) und remote execution (Programm auf dem Server-Host ausführen)
ermöglicht X11-forwarding (Ein X11-Client auf dem Server-Host leitet seine Ausgabe auf den X11-Server des Client-Hosts um)
ermöglicht TCP/IP port-forwarding (Verbindungen z.B. zu einem Port des
Server-Hosts werden an den Client-Host weitergeleitet)
Durch Multiplexing werden mehrere logische Verbindungen (Kanäle) in
einer SSH C ONNECTION Verbindung untergebracht.
Um diese Protokoll zu starten setzt der Client in seinem SSH MSG USERAUTH REQUEST das Feld service name = ‘ssh-connection’ .
Obwohl dies aus dem Protokoll nicht ausdrücklich hervorgeht, ist zu vermuten daß ein Server das SSH C ONNECTION Protokoll auch starten kann wenn
sich der User/Client zuvor nicht identifiziert hat, ohne gegen das Protokoll zu
verstoßen. Der Client muß dazu in seinem SSH MSG SERVICE REQUEST das
Feld service name = ‘ssh-connection’ setzen, der Server muß konfiguriert sein unauthentifizierte connections zu akzeptieren.
11
3.3.1 Das Konzept der Kanäle
Terminals (login session, pseudo terminal), port forwarding etc. laufen über
je einen Kanal.
Kanäle sind bidirektional
Jede Seite kann einen Kanal öffnen
Alle Kanäle laufen über eine Verbindung mit dem SSH C ONNECTION
Protokoll
Kanäle werden auf beiden Seiten durch – nicht notwendig identische –
Nummern repräsentiert.
1. Schritt Ein Kanal wird durch Senden einer SSH MSG CHANNEL OPEN Nachricht geöffnet:
byte
string
uint32
uint32
uint32
...
SSH MSG CHANNEL OPEN
channel type
sender channel
initial window size
maximum packet size
...
max. Größe des Datenpakets
abhängig vom Typ des Kanals
channel type gibt an für welchen Zweck der Kanal geöffnet werden
soll. Mögliche Werte sind im Protokoll definiert, können aber wie üblich
erweitert werden.
sender channel ist die Nummer mit der der Absender den Kanal identifiziert. Nachrichten auf diesem Kanal an den Absender dieser Nachricht
tragen im Feld recipient channel diesen Wert.
Der Absender gibt mit initial window size an, wieviele Datenbytes
er bereit ist zu empfangen. Beim Empfang von Daten dekrementiert er
intern diesen Wert. Ist 0 erreicht so muß er alle weiteren Datennachrichten
auf diesem Kanal ignorieren.
2. Schritt Der Empfänger dieser Nachricht bestätigt mit
byte
uint32
uint32
uint32
uint32
...
SSH MSG CHANNEL OPEN CONFIRMATION
recipient channel
sender channel
initial window size
maximum packet size
...
abhängig vom Typ des Kanals
oder lehnt ab, mit
byte
uint32
uint32
string
string
SSH MSG CHANNEL OPEN FAILURE
recipient channel
reason code
textual information
language tag
12
Kanal beim Empfänger
beschreibt den Fehler
language tags nach [RFC1766]
recipient channel ist hier der Wert sender channel aus dem Paket
von oben. Unter sender channel gibt der Absender dieser Nachricht
an, mit welcher Nummer er seinerseits den Kanal identifiziert.
Alles Andere wie oben
3. Schritt Für die Datenübertragung stehen drei Nachrichten zur Verfügung
1. Um mehr Daten empfangen zu können als bei der Öffnung des Kanals
angegeben, sendet eine Seite
byte
uint32
uint32
SSH MSG CHANNEL WINDOW ADJUST
recipient channel
bytes to add
Dabei gibt bytes to add an, wieviele Bytes mehr auf dem Kanal recipient channel empfangen werden.
2. Daten werden als
byte
uint32
string
SSH MSG CHANNEL DATA
recipient channel
data
oder
byte
uint32
uint32
string
SSH MSG CHANNEL EXTENDED DATA
recipient channel
data type code
data
übertragen. Die zweite Form wird verwendet, um Ausgaben von stderr
als solche markieren zu können. Der einzige im Protokoll definierte data type code ist SSH EXTENDED DATA STDERR . Daten die mit diesen beiden Nachrichten versendet werden, müssen vom verfügbaren window space abgezogen werden.
4. Schritt Will eine Seite keine Daten mehr senden, so kann Sie dies durch
byte
uint32
SSH MSG CHANNEL EOF
recipient channel
anzeigen. Sie kann dann weiterhin Daten über den betreffenden Kanal empfangen. Mit
byte
uint32
SSH MSG CHANNEL CLOSE
recipient channel
wird ein Kanal in beide Richtungen geschlossen.
13
3.3.2 Kanäle steuern
Für die unterschiedlichen Kanaltypen gibt es spezielle administrative Nachrichten, die keinen window space verbrauchen. Allgemein haben sie die Form
byte
uint32
string
boolean
...
SSH MSG CHANNEL REQUEST
recipient channel
request type
want reply
...
spezifische Daten
Worauf die Gegenseite – falls want reply = TRUE ist – mit
byte
uint32
SSH MSG CHANNEL SUCCESS
recipient channel
byte
uint32
SSH MSG CHANNEL FAILURE
recipient channel
oder
oder für diesen Request spezifischen Nachrichten antworten kann.
Ist want reply = FALSE , so wird keine Antwort gesendet.
Jede Seite kann weitere Pakete senden, ohne auf Antwort zu warten.
3.3.3 Beispiel
Ein Beispiel ist das Aufbauen einer interaktiven login session:
1. Schritt Der Client öffnet einen Kanal für die Session:
byte
string
uint32
uint32
uint32
SSH MSG CHANNEL OPEN
‘session’
sender channel
initial window size
maximum packet size
Eine ‘session’ ist nicht unbedingt an eine Shell gebunden. Statt dessen kann
jedes beliebige Programm auf dem Server ausgeführt werden, sofern der Server dies erlaubt.
2. Schritt (optional) Der Client fordert ein pseudo terminal an:
byte
uint32
string
boolean
string
uint32
uint32
uint32
uint32
string
SSH MSG CHANNEL REQUEST
recipient channel
‘pty-req’
want reply
TERM
columns
rows
width
height
encoded terminal modes
14
Dieser Teil wie
oben besprochen
Umgebungsvariable, z.B. vt100
Größe des Terminals
in Zeilen und Spalten
oder in Pixeln
beschreibt das Terminal
Es stehen Nachrichten zur Verfügung, die dem Server Änderungen der
Fenstergröße mitteilen.
Es ist nicht unbedingt notwendig ein Pseudoterminal anzufordern. Statt
dessen (oder zusätzlich) könnte z.B. auch X11-forwarding aktiviert werden.
Erfordert das auf dem Server gestartete Programm keine Interaktion so
ist natürlich auch kein Fenster“nötig.
”
Die Beschreibung des Terminals in encoded terminal modes ist im
Protokoll festgelegt, und folgt weitgehend den POSIX Vorgaben.
3. Schritt (optional) Umgebungsvariablen können übergeben werden:
byte
uint32
string
boolean
string
string
SSH MSG CHANNEL REQUEST
recipient channel
‘env’
want reply
variable name
variable value
Dieser Teil wie
oben besprochen
Name und Wert der
übergebenen Variablen
4. Schritt Die Shell wird gestartet:
byte
uint32
string
boolean
SSH MSG CHANNEL REQUEST
recipient channel
‘shell’
want reply
Dieser Teil wie
oben besprochen
Dabei wird die Shell des Benutzers gestartet, die bei guten Betriebssystemen in /etc/passwd festgelegt ist.
Statt request type = ‘shell’ ist z.B. auch request type = ‘exec’
möglich, um ein Programm auf dem Server zu starten.
Es stehen Nachrichten zur Verfügung, die flow control, Änderungen des
Pseudoterminals, oder Signale übermitteln.
4 Anhang
4.1 Standards
US-ASCII [RFC20] 7-Bit ASCII in 8-Bit Bytes, bei denen das MSB gleich 0 ist.
Alle Bezeichner, wie sie z.B. bei der Verhandlung von Algorithmen verwendet werden, müssen US-ASCII Strings sein.
ISO-10646 UTF-8 [RFC2279] Diese Darstellung von Bytes verhält sich bei USASCII Daten transparent und kompatibel zu Software, die US-ASCII erwartet, ist jedoch auch fähig, UCS-2 und UCS-4 Zeichen darzustellen.
Strings in UTF-8 werden innerhalb des SSH Protokolls meist für Fehlermeldungen verwendet.
15
language tags [RFC1766] Beschreiben die verwendete oder die zu verwendende Sprache.
Wird bei SSH in Verbindung mit z.B. Fehlerbeschreibungen in UTF-8 gegeben.
4.2 Datentypen
Die im Protokoll verwendeten Datentypen sind
byte Ein octet, d.h. 8 Bit lang (das Protokoll auf dem SSH aufsetzt muß acht Bit
Bytes übertragen)
boolean Ein byte, 1 (true) oder 0 (false). Von 0 verschiedene Werte werden als
1 interpretiert.
uint32 Ein 32 Bit langer vorzeichenloser Integer in network byte order (MSB zuerst).
uint64 Ein 64 Bit langer vorzeichenloser Integer in network byte order (MSB zuerst).
string Ein beliebig langer String, der beliebige 8-Bit Zeichen (auch die 0) enthalten kann. Gespeichert als ein uint32 der die Länge angibt, gefolgt von
entsprechend vielen bytes.
mpint Ein langer Integer mit Vorzeichen, gespeichert als string. Die 0 ist der
leere String. Sonst enthält der Datenbereich des Strings die Binärdarstellung
der Zahl, MSB zuerst, das erste Bit gibt das Vorzeichen an.
Literatur
[dh-C]
unbekannt, Diffie-Hellman Key Exchange 10 line C program
http://www.cypherspace.org/˜adam/rsa/dh-in-C.html
[IANA]
http://www.iana.org/assignments/port-numbers
[OpenSSH] Die Dokumentation zu OpenSSH 3.6.1
http://www.openssh.org/manual.html
[rfc]
http://www.rfc.net/
[RFC20]
Vint Cerf, ASCII format for Network Interchange, RFC20, Oktober
1969 [rfc]
[RFC1766] H. Alvestrand, Tags for the Identification of Languages, RFC1766,
March 1995 [rfc]
[RFC2279] F. Yergeau, UTF-8, a transformation format of ISO 10646, RFC2279,
January 1998 [rfc]
[rsa]
RSA Laboratories, What is Diffie-Hellman?
http://www.rsasecurity.com/rsalabs/faq/3-6-1.html
[secsh]
http://www.ietf.org/ids.by.wg/secsh.html
16
[sshAgent] Ylonen, T., Secure Shell Authentication Agent Protocol, draft-ietfsecsh-agent-01.txt, November, 2002 [secsh]
[sshArch] Ylonen, T., SSH Protocol Architecture, draft-ietf-secsh-architecture13.txt, September 2002 [secsh]
[sshAuth] Ylonen, T., SSH Authentication Protocol, draft-ietf-secsh-userauth16.txt, September 2002 [secsh]
[sshConn] Ylonen, T., SSH Connection Protocol, draft-ietf-secsh-connect-16.txt,
September 2002 [secsh]
[sshTrans] Ylonen, T., SSH Transport Layer Protocol, draft-ietf-secsh-transport15.txt, September 2002 [secsh]
17
Herunterladen