Kerberos-Client-Principal-Namen der ID für die WebSphere-Benutzerregistry zuordnen

Die Zuordnung des Namens des Kerberos-Client-Principal zur ID für die WebSphere-Benutzerregistry ist sowohl für die SPNEGO-Webauthentifizierung (Simple and Protected GSS-API Negotiation) als auch für die Kerberos-Authentifizierung möglich.

Informationen zu diesem Vorgang

Verwenden Sie das angepasste JAAS-Anmeldemodul, um angepasste Zuordnungen eines Kerberos-Principal-Namens für den Client zu einer WebSphere-Benutzerregistry-ID vorzunehmen. Das angepasste JAAS-Anmeldemodul ist ein Plug-in-Mechanismus, der für die Authentifizierung eingehender Anforderungen in WebSphere Application Server definiert wird. Wenn LTPA als Authentifizierungsverfahren aktiviert ist, wird das angepasste JAAS-Anmeldemodul unmittelbar vor ltpaLoginModule eingefügt. Wenn Kerberos als Authentifizierungsverfahren aktiviert ist, wird das angepasste JAAS-Anmeldemodul unmittelbar vor WSKrb5LoginModule eingefügt.

Das angepasste JAAS-Anmeldemodul ruft einen Kerberos-Client-Principal-Namen in javax.security.auth.Subject mit der Methode subject.getPrivateCredentials(KRBAuthnToken.class) ab. Anschließend ordnet das angepasste JAAS-Anmeldemodul den Kerberos-Client-Principal-Namen der WebSphere-Benutzerregistry-ID zu und fügt die Zuordnungs-ID in die Eigenschaft com.ibm.wsspi.security.cred.userId der Hashtabelle ein. Das wsMapDefaultInboundLoginModule erstellt dann mit der zugeordneten Identität ein WSCredential.

Anmerkung: Bei der SPNEGO-Webauthentifizierung kann das angepasste Anmeldemodul auch den vollständigen Satz mit Sicherheitseigenschaften im javax.security.auth.Subject des com.ibm.wsspi.security.tai.TAIResult bereitstellen, um die zugeordnete ID vollständig zuzusichern. Wenn die ID vollständig zugesichert ist, ordnet wsMapDefaultInboundLoginModule diese Sicherheitseigenschaften einem WSCredential zu.

Vorgehensweise

  1. Sehen Sie sich das folgende Beispiel für ein angepasstes Anmeldemodul an:
    package com.ibm.websphere.security;
    import java.util.Map;
    import java.lang.reflect.Array;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.*;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    import javax.security.auth.kerberos.*;
    import com.ibm.websphere.security.auth.WSLoginFailedException;
    import com.ibm.wsspi.security.token.AttributeNameConstants;
    import com.ibm.wsspi.wssecurity.platform.token.KRBAuthnToken;
    /**
     * 
     * @author IBM Corporation
     * @version 1.0
     * @since 1.0    
     *
     */
    
    public class sampleSpnegoMappingLoginModule implements LoginModule {
        /*
         * 
         * Konstante, die den Namen dieses Zuordnungsmoduls repräsentiert. Wenn mit diesem
         * Beispielcode eine Klasse anderen Namens erstellt wird, muss dieser Wert geändert werden.
         * 
         */
        private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
    
        private String mapUid = null;
        /**
         * Nicht initialisiertes WSLoginModuleImpl-Objekt erstellen
         */
        public sampleSpnegoMappingLoginModule() {
            debugOut("sampleSpnegoMappingLoginModule() entry");
            debugOut("sampleSpnegoMappingLoginModule() exit");
        }
    
        /**
         * Das Anmeldemodul initialisieren
         *
         * 
         * Dieser Aufruf wird vom LoginContext nach der Instanziierung dieses
         * Anmeldemoduls ausgeführt. Die relevanten Informationen werden vom
         * LoginContext an dieses Anmeldemodul übergeben. Falls das Anmeldemodul
         * die in den Parametern sharedState und options gespeicherten Daten
         * nicht versteht, können diese ignoriert werden.
         * 
         *
         * @param subject Das zu authentifizierende Subject.
         * @param callbackHandler
         *                Ein CallbackHandler für die Kommunikation mit dem
         *                Endbenutzer zum Abrufen der Anmeldeinformationen
         *                (Benutzername und Kennwort)
              * @param sharedState
         *                Der mit anderen konfigurierten Anmeldemodulen gemeinsam genutzte Status.
         * @param options Die in der Anmeldekonfiguration für dieses spezielle Anmeldemodul angegebenen Optionen.
         */
        public void initialize(Subject subject, CallbackHandler callbackHandler,
                               Map sharedState, Map options) {
            debugOut("initialize(subject = \"" + subject.toString() +
                     "\", callbackHandler = \"" + callbackHandler.toString() +
                     "\", sharedState = \"" + sharedState.toString() +
                     "\", options = \"" + options.toString() + "\")");
    
            this.subject = subject;
            this.callbackHandler = callbackHandler;
            this.sharedState = sharedState;
            this.options = options;
    
            debug = "true".equalsIgnoreCase((String)this.options.get("debug"));
    
            debugOut("initialize() exit");
        }
    
        /**
         * 
         * Methode für die Authentifizierung eines Subject (Phase 1).
         * 
         *
         * 
         * Diese Methode authentifiziert ein Subject. Sie verwendet den CallbackHandler, um
         * die Informationen zum Subject zu erfassen, wie z. B. Benutzername und Kennwort, und um
         * diese Informationen zu prüfen. Das Ergebnis der Authentifizierung wird im privaten
         * Status in diesem Anmeldemodul gespeichert.
         * 
         *
         * @return: Wert "true" bei erfolgreicher Authentifizierung oder "false",
         *          falls dieses Anmeldemodul ignoriert werden soll.
              * @exception LoginException
         *                   Wenn die Authentifizierung fehlschlägt.
         */
        	public boolean login() throws LoginException 
        {
            debugOut("sampleSpnegoMappingLoginModule.login() entry"); 
    
            boolean succeeded = false;
            KRBAuthnToken krbAuthnToken = null;;
            java.util.Set krb5Principals= subject.getPrivateCredentials(KRBAuthnToken.class);
            java.util.Iterator krb5PrincIter = krb5Principals.iterator();
    
            while (krb5PrincIter.hasNext()) {
                krbAuthnToken = (KRBAuthnToken)krb5PrincIter.next();
                String kerbPrincipal = (String) krbAuthnToken.getTokenPrincipal() + "@" + krbAuthnToken.getTokenRealm();
                debugOut("Kerberos principal name: "+ kerbPrincipal.toString());
                
                if (kerbPrincipal!= null && kerbPrincipal.equals("utle@WSSEC.AUSTIN.IBM.COM")){
                    mapUid = "user1";
                    debugOut("mapUid: "+mapUid);
    
                                     java.util.Hashtable customProperties = (java.util.Hashtable)
                                     sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
                                     if (customProperties == null) {
                                         customProperties = new java.util.Hashtable();
                                     }
                                     succeeded = true;
                                     customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, mapUid);
    
                                     Map<String,java.util.Hashtable>mySharedState=(Map<String,java.
                                     util.Hashtable>)sharedState;
                                     mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY,
                                     customProperties);
    
                                     debugOut("Add a mapping user ID to Hashtable, mapping ID = "+mapUid); 
                                        
                                     debugOut("login() custom properties = " + customProperties);
                }
            }
    
            succeeded = true;
            debugOut("sampleSpnegoMappingLoginModule.login() exit"); 
    
            return succeeded;
        }
    
        /**
         * 
         * Methode zum Festschreiben des Authentifizierungsergebnisses (Phase 2)
         * 
         *
         * 
         * Diese Methode wird aufgerufen, wenn die Gesamtauthentifizierung des LoginContext
         * erfolgreich ist (REQUIRED, REQUISITE, SUFFICIENT und OPTIONAL)
         * 
         *
         * @return: Wert "true", wenn die Festschreibung erfolgreich ist, oder "false",
         *          wenn das Anmeldemodul ignoriert werden soll.
              * @exception LoginException
         *                   Wenn die Festschreibung scheitert.
         */
        public boolean commit() throws LoginException              
        {
            debugOut("commit()");
    
            debugOut("commit()");
    
            return true;
        }
    
        /**
         * Methode zum Abbrechen der Authentifizierung (Phase 2)
         *
         * 
         * Diese Methode wird aufgerufen, wenn die Gesamtauthentifizierung des LoginContext
         * scheitert (REQUIRED, REQUISITE, SUFFICIENT und OPTIONAL)
         * 
         *
         * 
         * Wenn die Authentifizierung des Anmeldemoduls erfolgreich war, bereinigt
         * diese Methode den vorherigen, in Phase 1 gespeicherten Status.
         * 
         *
         * @return: Wert "true", wenn der Abbruch erfolgreich ist, oder Wert "false",
         *          wenn das Anmeldemodul ignoriert werden soll.
              * @exception LoginException
         *                   Wenn der Abbruch scheitert.
         */
        public boolean abort() throws LoginException {
            debugOut("abort() entry");
            debugOut("abort() exit");
            return true;
        }
    
        /**
         * Methode zum Abmelden eines Subject-Objekts
         *
         * @return: Wert "true", wenn die Abmeldung erfolgreich ist, oder "false",
         *          wenn das Anmeldemodul ignoriert werden soll.
              * @exception LoginException
         *                   Wenn die Abmeldung scheitert.
         */
        public boolean logout() throws LoginException
        {
            debugOut("logout() entry");
            debugOut("logout() exit");
    
            return true;
        }
    
        private void cleanup()
        {
            debugOut("cleanup() entry");
            debugOut("cleanup() exit");
        }
    
        /*
         * 
         * Private Methode zum Ausgeben von Traceinformationen. Diese Implementierung verwendet
         * System.out für die Ausgabe der Traceinformationen an die Standardausgabe. Sie können
         * hier auch ein eigenes Tracesystem implementieren.
         * 
         */
        private void debugOut(Object o)
        {
            System.out.println("Debug: " + MAPPING_MODULE_NAME);
            if (o != null) {
                if (o.getClass().isArray()) {
                    int length = Array.getLength(o);
                    for (int i = 0; i < length; i++) {
                        System.out.println("\t" + Array.get(o, i));
                    }
                } else {
                    System.out.println("\t" + o);
                }
            }
        }
        private Subject subject;
        private CallbackHandler callbackHandler;
        private Map sharedState;
        private Map options;
    
        protected boolean debug = false;
    }
  2. Für die SPNEGO-Webauthentifizierung ohne Kerberos-Authentifizierung muss dieses angepasste JAAS-Anmeldemodul zuerst direkt vor dem "ltpaLoginModule" in der Stackanmeldung für die Systemanmeldekonfiguration für WEB_INBOUND, RMI_INBOUND und DEFAULT eingefügt werden.
  3. Für die Kerberos-Authentifizierung muss dieses angepasste JAAS-Anmeldemodul direkt vor dem "WSKrb5LoginModule" für die Systemanmeldekonfiguration für WEB_INBOUND, RMI_INBOUND und DEFAULT eingefügt werden.

Ergebnisse

Mit dem angepassten Anmeldemodul wird der Kerberos-Principal-Name der Sicherheitsregistry von WebSphere Application Server zugeordnet.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_kerb_map
Dateiname:tsec_kerb_map.html