Kerberos

eine Frage des Vertrauens

von Peter Wächtler 


In den heutigen Netzwerken liegen immer mehr vertrauliche Daten. Diese sind zwar mit Zugriffsbeschränkungen versehen - doch Zweifel bleiben. Gibt sich jeder als der aus, der er wirklich ist? 


 
Kerberos Logo - 3 headed dog
Die Entwicklung von Kerberos begann bereits Mitte der achtziger Jahre am Massachusetts Institute of Technology (MIT) im Rahmen des Projektes Athena. Die ersten Releases waren auf den Bedarf am MIT zugeschnitten. Nichtsdestotrotz erlang Kerberos 4 weite Verbreitung außerhalb des MIT. Um die bestehenden funktionalen Einschränkungen der Version 4 zu beseitigen, wurde 1989 mit der Entwicklung der heute aktuellen Version 5 begonnen. Mit RFC1510 bestehen Bemühungen Kerberos zu einem Internet-Standard zu erheben. Kerberos V5 ist Bestandteil von DCE (Distributed Computing Environment [1]) und soll es bei MS-Windows NT5 werden.

Annahmen und Behauptungen

Was unterscheidet Kerberos von anderen Authentifizierungsmethoden? Kerberos ist ein verteilter Authentifizierungsdienst. Bestandteile bilden die zu verwaltenden Identitäten (principals) also Benutzer bzw. Prozesse, die Applikationsserver sowie der Key Distribution Center (KDC) - zentrale Schaltstelle und dritte vertrauenswürdige Instanz (trusted third party) beim gegenseitigen Identitätsnachweis zwischen Client und Server. Durch die Verschlüsselung der Anmeldeinformationen kann ein Unbefugter nicht einfach Paßwörter ausspähen, wie das z.B. bei "normalem" ftp oder telnet mit einfachen Netzwerk-Sniffern (tcpdump) der Fall ist. Außerdem können sich beide Kommunikationspartner von der Identität des anderen überzeugen. Eine Täuschung ist nicht möglich - weder über IP- noch DNS-Spoofing.

Eine hervorzuhebende Eigenschaft ist die Tatsache, daß sich der Client nur einmal im Netzwerk auszuweisen hat. Bei der erstmaligen Anmeldung fordert der Client ein ticket-granting ticket (TGT) an, das weiteren transparenten Zugriff auf andere Resourcen im Netz ermöglicht ohne erneut ein Paßwort abzufragen. Damit wird auch verhindert, daß der Client den privaten Schlüssel oder das Paßwort zwischenspeichern muß - der würde sonst auch in einem Speicherabzug (core dump) zu finden sein. Außerdem wurde beim Design darauf geachtet, den Aufwand gering zu halten, um bei häufig notwendigen Authentifizierungen keine unzumutbaren Verzögerungen heraufzubeschwören, die bei Diensten wie http auftreten können.

Kerberos setzt die Geheimhaltung der Schlüssel voraus. Der private Schlüssel des Benutzers wird u.a. aus dem Bezeichner und dem Paßwort generiert. Der private Schlüssel eines Applikationsserver ( server key) wird bei der Installation angelegt. Beide werden im KDC gespeichert - dieser sollte deshalb physikalisch gesichert sein. Bei den eingesetzten Desktopbetriebssystemen kann die Geheimhaltung nicht garantiert werden. Ist die Sicherheit des Arbeitsplatzes kompromittiert ( trojanische Pferde , mitlesen der Tastatur bei Eingabe des Paßwortes etc.) kann sich ein Angreifer als jemand anderes ausgeben (impersonation).

no authentication by assertion

Das Netzwerk wird als generell unsicher betrachtet. Netzwerkadressen oder Benutzer-IDs wird kein Glaube geschenkt, obwohl im Protokoll z.B. die IP-Adresse des Clients übermittelt wird. Dies geschieht aber lediglich um zu verhindern, das sich Tickets zu ähnlich sind.

Andere Mechanismen schenken einer IP-Adresse zuviel Glauben. Der tcpd -Wrapper nimmt diese für bare Münze. Aber auch mit einer Unix-UID läßt sich viel Ungewünschtes erreichen. Bestes Negativbeispiel ist rlogin. Der Server rlogind glaubt dem Client die übermittelte UID einfach. Bei häufiger Verwendung von .rhosts -Dateien also schnell den Quelltext nehmen und dem Server kann jede beliebige UID außer die von root untergeschoben werden. Auch ident und pcnfsd sind nicht der Weisheit letzter Schluß.

password guessing

Ohne Zusatzmaßnahmen wie der Verwendung von Smartcards ist Kerberos aber immernoch nicht gegen ein Paßwort-Raten gefeit. Zwar ist dafür eine Pre-Authentication im Protokoll vorgesehen, diese wird aber mit erheblichem Aufwand erkauf. Da die Anforderung eines TGT prinzipiell jeder durchführen kann, steht es der Angreiferin frei ein solches zu erhalten. Nun fängt sie an das Paßwort mit Hilfe von Wortlisten zu erraten. Der Algorithmus mit dem aus dem Paßwort der geheime Schlüssel generiert wird, ist frei zugänglich. Der Anwender sollte also zu "starken" Paßwörtern gezwungen werden: mindestens 6 Zeichen, darunter 1 oder mehrere "Sonderzeichen" und gemischte Groß-/Kleinbuchstaben.

whoami

Wie gelangt der Client an dieses ticket-granting ticket (TGT)? Ganz einfach: er fordert es wie jedes andere Ticket an (1 bzw. 3). Eine Anforderung geschieht im Klartext. Sie enthält den Namen des Clients, den Namen des Dienstes (beim ersten Mal eben TGS) und zusätzlich ein client-generiertes Nonce. Dieses Nonce (übersetzt etwa mit: einzigartiger Fall) ist entweder eine Sequenznummer oder ein Zeitstempel. Der Client erhält daraufhin das gewünschte Ticket (2 bzw. 4). Der verblüffend einfache Trick besteht darin, daß nur der Inhaber des geheimen Schlüssels damit etwas anfangen kann. Die Antwort des KDCs beinhaltet nämlich einen mit diesem Schlüssel chiffrierten Sitzungsschlüssel und das selber gesendete Nonce. Ist der Client im Besitz des richtigen Schlüssels, kann er den Sitzungsschlüssel extrahieren und sich gleichzeitig über die Echtheit des KDC überzeugen: nur dieser ist in der Lage den gesendeten Nonce so zu verschlüsseln. In der Antwort des KDC ist weiterhin das Ticket für den gewünschten Dienst enthalten. Dieses Ticket ist immer mit dem Schlüssel des jeweiligen Dienstes chiffriert - kann also nur von ihm verstanden werden, und vom KDC generiert worden sein. Dieses Ticket beinhaltet wiederum den gleichen Sitzungsschlüssel.

Um den Dienst nutzen zu können, muß der Client einen Authentifizierer erzeugen und zusammen mit dem Ticket an den Server senden. Der Authentifizierer besteht aus dem Namen des Clients, seiner Netzwerkadresse und einem Zeitstempel und muß mit dem Sitzungsschlüssel chiffriert werden. An diesen kann der Client nur herankommen sein, wenn er den richtigen Schlüssel - der aus dem Paßwort abgeleitet ist - kennt.

Der Server erhält Authentifizierer und Ticket in einer weiteren Meldung (5). Er dechiffriert das Ticket mit seinem eigenen Schlüssel und gelangt so ebenfalls an den Sitzungsschlüssel. Er kann den Authentifizierer damit lesen. Fordert der Client eine gegenseitige Authentifizierung, weil er sicher gehen möchte mit dem richtigen Server zu kommunizieren, antwortet der Server mit einem optionalen Paket (6) und sendet den Nonce des Clients chiffriert mit dem Sitzungsschlüssel zurück.
 
Zeichen Bedeutung
c Name des Client (principal)
s Name des Servers (principal)
n Nonce (Zeitstempel oder Sequenznummer)
tgs Ticket-Granting Server
Kx geheimer Schlüssel von "x"
Kc,s  Sitzungsschlüssel für "c" und "s"
{info}Kx "info" verschlüsselt mit Schlüssel Kx 
{Tc,s}Ks verschlüsseltes Ticket für "c" um "s" zu nutzen 

{Tc,s}Ks={ s, c, addr, timestamp, lifetime, K c,s}Ks

{Ac}Kc,s verschlüsselter Authentifizierer für "c" um "s" zu nutzen 

{Ac}Kc,s= { c, addr, timestamp, chksum }Kc,s 

addr die IP Adresse des Clients
login/kinit Client sendet: c, tgs, n 

und erhält von TGS: {Kc,tgs, n}Kc, {Tc,tgs }Ktgs

Rs Anfrage für ein Ticket um "s" zu nutzen: 

s, {Tc,tgs}Ktgs, {Ac}Kc,tgs 

 Tabelle 1: Was ist was?

Das Paßwort selbst wurde dabei nie über das Netzwerk gesendet. Hat der Client das TGT erhalten überschreibt er das Paßwort und den daraus generierten Schlüssel im Speicher - er braucht es für die Gültigkeitsdauer des TGT nicht mehr - in der Regel 10 Stunden.

Ein Ticket ist immer nur für einen Dienst gültig. Es ist mit dem geheimen Schlüssel des Dienstes chiffriert den nur der Dienst und der KDC kennt. Der Client selbst kann dieses Ticket nicht entziffern und leitet es stattdessen nur an den Dienst weiter. Außerdem ist ein Ticket immer nur für eine einstellbare Zeit gültig. Nach Ablauf muß es erneuert werden.

Play it again, Sam

Welche Rolle spielt der Authentifizierer? Ohne ihn wäre eine sogenannte Replay-Attacke möglich. Hierbei würde eine potentielle Angreiferin den Netzwerkverkehr belauschen und könnte den Authentifizierer mitsamt dem Ticket abfangen und dem Server später erneut präsentieren, um Zugriff zu erhalten. Deshalb muß der Authentifizierer mit Hilfe des Sitzungsschlüssels erzeugt werden. Er beinhaltet einen Zeitstempel und eine Checksumme um mögliche Manipulationen zu vermeiden. Der Zeitstempel macht den Authentifizierer für ein einstellbares Zeitfenster gültig - typisch sind etwa 5 Minuten. Für diesen Zeitraum muß sich der Server den bereits benutzten Authentifizierer in einer Liste merken und den Versuch ihn erneut zu nutzen ablehnen. Außerhalb dieses Zeitfensters ist der Authentifizierer eh ungültig, und vom Client muß ein neuer generiert werden.

In [kerblimit.usenix.ps] wurde die Zuverlässigkeit des Authenticators in Frage gestellt. Es wird kritisiert, daß die Uhren einigermaßen synchronisiert sein müßten, um die Gültigkeit eines Authenticators zu prüfen, da ein client-generierter Zeitstempel verwendet wird. Die einfache Lösung: der Server speichert den Authenticator mit seiner lokalen Uhrzeit.

Im Reich der Reiche

Wie sieht der Namensraum in Kerberos aus? Ein globaler Namensraum wird in der Regel hierarchisch unterteilt. Dies geschieht um Namenskollisionen zu vermeiden und besser zu skalieren. Am MIT war man sich von Anfang an darüber im Klaren und unterteilte die Welt in Realms (Reich). Principal-Bezeichner setzen sich aus drei Namensteilen zusammen: primary/instance@REALM .

Ein Benutzername sähe z.B. so aus: peewee@FIDO.DE während ein Dienst den Namen ftp/picklock.fido.de@FIDO.DE tragen würde.

Es ist Konvention die Realms nach der Internet-Domäne in GROßBUCHSTABEN zu benennen. Auch für die Zusammenarbeit zwischen Realms wurde gesorgt. Analog zu Vertrauensstellungen zwischen NT-Domänen (eigentlich ja DCE-Zellen) können Tickets eines Realms in einem anderen Gültigkeit haben, wenn dies die Administratoren so eingerichtet haben.

Bei den bisherigen Ausführungen wurden die Felder der einzelnen Meldungen vereinfacht dargestellt, um das Prinzip deutlicher werden zu lassen. Das Protokoll sieht weitere Felder vor, die ich hier aber nicht alle im einzelnen aufführen werde. Stattdessen folgt eine Liste weiterer "Tickets" mit ihren Eigenschaften und Einsatzgebieten:

· postdated ticket - das Ticket wird erst für eine in der Zukunft liegende Zeit gültig. Anwendungsgebiet sind z.B. cron -Jobs

· renewable ticket - das Ticket kann vor seinem Ablauf erneuert werden. Nötig für lang laufende Jobs (wie Wettervorhersagen ;-), die voraussichtlich länger als die maximale Gültigkeitsdauer der Tickets benötigen (>10 Stunden)

· forwardable ticket - das Ticket kann weitergeleitet werden, um z.B. auf einem entfernten Rechner eine telnet-Sitzung aufzubauen, und von hier aus weitere Dienste in Anspruch zu nehmen. Dabei kann die Kommunikation verschlüsselt werden (Option -x). Dies ist ein Feature von rlogin/rsh/rcp/telnet aus der Kerberos-Distribution.

· proxiable ticket - ähnlich wie forwardable tickets , nur mit der Einschränkung, daß damit keine neuen Tickets zu bekommen sind. Damit können Dienste "im Namen" eines anderen principal benutzt werden - vergleichbar mit einem setuid-Bit.

Normalerweise erhält man bereits beim login ein TGT, da die Kerberos-Version von login verwendet wird. Auf Systmen wo das nicht der Fall ist, erfüllt kinit diesen Zweck. Mit klist können die erhaltenen Tickets eingesehen und das Paßwort mit kpasswd vom Benutzer geändert werden. Am Ende einer Sitzung sollten die Tickets zerstört werden - am besten geschieht das automatisch durch einen Aufruf von kdestroy in .logout, sonst verlieren die Tickets erst mit Ablauf ihrer Lebenszeit ihre Gültigkeit.

Um jemanden Zugriff auf seinen Account zu geben ohne das Paßwort zu verraten, trägt der Urlauber den Principal in .k5login ein. Dies hat folgende Vorteile:

· der Zugriff kann jederzeit wieder rückgängig gemacht werden - durch einfaches entfernen des Eintrages

· obwohl der Benutzer vollen Zuriff auf den Account erhält, erbt er keine Netzwerkrechte

· Kerberos protokolliert auch solcherlei Zugriffe und ermöglicht die Überprüfung, wer zu gegebener Zeit in der Lage war diesen Account zu verwenden.

Typische Anwendung findet dieses Feature um den Zugriff auf root zu regeln: sei es temporär für Service-Personal oder dauerhaft - ohne das Paßwort preisgeben, eingeben oder über das Netzwerk transportieren zu müssen.

Wer darf denn nu´ was?

Nachdem der Server nun weiß wer an seine Türe klopft: läßt er ihn rein oder nicht? Kerberos selbst bietet nur Funktionalität für die Authentifizierung-nicht für die Autorisierung. Im Protokoll sind Felder für Berechtigungsinformationen vorgesehen. Diese werden von Kerberos durchgereicht. Diese authorization-data -Felder werden in DCE und WindowsNT dazu verwendet, um u.a. die Gruppenzugehörigkeit in sogenannten PACs (privilege attribute certifcate ) zu übermitteln. Nach microsoft´scher Strategie inkompatibel zu DCE - wie ja auch deren RPC zwar auf DCE RPC 1.1 basieren aber um Inkompatibilitäten verschmutzt sind (polluted).
 
Glossar
AS/Authentication Server Teil des KDC - führt die Authentifizierung durch und vergibt das erste Ticket - siehe auch TGS
Authenticator ein mit dem Sitzungsschlüssel chiffrierter Nachweis der Identität 
KDC/Key Distribution Center Oberbegriff für AS und TGS
Nonce Ein in der Zeit eindeutiger Bezeichner; entweder eine Sequenznummer oder ein Zeitstempel
TGS/Ticket-Granting Server stellt dem authentifizierten Benutzer (principal) Tickets für Dienste aus. Damit wird vermieden, daß der geheim zu haltende Schlüssel unnötig häufig über das Netzwerk übermittelt und damit ein password-guessing erleichtert wird.
TGT/Ticket-Granting Ticket spezielles Ticket um weitere Tickets für Dienste zu erhalten
Ticket Stellvertreter für den Nachweis der Identität; hat eine bestimmte Gültigkeitsdauer für die Inanspruchnahme eines Dienstes
 
Infos
[1] DCE-Port auf Linux http://www.bu.edu/~jrd/FreeDCE/
[2] Kerberos am MIT http://web.mit.edu/kerberos/www/
[3] Kerberos FAQ http://www.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html 
[4] In README.KRB5-1.0.5 steht, wie man an das "vielleicht" export-beschränkte Kerberos herankommt: 
ftp to ATHENA-DIST.MIT.EDU (18.159.0.42), login anonymous, password your_email 
Change into the directory '/pub/kerberos/dist/980217' 
[NOTE: you can't cd to this directory in steps, you must do it in one 
command: cd /pub/kerberos/dist/980217] 
-rw-r--r-- 1 root dist 218922 Feb 6 22:55 krb5-1.0.5.crypto.tar.gz 
-rw-r--r-- 1 root dist 1131234 Feb 6 22:57 krb5-1.0.5.doc.tar.gz 
-rw-r--r-- 1 root dist 4610831 Feb 6 22:55 krb5-1.0.5.src.tar.gz 
 
Der Autor 
Peter Wächtler ist freiberuflicher DV-Anwendungsentwickler und Netzwerk-Ingenieur. Der erste Kontakt mit Linux fand vor knapp 5 Jahren statt.