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#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...