[jboss-user] [Security & JAAS/JBoss] - Re: SSO on JBOSS with Kerberos
noFreak
do-not-reply at jboss.com
Fri Sep 5 06:22:52 EDT 2008
ok, is there even a way to sent a pm :)?...
Dann kopiere ich das wesentliche mal hier rein, sorry für die formatierung, allerdings ist mir das jetzt zu viel arbeit, das alles ordentlcih aussehen zu lassen :)
Single Sign-On Umsetzung mit Kerberos
Nachdem wir alle benÃÂötigten Technologien kennen gelernt haben, werden wir uns in diesem Kapitel der Umsetzung einer SSO Komponente in Java mithilfe von Kerberos widmen. Da die Konkrete Implementierung in einem Beispielprojekt im Anhang vorhanden ist, mÃÂöchten wir hier lediglich auf die Umzusetzende FunktionalitÃÂät und der Zuordnung zu den verschiedenen Technologien eingehen. Dabei soll klar werden, wie die Technologien miteinander agieren und in welcher Reihenfolge dies geschieht.
ZunÃÂächst sollten wir uns noch einmal die Vorgehensweise der Authentifizierung wie zu Beginn beschrieben genauer anschauen. Dabei unterteilen wir die Schritte in Client und Serverseitige Aufgaben.
Client:
1.Der Benutzer meldet sich an seinem Betriebssystem mit einem DomÃÂänenkonto an. Dabei wird mithilfe von Kerberos ein sicherer Kontext auf dem Client des Benutzers hergestellt. Bei diesem Schritt werden zwischen dem Betriebssystem und dem AS von Kerberos die beiden Nachrichten Authentication Server Request und Authentication Server Reply ausgetauscht. Innerhalb eines sicheren Bereichs des Arbeitsspeichers wird das TGT gespeichert. SchlÃÂüsselkomponente : Kerberos
2.Die Anmeldung an dem Betriebssystem ist vollstÃÂändig.
3.Der ORGA Benutzer startet auf diesem Client eine auf ORGA basierende Anwendung. Das TGT wird aus dem Arbeitsspeichers ausgelesen. Das LoginModule Krb5LoginModule von JAAS ÃÂübernimmt diesen Schritt.
4.Das ORGA Modul fordert mit dem TGT ein Service Ticket fÃÂür den Dienst, welcher AusgefÃÂührt werden soll. Dieses Service Ticket kann ausschlieÃÂÃÂlich fÃÂür diesen Dienst genutzt werden. Das senden des TGT wird durch Kerberos innerhalb der Nachricht Ticket Granting Server Request abgebildet und mit dem Java GSS-API transparent implementiert. SchlÃÂüsselkomponenten: Kerberos und Java GSS-API
5.Der angeforderte SchlÃÂüssel wird dem Client ausgeliefert. Das ausliefern wird durch die Kerberos Nachricht Ticket Granting Server Reply durchgefÃÂührt wobei das Empfangen auf der Seite des Clients mithilfe von Java GSS-API abstrakt implementiert wird. SchlÃÂüsselkomponenten: Kerberos und Java GSS-API
6.Das Service Ticket wird Base64 kodiert und mithilfe von JBoss FunktionalitÃÂäten an diesen gesendet. Dieser Schritt entspricht dem Application Request in der Kerberos Authentifizierung, wird allerdings nicht von Kerberos oder dem Java GSS-API durchgefÃÂührt. SchlÃÂüsselkomponente: JBoss
Server:
7.Der JBoss empfÃÂängt das Service Ticket und decodiert es. Danach wird transparent durch Java GSS-API geprÃÂüft ob es von einem sicheren Client ist und ob er den angeforderten Dienst ausfÃÂühren darf. SchlÃÂüsselkomponente: Java GSS-API und Kerberos
Um diese FunktionalitÃÂäten Umzusetzen implementieren wir zwei LoginModule. Eines Clientseitig fÃÂür die Schritte 3 bis 6 und eines Serverseitig fÃÂür den Schritt 7. Lesen Sie sich zum besseren VerstÃÂändnis der Vorgehensweise am besten die jeweiligen Codeabschnitte im Projekt mgs-orga-security durch.
Clientseitige Umsetzung:
Das Clientseitige LoginModule benennen wir mit KerberosClientLoginModule. Es setzt sich folgendermaÃÂÃÂen zusammen:
Es hat als member das Krb5LoginModule um das TGT anfordern zu kÃÂönnen.
initialize(...):
Diese Methode sorgt fÃÂür die Initialisierung des Login Modules. Die Werte der Optionen krbRealm, kdcAddress und serviceName werden ausgelesen, Membervariablen der Klasse zugewiesen und teilweise als Systemeigenschaft gesetzt. Dies ist nÃÂötig, damit spÃÂäter die Java GSS-API darauf zugreifen kann. AuÃÂÃÂerdem wird ein neues Krb5LoginModule instantiiert und ebenfalls dessen initialize Methode aufgerufen.
abort():
Hier setzen wir alle Membervariablen auf null. AuÃÂÃÂerdem rufen wir die abort() Methode des Krb5LoginModule auf.
commit():
Da wie spÃÂäter in Abschnitt der Methode login() bereits alle nÃÂötigen Informationen gespeichert wurden, ist hier nichts mehr zu tun.
logout():
Wie bei der Methode abort() setzen wir alle Membervariablen auf null und rufen die logout Methode des Krb5LoginModule auf.
login():
Die Aufwendigste aller Methoden.
ZunÃÂächst wird versucht ein Login mithilfe des Krb5LoginModule durchzufÃÂühren. Dabei wird das TGT aus dem Betriebssystem ausgelesen. Ist dies nicht erfolgreich, wird je nach Konfiguration des LoginModule's mÃÂöglicherweise das Passwort und der Benutzername vom Benutzer erfragt und versucht anhand deren ein TGT vom KDC zu beziehen. Ist der Loginvorgang des Krb5LoginModule erfolgreich werden mit der Methode commit die Credentials (also auch das TGT) und die Principals in das bei der Initialisierung ÃÂübergebene Subject geschrieben. Dies bereitet uns die Grundlage um ein Service Ticket zu erhalten.
Im nÃÂächsten Schritt wird eine PrivilegedAction im Namen des Subjects ausgefÃÂührt. Dabei wird wie im Kapitel 3.6 Java Generic Security Service API (Java GSS-API) beschrieben zuerst anhand des TGT's das Service Ticket vom KDC angefordert. Wurde dieses zurÃÂückgeliefert wird es Base64 codiert und zur ÃÂÃÂbertragung an den JBoss beim einem Aufruf einer EJB aufbereitet.
Wird dabei keine Rezeption geworfen und wird beim Anfordern des Service Tickets ein sicherer Kontext erstellte, so kann man davon ausgehen, dass der Benutzer am JBoss authentifiziert werden kann. Der Clientseitige Vorgang ist damit abgeschlossen.
Achtung!: Eine Authentifizierung des Clients am Server ist noch nicht sichergestellt. Der JBoss kann immer noch die IdentitÃÂät des Subjects ablehnen! Dies kann bisher nicht festgestellt werden, da die Serverseitige Authentifizierung erst bei Aufruf einer EJB vonstatten geht.
Serverseitige Umsetzung:
Wie wir bereits im Kapitel 3.4.3.1 Unterschied zum Standard JAAS LoginModule gelernt haben, mÃÂüssen wir hier anders wie bei einem normalen LoginModule von der Abstrakten Klasse AbstractServerLoginModule erben und somit auch andere Methoden implementieren. Unserer Klasse nennen wir KerberosJBossLoginModule. Da wir fÃÂür den vom Server bereitgestellten Service ebenfalls ein TGT benÃÂötigen, verwenden wir hier wie beim Clientseitigen LoginModule ebenfalls das Krb5LoginModule als Member unserer Klasse.
initialize(...):
Wie beim Client benÃÂötigen wir ebenfalls die Optionen krbRealm und kdcAddress. Diese werden wieder als Systemeigenschaft gesetzt, damit die Java GSS-API sie verwenden kann. AuÃÂÃÂerdem haben wir noch die Optionen name und password, mit deren Werte wir spÃÂäter das TGT fÃÂür den Dienst erhalten kÃÂönnen.
Weiterhin initialisieren wir das Krb5LoginModule, allerdings mit einem selbst geschriebenem CallbackHandler welcher das eben genannte Passwort und den Name als Konstruktorparameter hat. Dieser CallbackHandler wird spÃÂäter dem Krb5LoginModule die nÃÂötigen Daten (Passwort und Name) liefern, welche zur Anforderung des TGT's nÃÂötig sind. Eine weitere AuffÃÂälligkeit ist, dass wir hier dem Krb5LoginModule nicht das zur Initialisierung ÃÂübergebene sondern ein selbst erstelltes subject bei der Initialisierung ÃÂübergeben. Dies ist daran zu BegrÃÂünden, dass das ÃÂübergebene Subject nach dem Login dazu verwendet wird, den Aufrufenden Benutzer zu identifizieren. Da wir zum Anfordern des TGT's aber auch ein Subject benÃÂötigen, verwenden wir hier eines, welchen den Server reprÃÂäsentiert.
getIdentity():
Mit dieser Methode fragt der Server nach der IdentitÃÂät des Aufrufenden Subjects. Wir geben als ein Principal des Subjects zurÃÂück.
getRoleSets():
Da dieses LoginModule ausschlieÃÂÃÂlich zur Authentifizierung des Benutzers dienen soll, ÃÂübergeben wir hier lediglich ein Objekt, welches angibt, dass dem Subject bisher keine Rollen zugeteilt wurden.
login():
Als erstes wird ein TGT vom KDC angefordert. Dies wird benÃÂötigt, um das vom Client gesendete Service Ticket zu validieren und die AuthentizitÃÂät des innerhalb des Service Tickets angegebenen aufrufenden Clients zu prÃÂüfen. Da das zustÃÂändige Krb5LoginModule mit dem selbst geschriebenen CallbackHandler initialisiert wurde, werden hierbei die in den Optionen angegebene Werte des Passwortes und Namens herangezogen.
Wenn dieser Vorgang erfolgreich war, wird im Namen des Servers wieder eine PrivilegedAction ausgefÃÂührt. Innerhalb dieser wird das vom Client ÃÂübertragene Service Ticket Base64 decodiert und geprÃÂüft ob es von einem gÃÂültigen Client stammt und ob dieser Authentifiziert werden darf. Wenn dem so ist, wird das Subject zur weiteren Verwendung aufbereitet wesentliche Daten in den sharedState der LoginModule geschrieben. Der Serverseitige Authentifizierungsvorgang ist somit abgeschlossen.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4174537#4174537
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4174537
More information about the jboss-user
mailing list