Generierung von SPNEGO-Tokens für abgehende JAX-WS-Anforderungen
Die Klasse com.ibm.wsspi.security.auth.krb5. SpnegoTokenHelper kann für die programmgesteuerte Erstellung eines SPNEGO-Tokens verwendet werden.
- Ein unter Verwendung systemeigener Windows-Berechtigungsnachweise angefordertes Token. Wenn der WebSphere-Java™-Prozess auf einem Windows-System unter Verwendung einer Benutzer-ID mit Kerberos-Berechtigungsnachweisen ausgeführt wird, bewahrt das Windows-Betriebssystem ein Kerberos-TGT (Ticket Granting Ticket) für diesen Benutzer auf. Die Klasse SpnegoTokenHelper verwendet dieses TGT, um ein SPNEGO-Token anzufordern, das für einen Service-Principal-Namen (SPN, ServicePrincipalName) für das Zielservicesystem angefordert werden kann.
- Ein unter Verwendung zwischengespeicherter Kerberos-Berechtigungsnachweise angefordetes Token. Auf einem System, an dem sich ein Benutzer (gewöhnlich unter Verwendung von Tools wie dem Java-Tool kinit) angemeldet hat, werden die Kerberos-Berechtigungsnachweise des Benutzers in einer Cachedatei mit dem Namen krb5cc_<Benutzer-ID> gespeichert. Alternativ kann eine Chiffrierschlüsseldatei, die den Schlüssel eines Benutzers enthält, mit einer Reihe von Tools, wie z. B. dem Microsoft-Tool ktpass oder dem Java-Tool ktab, erstellt werden. Diese Dateien enthalten eine Kopie des Kerberos-Schlüssels des Benutzers, der zum Abrufen eines TGT für diese Benutzer-ID verwendet werden kann. Die Klasse SpnegoTokenHelper verwendet dieses TGT, um ein SPNEGO-Token anzufordern, das für einen Service-Principal-Namen (SPN, ServicePrincipalName) für das Zielservicesystem angefordert werden kann. Der WebSphere-Prozess muss so konfiguriert sein, dass die Datei krb5cc_<Benutzer-ID> oder die Chiffrierschlüsseldatei verwendet wird. Der Benutzerprincipalname (UserPrincipalName) für den zwischengespeicherten Berechtigungsnachweis in der Datei muss ebenfalls angegeben werden.
- Ein unter Verwendung eines Kerberos-Berechtigungsnachweises mit einer Benutzer-ID und einem Kennwort angefordertes Token. In diesem Szenario verwendet der WebSphere-Prozess die Klasse SpnegoTokenHelper, um zum Abrufen eines TGT eine Verbindung zum Kerberos Key Distribution-Server unter Verwendung der angegebenen Benutzer-ID und des zugehörigen Kennworts herzustellen. Die Klasse fordert daraufhin das SPNEGO-Token mit diesem TGT an. Für die Klasse SpnegoTokenHelper sind der SPN (ServicePrincipalName) für das Zielservicesystem sowie die Benutzer-ID und das Kennwort erforderlich.
- Ein unter Verwendung eines Kerberos-Nachweises, der in einem Java-Subjekt vorhanden ist, angefordertes Token.
Das Subjekt kann einen Kerberos-Berechtigungsnachweis mit einer der folgenden Methoden abrufen:
- Als an einer Webanwendung unter Verwendung eingehender SPNEGO-Webauthentifizierung angemeldeter Benutzer. Für diese Option muss nur die SPNEGO-Webauthentifizierung in WebSphere Application Server konfiguriert und aktiviert sein. Die dem eingehenden SPNEGO-Service zugeordnete Kerberos-Benutzer-ID muss für die vollständige Kerberos-Delegierung aktiviert sein.
- Empfang einer JAX-WS-Web-Service-Anforderung mit einem WS-Security-Kerberos-Token. Die der eingehenden Web-Service-Anforderung zugeordnete Kerberos-Benutzer-ID muss für die vollständige Kerberos-Delegierung aktiviert sein.
- Als mit der Benutzer-ID und dem Kennwort angemeldeter Benutzer. WebSphere Application Server wurde dabei für die LTPA- und Kerberos-Authentifizierung konfiguriert.
- Es wurde eine JAX-WS-Web-Service-Anforderung empfangen, die ein Benutzernamenstoken mit einem Kennwort enthält, und WebSphere Application Server wurde für die LTPA- und Kerberos-Authentifizierung konfiguriert. Die Klasse SpnegoTokenHelper verwendet die Berechtigungsnachweise im Subjekt, um ein Service-Ticket für den SPN (ServicePrincipalName) für das Zielservicesystem anzufordern. Die zu diesem Ansatz gehörigen Methoden erfordern neben dem SPN-Wert auch die Angabe eines Java-Subjektparameters.
- Ein unter Verwendung eines Kerberos-Berechtigungsnachweiss im Java-Subjekt der aktuellen Calleridentität angefordertes Token. Dieser Ansatz ähnelt dem vorherigen Ansatz. In der Klasse SpnegoTokenHelper wird dabei eine Methode zur Vereinfachung zum Abrufen der aktuellen Calleridentität verwendet. Das Subjekt unterliegt weiterhin den zuvor erwähnten Einschränkungen. Die zu diesem Ansatz gehörigen Methoden erfordern nur den SPN (ServicePrincipalName).
Alle fünf Ansätze haben zwei Varianten. Bei der ersten Variante kann die Lebensdauer des Tokens und ein boolesches Flag angegeben werden, das angibt, dass ein delegierbares Token angefordert werden muss. Bei der zweiten Variante ist die Lebensdauer des Tokens unbegrenzt und das Token wird nicht als delegierbar angefordert.
Bei allen fünf Ansätzen wird eine Zeichenfolge (z. B. “Negotiate YIIFKwYG….”) zurückgegeben. Der Programmierer ist dafür zuständig, die Zeichenfolge zu verwenden, um den abgehenden Header Authorization einzufügen.
- Anmerkungen für systemeigene Berechtigungsnachweise
- Der Cache für Berechtigungsnachweise für Microsoft Kerberos-Anmeldesitzungen (MSLSA)
stützt sich auf die Fähigkeit, das vollständige Kerberos-Ticket zu extrahieren, einschließlich des Sitzungsschlüssels
aus dem Cache für Berechtigungsnachweise für Kerberos-Anmeldesitzungen (LSA). In einem Versuch, die Sicherheit zu erhöhen, hat Microsoft ein Feature implementiert,
bei dem die Sitzungsschlüssel für Ticket Getting
Tickets nicht mehr exportiert werden, da die Sitzungsschlüssel dadurch für IBM® JGSS unbrauchbar werden könnten, wenn versucht wird,
weitere Servicetickets anzufordern. Dieses neue Feature ist in Windows 2003
Server und neueren Systemen enthalten. Microsoft stellt den folgenden Registrierungsschlüssel für die Inaktivierung dieses neuen Features zur Verfügung:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters AllowTGTSessionKey = 0x01 (DWORD)
- Voraussetzungen in der Kerberos-Konfigurationsdatei
- Die Kerberos-Konfigurationsdatei muss unabhängig vom Ansatz ordnungsgemäß konfiguriert sein.
- Über die Zeilengruppen [realms] und [domain_realm] muss ordnungsgemäß konfiguriert sein, wie der WebSphere-Prozess Key Distribution Center (KDC) erreicht.
- Die in der Zeilengruppe [libdefaults] zu verwendenden Verschlüsselungstypen müssen die Werte default_tkt_enctypes und default_tgs_enctypes angeben.
- Die Zeilengruppe [libdefaults] muss die folgenden Angaben enthalten:
- forwardable = true
- renewable = true
- noaddresses = true
- Die Zeilengruppe [libdefaults] musss einen angemessenen Wert für clockskew definieren.
Chiffrierschlüssel referenzieren
JAASClientUsingKeytab {
com.ibm.security.auth.module.Krb5LoginModule required useKeytab="file:///C:\\WAS\\ND855\\profiles\\AppSrv01\\config\\cells\\testserver-vmCell01-855\\cachKerbUser.keytab" credsType=both
tryFirstPass=true forwardable=true noAddress=true;
};
Beispiele für die Verwendung der Klasse "SPNEGOTokenHelper"
Im ersten Beispiel wird ein SPNEGO-Token für einen Benutzer auf der Basis systemeigener Windows-Berechtigungsnachweise, unter Verwendung derer der WebSphere-Prozess ausgeführt wird, angefordert.
String nativeToken = SpnegoTokenHelper.buildSpnegoAuthorizationStringFromNativeCreds(spn, GSSCredential.INDEFINITE_LIFETIME, false);
- spn - Name des Service-Principals (ServicePrincipalName) des Systems, für das das SPNEGO-Token erforderlich ist. Dies wäre beispielsweise eine Zeichenfolge wie “HTTP/service.host.ibm.com@IBM.COM”.
- Lebensdauer für den Kontext. Im Beispiel ist dies GSSCredential.INDEFINITE_LIFETIME.
- Delegate - Gibt an, ob das Token delegierbare Berechtigungsnachweise enthält. Im Beispiel enthält das Token keine delegierbaren Berechtigungsnachweise.
Das zweite Beispiel veranschaulicht die Verwendung eines Chiffrierschlüssels oder einer Datei mit zwischengespeicherten Berechtigungsnachweisen. In diesem Beispiel wird die einfachere Methode verwendet (keine Angabe der Lebensdauer, Token nicht delegierbar).
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromUpn(spn,upn, jaas);
- upn - Name des Benutzerprincipals (UserPrincipalName) der Identität aus der Datei, z. B. alice@IBM.COM.
- Jaas - Der Name der zu verwendenden JAAS-Konfiguration (die den Chiffrierschlüssel der Datei mit dem zwischengespeicherten Berechtigungsnachweis referenziert, z. B. “JAASClientUsingKeytab”).
Das dritte Beispiel veranschaulicht die Verwendung einer Benutzer-ID und eines Kennworts für die Generierung eines Kerberos-Tokens.
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromUseridPassword(spn,userid,pwd,1000,true);
Die neu eingeführten Parameter sind "userid" und "password". Das Beispiel veranschaulicht außerdem das Anfordern eines Tokens, dessen Lebensdauer nicht unbegrenzt ist: Das Token wird für 1000 Sekunden generiert und ist delegierbar (der diesem SPN zugeordnete Service muss für die Delegierung aktiviert sein).
Das vierte Beispiel zeigt einen selten verwendeten Mechanismus, bei dem Sie mit einem Subjekt beginnen, das einen Kerberos-Berechtigungsnachweis enthält. Dieses Beispiel ist zwar der Vollständigkeit halber angegeben, wenn Sie aber die Erstellung des Subjekts nicht programmgesteuert steuern, werden Sie diese Methode vermutlich nicht verwenden.
String token = buildSpnegoAuthorizationFromSubject(spn, subject);
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromCallerSubject(spn);
Nähere Einzelheiten finden Sie im Artikel Generierung von SPNEGO-Tokens für abgehende JAX-WS-Anforderungen unter Verwendung von Clientrichtliniensatzbindungen.