Orginal bei www.tu-chemnitz.de/~hot/ssh

Secure Shell (SSH)


Gesicherte Kommunikation über unsichere Netze


Index


SSH im Überblick

Hinweis: Neben den nichtkommerziellen SSH-Versionen gibt es auch kommerzielle Versionen. Die bereits erwähnte finnische Firma Data Fellows hat die exklusiven Rechte zur Vergabe von Lizenzen für die kommerziellen SSH-Produkte.

Die nachfolgenden Darstellungen beziehen sich auf die nichtkommerziellen Versionen 1.2.x (die unter Beachtung der NON-COMMERCIAL LICENSE konstenfrei beschafft und genutzt werden können) sowie die von diesen Implementierungen realisierte Version 1.x des SSH-Protokolls.


Interessante Eigenschaften

Die folgende Liste nennt einige interessante Eigenschaften der Secure Shell:


Kommando-Übersicht

Zur SSH-Distribution gehören folgende Kommandos:

Anmerkung:
SSH nutzt gegenwärtig zur Schlüsselverteilung keine Verzeichnissysteme (Directories) wie z.B. X.500 und keine Zertifikate. Die RSA-Keys der Nutzer und Server-Rechner werden in Dateien des Dateisystems gehalten und durch die mitgelieferten Werkzeuge bzw. mit Hilfe eines gewöhnlichen ASCII-Editors (Vi, Emacs, ...) gepflegt. Es ist möglich, beim ersten Kontakt zu einem unbekannten Server dessen Host-Key automatisch zu "lernen". In diesem Fall trägt der SSH-Klient diesen Schlüssel in die lokale Schlüssel-Datenbasis ein.

In den vom 22. Juni 1999 datierten Internet-Drafts (z.B. http://www.ietf.org/internet-drafts/draft-ietf-secsh-transport-06.txt) für die Version 2.0 des SSH-Protokolls sind verschiedene Formate für öffentliche Schlüssel und/oder Zertifikate vorgesehen, deren Unterstützung obligatorisch, empfohlen oder optional ist:

DSS, der Digital Signature Standard der US-Regierung
[http://csrc.nist.gov/fips/fips186.ps]
obligatorisch
X.509-Zertifikate, konkret Version 3 (X.509v3) empfohlen
SPKI-Zertifikate optional
OpenPGP-Zertifikate optional


Prinzipieller Ablauf beim Login

Das Login auf einem Server läuft gemäß SSH-Protokoll 1.x prinzipiell so ab:

Hinweis: Die Umleitung der X11-Verbindungen funktioniert nur, wenn die von SSH eingestellte DISPLAY-Variable vom Nutzer nicht nachträglich verändert wird. Der SSH-Dämon muß den X11-Applikationen als lokaler X11-Server erscheinen, deshalb ist eine entsprechende Einstellung von DISPLAY erforderlich.


Gegenseitige Authentifizierung der Partner

Der Server weist seine Authentizität implizit nach. Letztlich kann er nur bei Kenntnis der privaten Keys dH und dS den vom Klienten generierten und verschlüsselten Sitzungsschlüssel ermitteln. Gelingt ihm das nicht, endet die Kommunikation, da er dann die Pakete des Binärprotokolls weder entschlüsseln noch korrekt erzeugen kann.

Unerläßliche Voraussetzung für die Sicherheit dieses Verfahrens ist, daß der Klient überprüfen kann und überprüft, ob der öffentliche Host-Key des Servers wirklich diesem zugeordnet ist. Ein beliebiges Schlüsselpaar kann jeder, auch ein potentieller Angreifer, ohne Probleme generieren und in den Authentifizierungsdialog einbringen.

Die Zusammengehörigkeit von Server und öffentlichem Host-Key wird an Hand der Einträge in entsprechenden Administrationsdateien überprüft.

Verfahren zur Authentifizierung des Klienten

Die Secure Shell unterstützt in der Grundversion die vier nachfolgend genannten Verfahren zur Authentifizierung des Klienten, wobei die Nutzung der einzelnen Verfahren durch Kommandozeilen-Optionen bzw. Einträge in den Konfigurationsdateien gezielt zugelassen bzw. unterdrückt werden kann. Die in einer konkreten Konstellation verfügbaren Verfahren werden nacheinander bis zum ersten Erfolg oder bis zum definitiven Mißerfolg versucht:

  1. Rhosts-Authentifizierung

    Dieses Verfahren entspricht der Authentifizierung bei rlogin und rsh. Es basiert auf den Einträgen in den Dateien /etc/hosts.equiv oder /etc/shosts.equiv bzw. $HOME/.rhosts oder $HOME/.shosts.

    Warnung: Diese Methode ist absolut unsicher und wird daher sinnvollerweise vom Server in der Regel nicht unterstützt!!

  2. Rhosts-RSA-Authentifizierung

    Hierbei handelt es sich um eine Kombination der Rhosts-Authentifizierung (Verfahren 1) mit einer RSA-basierten Authentifizierung des Klienten-Rechners. Die bekannten öffentlichen Schlüssel der Klienten werden beim Server in den Dateien $HOME/.ssh/known_hosts und /etc/ssh_known_hosts gespeichert. Der Klient muß in einem Challenge-Response-Dialog nachweisen, daß er den zugehörigen privaten Schlüssel kennt.

    Der private Schlüssel eines Hosts (Rechners) wird im File /etc/ssh_host_key gespeichert. Dieses File darf nur für den Superuser root lesbar sein!

  3. reine RSA-Authentifizierung

    Sie stellt die flexibelste und potentiell sicherste Methode dar. Hierbei weist der Nutzer die Kenntnis seines privaten Schlüssels und damit seiner Identität über ein Challenge-Response-Verfahren nach, das sich unter Verwendung des SSH-Agenten automatisch abwickeln läßt.

    Die zur Authentifizierung nutzbaren öffentlichen Schlüssel stehen auf dem Server im File $HOME/.ssh/authorized_keys. Das Schlüsselpaar des Nutzers wird beim Klienten in einer Datei, standardmäßig in $HOME/.ssh/identity, gespeichert.

  4. Paßwort-Authentifizierung

    Die Authentifizierung erfolgt durch Angabe eines Nutzerpaßworts, wobei dieses immer verschlüsselt übertragen wird.

    Im Standardfall handelt es sich dabei um das normale UNIX-Paßwort. Allerdings lassen sich auch andere Paßwörter nutzen, z.B. von AFS bzw. Kerberos oder von den SecurID-Karten der Firma Security Dynamics [http://www.securitydynamics.com]. Mitunter sind dafür spezielle Patches erforderlich.

Je nach Installation können weitere Authentifizierungsverfahren zur Verfügung stehen. So enthalten z.B. die Quellen der SSH 1.2.27 eine optionale Unterstützung des zum TIS Internet Firewall Toolkit [http://www.tis.com/research/software/fwtk/] gehörenden Authentifizierungs-Servers sowie von Kerberos-Tickets. Standardmäßig wird Kerberos Version 5 verwendet. Mit entsprechenden Patches läßt sich aber auch die beispielsweise bei AFS eingesetzte Version 4 von Kerberos nutzen.


Beispielsitzung

Die nachfolgenden Ausschnitte aus einer realen Sitzung des Nutzers hot sollen zeigen, welche Schritte von einem normalen Anwender unternommen werden müssen, um mit der SSH unter Verwendung der reinen RSA-Authentifizierung (Verfahren 3) ein erstes erfolgreiches Login zu realisieren. Es wird dabei von der Annahme ausgegangen, daß der Nutzer maximale Sicherheit und Flexibiltät wünscht und sich daher nur auf seine eigenen RSA-Keys verläßt.

Im Beispiel sitzt Nutzer hot am Rechner kirke und will sich auf Rechner sisyphus.hrz anmelden.

Um sich selbst mit Hilfe von RSA-Keys authentifizieren zu können, muß sich der Nutzer mindestens ein solches Schlüsselpaar erzeugen. Dazu dient das Programm ssh-keygen:

hot@kirke 8 > ssh-keygen 
Initializing random number generator...
Generating p:  ..........................................++ (distance 734)
Generating q:  ...++ (distance 48)
Computing the keys...
Testing the keys...
Key generation complete.
Enter file in which to save the key (/home/hot/.ssh/identity): 
Enter passphrase: 
Enter the same passphrase again: 
Your identification has been saved in /home/hot/.ssh/identity.
Your public key is:
1024 37 16859638557607674292986699368320095767875909797393325534467993118889
8248355555842589544029851114499535066615194649319583696257760306546230720850
5511775977979037973020626780660559112158077971574041530476930932301911603728
8384562010283474570023156169635886609631715470531463357831759704636209077472
3735493413371 hot@kirke
Your public key has been saved in /home/hot/.ssh/identity.pub

Der Private Key wurde zur Sicherheit mit einer nur dem Nutzer bekannten Passphrase verschlüsselt.

Der Public Key ist auf einem sicheren Weg auf den Server zu bringen, um denjenigen Klienten den Zugang zu erlauben, die im Besitz des zugehörigen Private Keys sind. Es genügt, den Inhalt der gerade generierten Datei $HOME/.ssh/identity.pub als eine weitere Zeile in die Datei $HOME/.ssh/authorized_keys auf dem Server einzutragen.

Um sicherzustellen, daß der Klient auch wirklich mit dem richtigen Server kommuniziert, muß dem Klienten der Public Key des Servers bekanntgemacht werden. Sofern dieser Schlüssel noch nicht vom Administrator in die Datei /etc/ssh_known_hosts aufgenommen wurde, muß ihn der Anwender in die Datei $HOME/.ssh/known_hosts eintragen.

Dazu ist dieser Datei eine neue Zeile hinzuzufügen, die hinter dem Hostnamen des Servers dessen Public Key enthält. Dieser Public Key kann in der Regel direkt der auf der Server-Maschine befindlichen Datei /etc/ssh_host_key.pub entnommen werden, da die externen Schlüsselformate übereinstimmen. Das Voranstellen des Server-Namens gestattet dem Klienten die Zuordnung der Keys zu den verschiedenen Servern. Der sichere Transport der Schlüssel obliegt dem Anwender.

Hinweis: Die Datei /uni/global/text/ssh_known_hosts enthält eine Sammlung der Public Keys verschiedener Maschinen, u.a. der öffentlichen Server des URZ.

Die Liste der bekannten Hosts sieht nach dem Eintrag des Schlüssels von sisyphus.hrz z.B. so aus:

sisyphus.hrz 1024 35 1037672791507197971938948745194100693185694454963168871
3556827896678605792767417152408598699835899502502833314458715509190444018350
9232949190834716492500158729148375969077951642992724314261111314438986691881
6150558438630930840117849687124516919057970663026120425900174307027554281688
80318691535204077340995723
Hinweis: Will der Nutzer generell sicherstellen, daß immer nur vorab eingetragene Server akzeptiert werden, so muß er in der Konfigurationsdatei des Klienten ($HOME/.ssh/config) die Option StrictHostKeyChecking einschalten. Damit wird verhindert, daß der Klient neue Keys von bisher unbekannten Servern einfach "lernt", also ohne Prüfung einträgt.

Anmerkung: Ab der Version 1.2.20 sind bei StrictHostKeyChecking drei Werte zulässig: yes, no und ask. Im Standardfall wird ask verwendet, d.h., vor dem Lernen eines neuen Keys wird das Einverständnis des Nutzers eingeholt.

Damit sind alle notwendigen Vorbereitungen für ein gesichertes Login getroffen. Zur Demonstration wird ssh mit der Option -v gestartet, um den gesamten Authentifizierungsdialog am Bildschirm verfolgen zu können. Bei der normalen Arbeit wird man auf die Option -v in der Regel verzichten.

SSH Version 1.2.26-afs_pl1 [i686-unknown-linux], protocol version 1.5.
Standard version.  Does not use RSAREF.
kirke: Reading configuration data /home/hot/.ssh/config
kirke: Reading configuration data /etc/ssh_config
kirke: ssh_connect: getuid 324 geteuid 0 anon 1
kirke: Connecting to sisyphus.hrz [134.109.132.18] port 22.
kirke: Connection established.
kirke: Remote protocol version 1.5, remote software version 1.2.26-afs_pl1
kirke: Waiting for server public key.
kirke: Received server public key (768 bits) and host key (1024 bits).
kirke: Host 'sisyphus.hrz' is known and matches the host key.
kirke: Initializing random; seed file /home/hot/.ssh/random_seed
kirke: Encryption type: 3des
kirke: Sent encrypted session key.
kirke: Installing crc compensation attack detector.
kirke: Received encrypted confirmation.
kirke: ClearToken info:
kirke:    BeginTimestamp: 906443693 (Tue Sep 22 07:54:53 1998)
kirke:    EndTimestamp: 906535274 (Wed Sep 23 09:21:14 1998)
kirke:    calculated lifetime: 91581 (25.4392 hours)
kirke: credentials: lifetime=141, issue_date=906443693
kirke: credentials: endTime calculated by krb_life_to_time(906443693,141)=906535274
kirke: Remote: extracted endTime of credentials=906535274
kirke: Remote: lifetime of credentials calculated by krb_time_to_life(906443693,906535274)=141
kirke: Remote: AFS token accepted (afs@tu-chemnitz.de, AFS ID 4324@tu-chemnitz.de)
kirke: No agent.
kirke: Trying RSA authentication with key 'hot@kirke'
kirke: Received RSA challenge from server.
Enter passphrase for RSA key 'hot@kirke': 
kirke: Sending response to host key RSA challenge.
kirke: Remote: RSA authentication accepted.
kirke: RSA authentication accepted by server.
kirke: Requesting pty.
kirke: Requesting X11 forwarding with authentication spoofing.
kirke: Requesting shell.
kirke: Entering interactive session.
Last login: Tue Sep 22 11:35:00 1998 from 134.109.192.39
Sun Microsystems Inc.   SunOS 5.5.1     Generic Jan 1997
================================================================
Terminal type ?(xterm):
hot@sisyphus 1 > tokens

Tokens held by the Cache Manager:

User's (AFS ID 4324) tokens for afs@tu-chemnitz.de [Expires Sep 23 09:21]
   --End of list--
hot@sisyphus 2 > exit
logout
Connection to sisyphus.hrz closed.
kirke: Transferred: stdin 13, stdout 546, stderr 36 bytes in 8.2 seconds
kirke: Bytes per second: stdin 1.6, stdout 66.5, stderr 4.4
kirke: Exit status 0

Anmerkung: Die im Beispiel gezeigte und bereits vor der Authentifizierung des Klienten erfolgte Weiterleitung des AFS-Tokens (die betreffenden Teile sind oben rot und kursiv geschrieben) ist nur dann möglich, wenn sowohl in den SSH-Klienten als auch in den SSH-Server die von Dug Song bereitgestellten Patches zur Unterstützung von AFS und Kerberos v4 integriert wurden.

Die oben blau gefärbten Ausschriften dokumentieren die zur Authentifizierung des Klienten unternommenen Schritte. Wir erkennen, daß vom Klienten weder eine Rhosts- noch eine Rhosts-RSA-Authentifizierung versucht, sondern sofort mit der von uns gewünschten reinen RSA-Authentifizierung begonnen wurde. Dies kann an entsprechenden Einträgen in den Konfigurationsdateien sowie im Falle der Rhosts-RSA-Authentifizierung auch daran liegen, daß beim Klienten kein Host-Key zur Verfügung steht.

Die reine RSA-Authentifizierung verläuft erwartungsgemäß erfolgreich. Da kein SSH-Agent verwendet wird und der Private Key des Klienten durch eine Passphrase geschützt ist, muß diese eingegeben werden, um die Challenge des Servers mit einer korrekten Response beantworten zu können.

Mit Hilfe des SSH-Agenten kann man den oben dargestellten Ablauf beim Login komfortabler gestalten. Sofern der SSH-Klient Zugriff auf einen Agenten hat, probiert er im Rahmen der reinen RSA-Authentifizierung zuerst alle im Agenten gespeicherten privaten RSA-Schlüssel, wozu er keine Passphrase benötigt. Erst wenn mit diesen Schlüsseln kein Login gelingt, wird wie oben auf eine Schlüsseldatei zurückgegriffen. Indem man also vorab alle relevanten Schlüsselpaare (meist handelt es sich nur um genau eines) unter Angabe der jeweiligen Passphrase in den Agenten lädt, kann man sich spätere wiederholte Eingaben einer Passphrase ersparen.

Der SSH-Agent kann auf zwei unterschiedliche Arten gestartet werden:

  1. mit einem Kommando als Argument oder
  2. ohne Angabe eines Kommandos.

Im ersten Fall wird das angegebene Kommando in einem Kind-Prozeß des Agenten ausgeführt, so daß es selbst sowie alle seine Kinder die Verbindung zum Agenten erben. Sehr häufig wird als Kommando eine Shell angegeben, wie das folgende Beispiel zeigt:

  ssh-agent tcsh
Die Kommunikation mit dem Agenten erfolgt in den neueren SSH-Versionen über einen dem Eigentümer des Agenten-Prozesses gehörenden Unix-Domain-Socket, dessen Namen die Kind-Prozesse über eine vom Agenten erzeugte Umgebungsvariable erfahren. Ab SSH 1.2.22 heißt sie SSH_AUTH_SOCK und kann z.B. folgendermaßen aussehen: Frühere SSH-Versionen verwendeten die Variable SSH_AUTHENTICATION_SOCKET.

Im zweiten Fall, der erst in neueren SSH-Versionen zur Verfügung steht, wird der Agent als Hintergrundprozeß gestartet. Um mit ihm kommunizieren zu können, benötigt man natürlich wieder den Namen des Sockets, der in der bereits erwähnten Umgebungsvariablen abzulegen ist. Dies erreicht man sehr einfach dadurch, daß man den Agenten mittels des Shell-Kommandos

  eval `ssh-agent`

startet, das sofort die vom Agenten auf die Standardausgabe ausgegebenen Kommandos ausführt, die eine korrekte Einstellung der Umgebung vornehmen. Hier ein Beispiel für die vom Agenten generierten Kommandos bei Verwendung der tcsh:

  setenv SSH_AUTH_SOCK /tmp/ssh-hot/agent-socket-10781;
  setenv SSH_AGENT_PID 10782;
  echo Agent pid 10782;
Wirklich benötigt wird nur die erste Zeile. Die restlichen zwei dienen der Information des Nutzers über die Prozeßnummer des Agenten, die z.B. dann von Interesse sein kann, wenn man den Agenten später wieder beenden möchte.

Im Normalfall erkennt der Agent an Hand der Umgebungsvariablen SHELL automatisch, welche Art von Kommandos (Bourne- oder C-Shell) für die vom Nutzer verwendete Shell benötigt werden, um die Umgebung korrekt einzustellen. Man kann diese Entscheidung durch eine Option auf der Kommandozeile auch selbst treffen:

ssh-agent -c wählt Kommandos im Stil der C-Shell
ssh-agent -s wählt Kommandos im Stil der Bourne-Shell

Sobald ein Agent verfügbar ist, kann man mit

  ssh-add
das in der Datei $HOME/.ssh/identity gespeicherte RSA-Schlüsselpaar in den Agenten laden. Der Ablauf sieht in etwa so aus:
hot@kirke 62 > ssh-add
Need passphrase for /home/hot/.ssh/identity (hot@kirke).
Enter passphrase: 
Identity added: /home/hot/.ssh/identity (hot@kirke)
Falls andere Schlüsseldateien verwendet werden sollen, so sind deren Namen als Argumente von ssh-add anzugeben.

Mit ssh -l kann man sich die öffentlichen Schlüssel der im Agenten registrierten RSA-Schlüsselpaare anzeigen lassen:

hot@kirke 63 > ssh-add -l
1024 37 16859638557607674292986699368320095767875909797393325534467993118889
8248355555842589544029851114499535066615194649319583696257760306546230720850
5511775977979037973020626780660559112158077971574041530476930932301911603728
8384562010283474570023156169635886609631715470531463357831759704636209077472
3735493413371 hot@kirke

Sofern man nachfolgend das oben gezeigte Login auf sysiphus.hrz wiederholt, nimmt der Anmeldedialog nach der Entgegennahme des AFS-Tokens folgende Gestalt an:

...
kirke: Remote: AFS token accepted (afs@tu-chemnitz.de, AFS ID 4324@tu-chemnitz.de)
kirke: Connection to authentication agent opened.
kirke: Trying RSA authentication via agent with 'hot@kirke'
kirke: Received RSA challenge from server.
kirke: Sending response to RSA challenge.
kirke: Remote: RSA authentication accepted.
kirke: RSA authentication accepted by server.
kirke: Requesting pty.
...

Die beiden folgenden Tabellen fassen die typischerweise an der Authentifizierung beteiligten Dateien zusammen:

Hinweis:

Bis auf $HOME/.ssh/authorized_keys und ggf. $HOME/.ssh/identity.pub sollten die Dateien des Verzeichnisses $HOME/.ssh im Normalfall lediglich für ihren Eigentümer lesbar sein. Nutzer, deren Homeverzeichnis im AFS liegt, müssen beachten, daß sich die AFS-ACLs immer auf Verzeichnisse und nie auf einzelne Dateien beziehen. Wie in Punkt 2.11 des AFS-FAQs von Thomas Müller beschrieben, kann man mittels symbolischer Links die Zugriffsrechte aber auch pro Datei definieren.

Konkret empfiehlt es sich, das Verzeichnis $HOME/.ssh/ für jedermann lesbar zu machen (system:anyuser hat die Rechte rl), dort aber nur die öffentlich zugänglichen Dateien sowie symbolische Links auf die privaten Dateien abzulegen. Die privaten Dateien selbst werden dann in einem anderen, nur für den Eigentümer lesbaren Verzeichnis untergebracht.


Anmerkungen zur Sicherheit

Generell empfiehlt es sich im Bereich der Sicherheit, keine zu alten Werkzeuge zu verwenden, da in der Regel in den neueren Versionen Fehler der Vorgänger beseitigt und mitunter sehr nützliche zusätzliche Funktionen angeboten werden. Natürlich können auch neue Fehler hinzukommen.

SSH-Versionen unterhalb 1.2.13 sollten keinesfalls mehr verwendet werden, da sie eine ernste Sicherheitslücke enthielten, die das Stehlen des privaten Host-Keys ermöglichte.

Auf einigen Plattformen (z.B. SunOS 4.1.x) besteht bis Release 1.2.14 für normale Nutzer eine sehr einfache Möglichkeit, auf private RSA-Schlüssel anderer Nutzer zuzugreifen, sofern diese einen SSH-Agenten zur Schlüsselverwaltung verwenden und die Verbindung zum Agenten weiterleiten lassen. Dieses konkrete Problem wurde in Release 1.2.16 behoben.

Dennoch ist auch bei 1.2.16 Vorsicht bezüglich der Verwendung des SSH-Agenten geboten, da durch Ausnutzung von Race Conditions immer noch Angriffsmöglichkeiten bestehen, wenngleich der Angriff nicht ganz einfach zu realisieren sein dürfte.

Hauptanliegen von Version 1.2.17 war die Behebung der Sicherheitsprobleme im Zusammenhang mit dem SSH-Agenten. Dazu wurde ein neues Protokoll zur Kommunikation mit dem Agenten eingeführt. Das alte und das neue Protokoll sind inkompatibel. Daraus resultiert z.B. die Meldung

  Warning: Denied agent forwarding because the other end has too old version.

Dieser Hinweis sollte nicht mißverstanden werden. Wer keinen Agenten nutzt, ist von keinerlei Einschränkungen betroffen. Die anderen Funktionen der SSH bleiben unabhängig vom Agenten voll erhalten. Sobald sowohl Klient als auch Server mindestens die Version 1.2.17 haben, kann der Agent wieder in vollem Umfang genutzt werden.

Von der Verwendung der Releases 1.2.18 und 1.2.19 ist eher abzuraten, da innerhalb kurzer Zeit relativ viele Änderungen vorgenommen wurden, weil verschiedene Probleme entdeckt worden sind. Außerdem existieren für diese Versionen keine AFS-Patches. Mit der Version 1.2.20 scheint sich die Situation wieder deutlich stabilisiert zu haben.

Wird der SSH-Klient als Setuid-Root-Programm (Programm, das mit Root-Rechten ausgeführt wird) betrieben, so besteht bis einschließlich Version 1.2.21 eine relativ leichte Möglichkeit, Zugang zu fremden SSH-Agenten zu erlangen und so die dort gespeicherten Schlüssel im Rahmen von Authentifizierungsdialogen zu mißbrauchen. Dieses Problem wurde im Advisory SNI-23: SSH - Vulnerability in ssh-agent beschrieben. Einen Zugriff auf den Agenten mittels ssh-add gestattet diese Attacke dagegen nicht, so daß der Angreifer z.B. keine Schlüssel auslesen kann.

Das intern verwendete Binärprotokoll der SSH 1.x nutzt zur Sicherung der Integrität der zwischen Server und Klient ausgetauschten Pakete den (in der Regel verschlüsselt übertragenen) CRC-32, der ein kryptographisch schwaches Verfahren darstellt. Wie von Ariel Futoransky und Emiliano Kargieman (CORE SDI S.A., Buenos Aires, Argentinien) gezeigt wurde, besteht daher für einen Angreifer prinzipiell die Möglichkeit, durch eine sog. Insertion Attack, d.h. durch speziell konstruierte, mit einem korrekten CRC versehene Pakete Daten seiner Wahl unbemerkt in den verschlüsselten SSH-Kanal einzuschleusen und so z.B. beliebige Kommandos auf dem Server auszuführen.

Ein Security Advisory, Informationen zu den kryptographischen Details sowie Patches zur Erkennung derartiger Attacken stehen unter dem URL http://www.core-sdi.com/ssh/ zur Verfügung. Gegen diesen Angriff sind alle SSH-Versionen bis einschließlich 1.2.23 anfällig. Version 1.2.24 steht nicht öffentlich zur Verfügung. Ab Version 1.2.25 wurde zusätzlicher, von den Advisory-Autoren bereitgestellter Code integriert, der gefälschte Pakete erkennen und so die Kommunikationspartner vor der beschriebenen Attacke schützen soll. Nach der Freigabe von SSH 1.2.25 wurde ein weiterer Patch veröffentlicht, der diesen Erkennungs-Code verbessert und den man anwenden sollte, sofern man Version 1.2.25 einsetzt. Ab SSH 1.2.26 ist dieser neue Patch bereits Bestandteil der Standard-Distribution.

Dieser Zusatzcode ist nur als Zwischenlösung zu sehen, da das Problem nicht durch Fehler in der Implementierung, sondern durch eine Schwäche im Design der Version 1.x des SSH-Protokolls bedingt ist. Diese Schwäche wird in der Version 2.x des SSH-Protokolls beseitigt, indem man dort einen kryptographisch starken MAC (Message Authentication Code) verwendet, der auf dem mittlerweile in vielen Systemen favorisierten HMAC-Verfahren (RFC 2104: HMAC: Keyed-Hashing for Message Authentication) beruht.


SSH-Installationen des URZ

  1. Zentrales Dateisystem (/uni/global)

    Auf /uni/global stehen SSH-Installationen für verschiedene UNIX-Plattformen zur Verfügung, die jeweils Klienten, Server und Manuals umfassen:

    SSH-Version AFS-Patchlevel Plattformen
    1.2.21 1 dec5000
    1.2.26 1 sun4, dec3000, risc6000, sgi4000
    1.2.27 1 linux2, i386_linux3, i386_linux22, sun5, sun4x_57, hp1ux10, hp2ux10

    Eine künftige Pflege dieser Installationen konzentriert sich schwerpunktmäßig auf Linux (linux2, i386_linux3, i386_linux22), Solaris (sun5, sun4x_57) und HPUX (hp1ux10, hp2ux10).

    Warnung: Von der Nutzung evtl. noch existierender SSH-Installationen für oben nicht genannte Plattformen (z.B. Linux 1.x) ist auf Grund ihres relativ hohen Alters eher abzuraten.

    Anmerkung: Bei der unter /uni/global bereitgestellten Installation von SSH 1.2.21 wird der im Security Advisory SNI-23 beschriebene Zugriff auf fremde SSH-Agenten (hoffentlich zuverlässig) verhindert, da die das genannte Problem verursachende Datei authfd.c der Quelltext-Distribution der Version 1.2.21 bereits gegen die gleichnamige Datei der im SNI-23 empfohlenen Version 1.2.22 ersetzt wurde.

  2. Windows NT

    Die durch das URZ administrierten Installationen von Windows NT (z.B. auf den öffentlichen Maschinen im PC-Pool) enthalten einen kommerziellen SSH-Klienten von DataFellows. Sein Versions-Identifikator lautet SSH-1.5-W1.0, d.h., er unterstützt die Version 1.5 des SSH-Protokolls. Der Klient ist über die Menüfolge

    Start --> Programme --> URZ Software --> tools --> Telnet --> Ssh.exe
    zu erreichen. Das Installationsverzeichnis heißt u:\tucz\dept\nt\pool_sw\ssh32.

  3. Öffentliche UNIX-Server

    Die öffentlichen UNIX-Server des URZ sind jeweils mit einem lauffähigen SSH-Dämon ausgestattet und somit über SSH erreichbar. Nach Möglichkeit sollten alle Nutzer die Secure Shell zur Arbeit mit entfernten Maschinen verwenden. Die konkrete Version des SSH-Servers ist möglicherweise auf den einzelnen Systemen verschieden.

    An dieser Stelle sei noch einmal auf die weiter oben bereits erwähnte inkompatible Änderung des Protokolls zur Kommunikation mit dem SSH-Agenten hingewiesen, die zu dessen eingeschränkter Verfügbarkeit führen kann.

    Auch wenn sowohl Server als auch Klient mindestens die Version 1.2.17 verwenden, kommt es evtl. unter bestimmten Umständen bei der Nutzung weitergeleiteter Verbindungen zum SSH-Agenten zu einem unangenehmen Nebeneffekt. Beim Schließen einer SSH-Verbindung wird die weitergeleitete Verbindung zum Agenten möglicherweise nicht automatisch geschlossen. Der Anwender erhält dann die folgende Meldung:

      Waiting for forwarded connections to terminate...
      The following connections are open:
        Forwarded agent connection
    

    Dieses Verhalten ist als Bug zu werten. Tritt es auf, dann hilft nur noch das gewaltsame Trennen der Verbindung durch das Beenden des Klienten-Prozesses über ein Signal oder durch die Escape-Sequenz Tilde-Punkt (~.), die allerdings nur unmittelbar nach dem Betätigen der Return-Taste ihre Sonderbedeutung besitzt.

  4. Symmetrische Verschlüsselungsverfahren zum Schutz von SSH-Kanälen

    Die zentral bereitgestellte SSH-Installation unterstützt zum Zweck des kryptographischen Schutzes der SSH-Kanäle die folgenden symmetrischen Verschlüsselungsverfahren:

    Bezeichnung bei SSH Erläuterung
    3des Triple DES mit 192-Bit-Schlüsseln
    blowfish Blowfish mit 256-Bit-Schlüsseln
    none keinerlei Verschlüsselung

    Der Triple DES (3des) ist das Default-Verfahren.

    Warnung: Die Verwendung von none sollte nur in begründeten Ausnahmefällen erfolgen, da der Verzicht auf eine Verschlüsselung zum kompletten Verlust des kryptographischen Schutzes der SSH-Kommunikation führt, d.h., auch die Authentizität und Integrität der Kommunikation sind nicht mehr gewährleistet.

    Das Verfahren IDEA, das bei der SSH vorzugsweise verwendet wird, sofern man es bei der Konfiguration nicht explizit ausschließt, wurde gezielt deaktiviert, um eine Verletzung der Lizenzbedingungen (s. http://www.ascom.ch/infosec/idea/licensing.html) von vornherein auszuschließen.

    Sollte der im Vergleich zu IDEA rechenaufwendigere Triple DES zu spürbaren Geschwindigkeitseinbußen führen, was rein subjektiv auf neuerer Hardware bisher nicht festgestellt werden konnte, so empfiehlt sich die Wahl des freien Algorithmus Blowfish, der für eine Software-Implementierung entwickelt wurde, u.a. mit dem Ziel, schnell und sicher zu sein. Auf jeden Fall ist Blowfish deutlich schneller als DES und IDEA. Bisher gilt er auch als sicher, wenngleich er nicht so intensiv untersucht wurde wie IDEA und vor allem DES.

    Die Verwendung von Blowfish wird durch eine entsprechende Option des SSH-Klienten aktiviert. Hierbei sind verschiedene Angaben möglich:

  5. Unterstützung von AFS und Kerberos v4

    In die SSH-Installation von /uni/global wurden neben kleineren eigenen Modifikationen, die der Anpassung an unsere konkrete Umgebung dienen, vor allem die von Dug Song bereitgestellten Patches zur Unterstützung von AFS und Kerberos v4 integriert, die über die Seite AFS, Kerberos v4 support for SSH [http://www.monkey.org/~dugsong/ssh-afs-kerberos.html] heruntergeladen werden können.

    Hinweis: Die auf /uni/global bereitgestellten Server und Klienten geben ihr jeweiliges AFS-Patchlevel in der Versionsangabe (durch ssh -v ermittelbar) bekannt, z.B. 1.2.27-afs_pl1.

    Mit dem Übergang auf SSH 1.2.22 nutzen die Patches von Dug Song nicht länger die AFS-Bibliotheken von Transarc, sondern erfordern die frei verfügbaren Kerberos4-Bibliotheken der KTH (Kungliga Tekniska Högskolan; Royal Institute of Technology, Stockholm, Sweden), die auch eine AFS-Unterstützung bieten. Bedingt durch die Verwendung der KTH-Bibliotheken wurde bei uns mit SSH 1.2.22 erstmals zusätzlich zum schon länger genutzten AFS-Teil auch die Unterstützung von Kerberos v4 aktiviert.

    Durch die Verwendung der KTH-Bibliotheken ist es nicht mehr notwendig, bei den SSH-Klienten- und Servern zwischen AFS- und Nicht-AFS-Versionen zu unterscheiden. Die Programme testen jetzt selbständig zur Laufzeit mit Hilfe einer KTH-Funktion, ob sie auf einem AFS-Klienten ausgeführt werden. Nur wenn dies der Fall ist, aktivieren sie die AFS-Unterstützung. Damit ist die Software auch problemlos auf Maschinen ohne AFS-Funktionalität einsetzbar.

    Achtung: In reinen AFS-Umgebungen wie unserer muß man der SSH mitteilen, wo sie den Kerberos-Server (konkret den AFS kaserver) findet. Dazu dienen die Dateien /etc/krb.conf und /etc/krb.realms, die in unserer AFS-Zelle folgenden Inhalt haben:

    Hinweis: Dug Song bietet über seine Seite http://www.monkey.org/~dugsong/ssh-afs-kerberos.html ein Shell-Skript an, daß diese beiden Dateien aus CellServDB und ThisCell automatisch generiert.

    Anmerkungen zu Solaris 2.x:

    Für die Solaris-Versionen 2.4, 2.5.1, 2.6 und 7 stehen jeweils getrennte SSH-Generierungen zur Verfügung. Bei Zugriff über /uni/global/bin werden in der Regel automatisch die passenden SSH-Werkzeuge ausgewählt. Bei der Plattform sun5 geschieht dies durch ein Shell-Skript namens wrapper.

    Im Paket-Pfad /uni/global/packages/ssh-1.2.y/bin findet man die SSH-Klienten-Programme für die einzelnen Plattformen in separaten Unterverzeichnissen: SOL_2.4, SOL_2.5.1, SOL_2.6, SOL_7.

    Die Unterscheidung der unter /uni/global/packages/ssh-1.2.y/etc befindlichen SSH-Server erfolgt durch entsprechende Suffixe: sshd.sol_2.4, sshd.sol_2.5.1, sshd.sol_2.6, sshd.sol_7.

    Anmerkungen zu Linux 2.x:

    Für verschiedene Linux-Plattformen stehen getrennte SSH-Installationen zur Verfügung. Die Paketpfade lauten:

    Plattform Paketpfad
    linux2 /afs/tu-chemnitz.de/global/linux2/packages/ssh-1.2.y
    i386_linux3 /afs/tu-chemnitz.de/global/i386_linux3/packages/ssh-1.2.y
    i386_linux22 /afs/tu-chemnitz.de/global/i386_linux22/packages/ssh-1.2.y

    Für den Zugriff auf die Klienten-Programme existieren auf den vom URZ administrierten Linux-Maschinen folgende Pfade:

    Plattform Zugriffspfad
    linux2
    i386_linux22
    /uni/global/bin
    i386_linux3 /uni/global3/bin

    Bei den SSH-Klienten-Werkzeugen ist meist keine exakte Unterscheidung der Linux-Plattform erforderlich, da viele Systeme auch die Programme anderer Plattformen ausführen können.

    Achtung: Bei den SSH-Servern ist dagegen die Unterscheidung der Versionen dringend anzuraten, um z.B. die Beschädigung der Log-Dateien utmp und wtmp des Systems zu vermeiden. Die Datensätze dieser Dateien weisen bei verschiedenen Linux-Plattformen möglicherweise eine unterschiedliche Struktur auf, die allerdings nicht automatisch erkannt wird.

    Die Patches von Dug Song sorgen in unserer Installation für das Einrichten einer PAG-Umgebung (Process Authentication Group) auf dem Server (früher nachträglich durch spezielle Scripts des URZ realisiert) sowie eine Übertragung der auf dem Klienten evtl. vorhandenen AFS-Token zum Server (AFS token passing), so daß dort keine wiederholte AFS-Authentifizierung (Kommando klog) nötig ist. Außerdem ermöglichen die Patches ein Login mit dem AFS-/Kerberos-Paßwort anstelle des UNIX-Paßworts. Auf den meisten öffentlichen Rechnern des URZ sind gegenwärtig derart modifizierte Server im Einsatz.

    Das AFS-Token- und Kerberos-TGT-Passing sowie die Möglichkeit des Logins mit dem AFS-Paßwort können durch Optionen in den Konfigurationsdateien des Klienten bzw. Servers gesteuert werden, indem man deren Wert auf yes oder true bzw. no oder false setzt. Die folgenden Tabelle zeigt die bei SSH 1.2.26 und 1.2.27 relevanten Optionen mit ihren Default-Werten (Groß- und Kleinschreibung werden von der Software nicht unterschieden):

    Option Default-Wert Bemerkung
    AFSTokenPassing   yes  
    KerberosTgtPassing   yes   bei SSH 1.2.27 wurde in unserer lokalen Installation der Default-Wert auf no gesetzt
    KerberosOrLocalPasswd   no   nur beim Server
    KerberosAuthentication   yes  
    KerberosTicketCleanup   yes   nur beim Server

    Hinweise:

    Durch Aufruf des Klienten ssh mit der Option -k wird die Weiterleitung von AFS-Token und Kerberos-TGTs unterdrückt.

    Sollen sowohl das AFS- als auch das UNIX-Paßwort zum Login genutzt werden können, ist in /etc/sshd_config die Options-Zeile

      KerberosOrLocalPasswd   yes
    
    zu ergänzen.

    Die ab SSH 1.2.22 verwendete KTH-Bibliothek versucht, unter Verwendung der C-Funktion getservbyname() den zum Dienst kerberos-iv gehörenden Port zu ermitteln. Falls dies nicht gelingt (z.B. weil kein passender Eintrag in /etc/services bzw. der entsprechenden NIS-Map gefunden wurde), so verwendet die Implementierung den Standard-Port 750, worauf sie mit der Meldung

      kerberos-iv/* unknown service, using default port 750
    
    hinweist. Hierbei handelt es sich um keinen Fehler. Die obige, möglicherweise irritierende Mitteilung läßt sich vermeiden, indem man geeignete Service-Einträge ergänzt, z.B. durch den Nachtrag der folgenden Zeilen in der Datei /etc/services:
      kerberos-iv 750/udp     kdc # Kerberos (server) udp
      kerberos-iv 750/tcp     kdc # Kerberos (server) tcp
    

    Ein unter Verwendung der KTH-Bibliothek beschafftes AFS-Token wird möglicherweise auf dem AFS-Klienten mit einer inkorrekten numerischen AFS-ID registriert, da die KTH-Routinen im Gegensatz zum Code von Transarc nicht mit dem AFS Protection Server kommunizieren, um die korrekte AFS-ID zu ermitteln. Statt dessen verwenden sie einfach die UNIX-ID. Da im URZ die UNIX- und AFS-ID jedes Nutzers identisch sind, wird dieser Unterschied in der Regel nicht sichtbar.

    Johan Danielsson, ein Mitglied des KTH-Entwickler-Teams, wies in einer privaten E-Mail darauf hin, daß die AFS-ID lediglich durch das Kommando tokens verwendet wird, intern aber sonst keine Rolle spielt, so daß trotz falscher ID alles normal funktionieren sollte:

    The ID in the token is just a number and isn't used for anything (other than in the listing produced by `tokens'). To get the correct AFS id, you'll have to talk to your protection server; the Transarc code does that, but we don't think the (lots of) extra code is worth it. Instead we use the unix id. Everything should work just fine anyway.

    SSH 1.2.22 führt ein weiteres neues "Feature" ein. Sofern das Home-Verzeichnis eines Nutzers im AFS liegt, versucht SSH, die Xauthority-Informationen lokal zu speichern, um deren Ablauschen zu verhindern. Man sollte beachten, daß die Daten zwischen AFS-Servern und -Klienten im Klartext übertragen werden. Laut Aussagen von Dug Song, dem Autor der AFS-Patches für SSH, ist es deshalb sehr leicht, die Xauthority-Informationen zu stehlen.

    Aus diesem Grund speichert SSH diese Daten entweder im Verzeichnis /ticket (falls dieses existiert) oder unter /tmp, wobei angenommen wird, daß sich diese beiden Verzeichnisse stets auf der lokalen Platte des Servers befinden. Die Administratoren sollten deshalb immer dafür sorgen, daß diese Annahme zutrifft.

    Aus der lokalen Speicherung der Xauthority-Informationen resultieren Meldungen folgender Art, die vom Kommando xauth stammen, aber wiederum keinen Fehler signalisieren:

      /usr/bin/X11/xauth:  creating new authority file /tmp/Xauth4324_9046
    

    Diese Meldung läßt sich durch jeden Nutzer individuell unterdrücken, in dem er beim Aufruf des Kommandos xauth den Standard-Fehlerstrom umlenkt, z.B. nach /dev/null. Dazu ist es notwendig, in der Datei $HOME/.ssh/rc ein geeignetes Shell-Skript abzulegen. Sofern dieses Skript existiert, wird es vom SSH-Dämon anstelle von xauth ausgeführt. Über die Standard-Eingabe übergibt der Dämon an das Skript die für xauth relevanten Informationen proto und cookie.

    Man muß beachten, daß das Skript $HOME/.ssh/rc immer von der Login-Shell des Nutzers (tcsh, bash,  ...) interpretiert wird. Da sich die jeweiligen Shell-Sprachen mehr oder minder deutlich voneinander unterscheiden, empfiehlt es sich in der Regel, $HOME/.ssh/rc lediglich zum Aufruf eines anderen Skripts zu nutzen, das dann die konkret auszuführenden Anweisungen bzw. Kommandos (z.B. xauth) enthält. Auf diese Weise kann man sehr einfach die zu verwendende Shell festlegen.

    Hier nun ein Beispiel:

    Kerberos-Tickets, die entweder analog den AFS-Token vom Klienten auf den Server übertragen oder unter Verwendung des TGTs vom Server neu beschafft werden, verwaltet der SSH-Dämon ebenfalls in einer Datei auf der lokalen Platte des Servers, und zwar wie bei der Xauthority-Informationen entweder unter /ticket (falls dieses Verzeichnis existiert) oder unter /tmp.

    Bei einer regulären Beendigung einer SSH-Verbindung werden die vom Dämon auf der lokalen Platte angelegten Xauthority- und Ticket-Dateien wieder entfernt, sofern die Option KerberosTicketCleanup den Wert yes hat.

    Die Namen der jeweils vom SSH-Dämon angelegten Dateien haben folgenden Aufbau:

    Die vom Dämon gestarteten Programme können die konkret verwendeten Namen der lokalen Xauthority- und Ticket-Dateien über die Umgebungsvariablen KRBTKFILE bzw. XAUTHORITY erfahren.

    Da bis Version 1.2.17 eine andere interne Kodierung für das AFS-Token-Passing verwendet wurde, ist die Übergabe des Tokens an den Server nicht möglich, falls alte und neue Versionen von Klienten und Servern aufeinandertreffen. "Alt" heißt hier bis SSH 1.2.17, "neu" bedeutet ab SSH 1.2.18 bzw. praktisch ab SSH 1.2.20, da es für SSH 1.2.18 und 1.2.19 keine AFS-Patches gab.

    Um die Interoperabilität dennoch zu gewährleisten, enthielten die auf /uni/global bereitgestellten SSH-Klienten bis zur Version 1.2.26 eine spezielle lokale Modifikation, die ein AFS-Token-Passing auch bei der Nutzung eines Servers der Version 1.2.17 oder älter gestattet. Ab SSH 1.2.27 ist diese Modifikation nicht mehr enthalten.

  6. Weitere lokale Modifikationen

    Die unter /uni/global bereitgestellten SSH-Server wurden außerdem lokal so modifiziert, daß sie an Stelle der Host-Namen die IP-Adressen der Klienten-Maschinen in die Accounting-Dateien des Systems (utmp, utmpx, wtmp, wtmpx, lastlog) eintragen.

    Des weiteren wurde der SSH-Server derart erweitert, daß er in der Lage ist, die ggf. existierende Datei /etc/login.access auszuwerten. Dieses Konzept wird auch in dem auf /uni/global angebotenen und auf vielen öffentlichen URZ-Maschinen eingesetzten tuclogin genutzt. Es stammt aus dem Paket logdaemon von Wietse Venema und realisiert nach den Worten des Autors eine einfache, aber effektive Form der Zugangskontrolle beim Login, die auf Nutzerkennzeichen, Host-Namen und IP-Adressen beruhen kann.

    Die konkret im SSH-Server verwendete Implementierung wurde der Release 5.6 des Logdaemon-Pakets entnommen. SSH verwehrt das Login mit der Meldung "Permission denied", falls weder unter Verwendung des kanonischen Hostnamens noch der IP-Adresse ein Login durch die in /etc/login.access enthaltenen Regeln gestattet wird. Sofern /etc/login.access nicht existiert, gelten von dieser Seite her keinerlei Einschränkungen für die Logins, d.h., der in der lokalen Installation ergänzte Code zur Auswertung der Zugangsregeln bleibt wirkungslos.


Installation aus den Quellen

Die Installation auf UNIX-Systemen ist weitestgehend automatisiert, da ein configure-Script zur Verfügung steht. Detaillierte Informationen sind im File INSTALL der Distribution zu finden.

Meist genügt eine in etwa wie folgt aussehende Kommandofolge:

  1. ./configure
  2. make
  3. make install (als Superuser)
  4. /usr/local/sbin/sshd

Speziell auf relativ langsamen Maschinen empfiehlt es sich, den sshd beim Starten des Betriebssystems zu aktivieren, z.B. durch Eintragen von

  if [ -x /usr/local/sbin/sshd ]; then
     /usr/local/sbin/sshd && echo sshd
  fi
in eine geeignete rc-Datei. Dadurch werden unangenehme Verzögerungen beim Aufbau jeder SSH-Verbindung vermieden, die daraus resultieren, daß die beim Start des Dämons durchgeführte Generierung der RSA-Server-Keys verhältnismäßig zeitaufwendig ist. Der einmal gestartete Dämon behandelt alle nachfolgend eintreffenden Verbindungswünsche der Klienten.

Auf relativ schnellen Computern fällt dagegen die für die RSA-Schlüssel-Erzeugung benötigte Zeit nicht ins Gewicht. Es ist deshalb ohne weiteres möglich, unter Verwendung des inetd oder eines äquivalenten Mechanismus für jeden eintreffenden Verbindungswunsch einen neuen Dämon zu starten. Bei Nutzung des inetd muß der SSH-Server mit der Option -i gestartet werden, so wie dies in der folgenden Beispiel-Zeile der Datei /etc/inetd.conf gezeigt wird:

  ssh stream  tcp nowait  root    /usr/sbin/tcpd  /usr/local/sbin/sshd -i


Installation der Dateien von /uni/global

In der Regel dürfte es genügen, den für die gewünschte Plattform geeigneten Dämon sshd und einige zugehörige Dateien lokal zu installieren. Die restlichen Kommandos können direkt von /uni/global genutzt werden.

Sofern ssh den privaten Host-Key der Klienten-Maschine lesen und privilegierte TCP-Ports (unterhalb 1024) verwenden können soll, muß dieses Programm dem Superuser root gehören und das Setuid-Bit gesetzt bekommen. Aus Sicherheitsgründen sollte man allerdings nach Möglichkeit auf das Setuid-Bit verzichten, da Programme, die Root-Rechte haben, die Integrität des gesamten Systems gefährden können.

Im Paketpfad /uni/global/packages/ssh-1.2.y/etc finden sich folgende SSH-Dateien:

ssh_config Beispiel-Konfiguration für den SSH-Klienten (global oder lokal verwendbar)
ssh_host_key Platzhalter für den RSA-Host-Key (Schlüsselpaar)
ssh_host_key.pub Platzhalter für den im externen Format abgelegten öffentlichen Schlüssel des Hosts
sshd_config Beispiel-Konfiguration für den SSH-Dämon
config.sample Beispiel für eine nutzerbezogene Konfigurationsdatei
sshd SSH-Dämon, der sowohl auf AFS-Klienten-Maschinen als auch auf Rechnern ohne AFS-Funktionalität lauffähig ist; Dämonen für verschiedene Plattformen werden z.T. durch Suffixe unterschieden, z.B. sshd.sol_2.5.1 und sshd.sol_2.6

Anmerkungen:

Mit Ausnahme von config.sample sind die o.g. Dateien auch über /uni/global/etc erreichbar.

Beachten Sie bitte die obigen Anmerkungen zur Unterscheidung der verschiedenen SSH-Versionen bei Linux 2.x und Solaris 2.x .

Die Files ssh_host_key und ssh_host_key.pub sind für jede Maschine neu mit Hilfe des Kommandos ssh-keygen zu generieren. Die unter /uni/global/etc angebotenen Dateien sind daher nicht verwendbar. Um Fehlern vorzubeugen, handelt es sich bei ihnen auch nur um Textdateien, die den Zweck und die Handhabung der lokalen Entsprechungen angeben.

Vorgeschlagene Installationsschritte:

  1. Kopieren des Dämons (z.B. /uni/global/etc/sshd) in ein lokales Verzeichnis und Setzen geeigneter Zugriffs-Rechte

    Beispiel:

    Der Dämon trägt bewußt nicht das Setuid-Bit. Er sollte immer direkt von root gestartet werden.

  2. Kopieren der Konfigurationsdateien ssh_config und sshd_config nach /etc

    Diese Dateien sind bei Bedarf vom Administrator an die lokalen Gegebenheiten anzupassen. Die in den Beispielen getroffenen Voreinstellungen zielen auf ein hohes Sicherheitsniveau ab.

    Die Datei ssh_config kann einem Anwender neben config.sample als Vorlage zur Erstellung privater Konfigurationsdateien für den Klienten dienen.

  3. zentrale Bereitstellung der öffentlichen Host-Keys häufig benötigter Maschinen in der Datei /etc/ssh_known_hosts

    Hinweis: Die öffentlichen Host-Keys der öffentlichen Maschinen des URZ können der Datei /uni/global/text/ssh_known_hosts entnommen werden.

    Sollen außer den dort abgelegten Schlüsseln keine weiteren zur Verfügung gestellt werden, so empfiehlt sich ein symbolischer Link:

        ln -s /uni/global/text/ssh_known_hosts /etc/ssh_known_hosts

  4. Erzeugen des Host-Keys mittels /uni/global/bin/ssh-keygen:

        /uni/global/bin/ssh-keygen -b 1024 -f /etc/ssh_host_key -N ''

    Dieses Kommando erzeugt die Dateien /etc/ssh_host_key und /etc/ssh_host_key.pub

    Achtung: Die erzeugte Datei /etc/ssh_host_key darf lediglich für root lesbar sein, da sie den unverschlüsselten privaten Schlüssel des Hosts enthält!

  5. Starten des Dämons

    Der Dämon kann jederzeit von der Kommandozeile aus gestartet werden, z.B. durch folgende Eingabe:

        /usr/local/sbin/sshd

    Nach dem Start legt der Dämon automatisch die Dateien /etc/sshd.pid und /etc/ssh_random_seed an (diese Namen stellen die Default-Werte dar und können bei Bedarf über die Konfigurationsdatei verändert werden).

    Für den Routine-Betrieb einer Maschine ist es natürlich generell ratsam, den sshd wie oben beschrieben automatisch zu starten: entweder beim Booten des Betriebssystems oder über den inetd bzw. analoge Mechanismen.


Absicherung verschiedener Dienste durch SSH

SSH kann generell zum Aufbau gesicherter Netzverbindungen (auch im Rahmen eigener Entwicklungen) verwendet werden. Tatu Ylönen orientiert aus Sicherheitsgründen bewußt nicht auf eine Programmier-Schnittstelle (API), sondern darauf, den unveränderten SSH-Klienten als Sub-Prozeß zu starten und mit ihm über Pipes zu kommunizieren.

Mögliche Anwendungen:

Ein Beispiel soll das illustrieren. Mit Hilfe der SSH läßt sich die Klartext-Übertragung der Paßwörter bei FTP verhindern. Durch die integrierte Weiterleitung von TCP-Ports ist es relativ einfach möglich, die Steuerverbindung von FTP kryptographisch zu sichern. Dadurch werden automatisch auch Nutzerkennzeichen und Paßwörter transparent verschlüsselt.

Die für jede Übertragung neu aufgebauten FTP-Datenverbindungen können dagegen mit der Port-Weiterleitung der von Tatu Ylönen stammenden SSH-Implementierung in der Regel nicht oder nur mit einem sehr hohen Aufwand geschützt werden. Sofern der FTP-Server fordert, daß die klientenseitigen IP-Adressen zusammengehöriger Daten- und Steuerverbindungen identisch sein müssen, ist selbst der Aufbau ungeschützter FTP-Datenverbindungen problematisch bzw. de facto unmöglich, da die Steuerverbindungen zum FTP-Server vom SSH-Server initiiert werden, die Datenverbindungen aber zwischen dem FTP-Klienten und dem FTP-Server aufgebaut werden müßten.

Hinweis: Die weiter unten erwähnte SSH-Implementierung MindTerm bietet ein spezielles FTP-Plugin, so daß dort die oben genannten Beschränkungen für den Schutz von FTP-Verbindungen nicht existieren.

Um vom Rechner client aus eine gesicherte FTP-Verbindung zum Rechner ftp-serv aufzubauen, empfiehlt sich folgendes Vorgehen:

  1. Aufbau einer SSH-Verbindung zum FTP-Server ftp-serv mit Weiterleitung eines freien Ports (z.B. 2345) zum well-known Port von FTP (21):
    ssh -L 2345:ftp-serv:21 ftp-serv
    Ab SSH 1.2.23 ist es notwendig, die Option gatewayports auf yes zu setzen, da sonst nur Verbindungen mit der Zieladresse 127.0.0.1 (Adresse des Loopback-Geräts; meist localhost genannt) weitergeleitet werden. Das Setzen dieser Option kann z.B. über die Datei $HOME/.ssh/config oder durch Angabe von -g auf der Kommandozeile erfolgen:
    ssh -g -L 2345:ftp-serv:21 ftp-serv
  2. Nutzung des weitergeleiteten Ports auf dem Rechner client:
    ftp client 2345
    Hinweis: Falls statt client die Adresse localhost angegeben wird, kann mit hoher Wahrscheinlichkeit keine Datenverbindung aufgebaut werden. Damit scheitert auch ein Auflisten von Datei-Verzeichnissen.

Ein weitergeleiteter Port ist von allen Klienten nutzbar. Bezogen auf das FTP-Beispiel bedeutet das, daß sich beliebige Klienten an den Port 2345 des Rechners client wenden können, wodurch sie den FTP-Server auf Rechner ftp-serv erreichen.

Die konkrete Vorgehensweise bei der Absicherung anderer TCP-basierter Dienste unter Nutzung der Port-Weiterleitung ist jeweils von den verwendeten Klienten abhängig.


Weitere Informationsquellen


Holger Trapp

12. November 1999