Correlación del nombre principal del cliente Kerberos con el ID del registro de usuarios de WebSphere para SPNEGO TAI (en desuso)

Puede utilizar una interfaz de programación del sistema para personalizar el comportamiento de TAI (interceptor de asociación de confianza) del mecanismo SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) implementando correlaciones arbitrarias de la identidad del usuario final, que se recupera desde Microsoft Active Directory para la identidad utilizada en el registro de seguridad de WebSphere Application Server.

Antes de empezar

Tendrá que realizar algunas tareas administrativas en el entorno de WebSphere Application Server para utilizar SPNEGO TAI y para garantizar que la identidad del solicitante coincida con la identidad del registro de usuarios de WebSphere Application Server.
Deprecated feature Deprecated feature:

En WebSphere Application Server Versión 6.1 se introdujo un interceptor de asociación de confianza (TAI) que utiliza el mecanismo SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) para negociar y autenticar de forma segura solicitudes HTTP para los recursos protegidos. En WebSphere Application Server 7.0, esta función está en desuso. La autenticación web SPNEGO ha ocupado su lugar para proporcionar la recarga dinámica de filtros SPNEGO y para habilitar la recuperación para el método de inicio de sesión de la aplicación.

depfeat
Nota: Compruebe que las tareas siguientes se han realizado correctamente:
  1. Configuración del navegador web para utilizar SPNEGO. Consulte Configuración del navegador de cliente para utilizar SPNEGO TAI (en desuso)
  2. Configuración de las propiedades de JVM (Java™ Virtual Machine), personalización de las propiedades de SPNEGO TAI y habilitación de SPNEGO TAI. Consulte Configuración de las propiedades personalizadas de JVM, filtrado de solicitudes HTTP y habilitación de SPNEGO TAI en WebSphere Application Server (en desuso)

Acerca de esta tarea

En el despliegue más sencillo de SPNEGO TAI, se da por supuesto que la identidad del solicitante en el registro de usuarios de WebSphere Application Server es idéntica a la identidad recuperada. Este caso se produce cuando el servidor de Microsoft Windows Active Directory es el servidor LDAP (Lightweight Directory Access Protocol) utilizado en WebSphere Application Server. Se trata del comportamiento por omisión del SPNEGO TAI.

No es necesario que utilice este despliegue sencillo del SPNEGO TAI. WebSphere Application Server puede utilizar un registro diferente, como por ejemplo un sistema operativo local, LDAP o el registro personalizado, en lugar de Microsoft Active Directory. Si WebSphere Application Server utiliza un registro diferente a Microsoft Active Directory, es necesaria una correlación del ID de usuario de Microsoft Windows con un ID de usuario de WebSphere Application Server.

Procedimiento

Utilice el módulo de inicio de sesión personalizado JAAS para realizar cualquier correlación personalizada de un nombre principal de cliente Kerberos de Microsoft Active Directory con la identidad del registro de usuarios de WebSphere. El módulo de inicio de sesión personalizado JAAS es un mecanismo de plug-in definido para la autenticación de solicitudes entrantes y salientes en WebSphere Application Server, y se inserta antes de ltpaLoginModule. El módulo de inicio de sesión personalizado JAAS recupera un nombre principal de cliente Kerberos en javax.security.auth.Subject mediante el método subject.getPrincipals(KerberosPrincipal.class), correlaciona el nombre principal de cliente Kerberos con la identidad del registro de usuarios de WebSphere e inserta la identidad de correlación en la propiedad de la tabla hash com.ibm.wsspi.security.cred.userId. A continuación, ltpaLoginModule utiliza la identidad correlacionada para crear un WSCredential.
Nota: El módulo de inicio de sesión personalizado también puede proporcionar el conjunto completo de propiedades de seguridad de javax.security.auth.Subject en com.ibm.wsspi.security.tai.TAIResult para confirmar por completo la identidad correlacionada. Si la identidad se confirma por completo, wsMapDefaultInboundLoginModule correlaciona estas propiedades de seguridad con una WSCredential.
El siguiente es un ejemplo del módulo de inicio de sesión personalizado:
package com.ibm.ws.security.server.lm;

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;

/**
 * 
 * @author IBM Corporation
 * @version 1.0
 * @since 1.0    
 *
 */

public class sampleSpnegoMappingLoginModule implements LoginModule {
    /*
     * 
     * Constante que representa el nombre de este módulo de correlación.  Si se utiliza
     * este código de ejemplo para crear una clase con otro nombre, este valor debe cambiarse.
     * 
     */
    private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";

    private String mapUid = null;
    /**
     * Crear un objeto WSLoginModuleImpl no inicializado.
     */
    public sampleSpnegoMappingLoginModule() {
        debugOut("sampleSpnegoMappingLoginModule() entry");
        debugOut("sampleSpnegoMappingLoginModule() exit");
    }

    /**
     * Inicializar este módulo de inicio de sesión.
     *
     * 
     * Se invoca mediante LoginContext después de crear una instancia de
     * este módulo de inicio de sesión. Se pasa la información relevante desde LoginContext
     * a este módulo de inicio de sesión. Si el módulo de inicio de sesión no comprende los datos
     * almacenados en los parámetros sharedState y options,
     * se pueden ignorar.
     * 
     *
     * @param subject The subject to be authenticated.
     * @param callbackHandler
     *                CallbackHandler para comunicarse con el usuario final para reunir 
                      información de inicio de sesión (por ejemplo, nombre de usuario y contraseña).
     * @param sharedState
     *                Estado compartido con otros módulos de inicio de sesión configurados.
     * @param options Opciones especificadas en la configuración de inicio de sesión de este módulo de inicio de sesión concreto.
     */
    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");
    }

    /**
     * 
     * Método para autenticar un asunto (fase 1).
     * 
     *
     * 
     * Este método autentica un asunto. Utiliza CallbackHandler para recopilar información
     * sobre el asunto, como el nombre de usuario y la contraseña y verificar
     * esta información. El resultado de la autenticación se guarda en estado privado dentro de
     * este módulo de inicio de sesión.
     * 
     *
     * @return  true si la autenticación es satisfactoria o false
     *         si se debe ignorar este módulo de inicio de sesión.
     * @exception LoginException
     *                   Si falla la autenticación.
     */
    public boolean login() throws LoginException
    {
        debugOut("sampleSpnegoMappingLoginModule.login() entry"); 

        boolean succeeded = false;
        java.util.Set krb5Principals= subject.getPrincipals(KerberosPrincipal.class);
        java.util.Iterator krb5PrincIter = krb5Principals.iterator();

        while (krb5PrincIter.hasNext()) {
            Object princObj = krb5PrincIter.next();
            debugOut("Kerberos principal name: "+ princObj.toString());
            
            if (princObj != null && princObj.toString().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("Añadir un ID de usuario de correlación a Hashtable, ID de correlación = "+mapUid); 

                                    }
                                 debugOut("login() custom properties = " + customProperties);
            }
        }

        succeeded = true;
        debugOut("sampleSpnegoMappingLoginModule.login() exit"); 

        return succeeded;
    }

    /**
     * 
     * Método para comprometer el resultado de la autenticación (fase 2).
     * 
     *
     * 
     * Este método se invoca si la autenticación general de LoginContext ha sido
     * satisfactoria (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
     * se ha realizado correctamente).
     * 
     *
     * @return  true si el compromiso es satisfactorio o false
     *         si se debe ignorar este módulo de inicio de sesión.
     * @exception LoginException
     *                   Si falla el compromiso.
     */
    public boolean commit() throws LoginException              
    {
        debugOut("commit()");

        debugOut("commit()");

        return true;
    }

    /**
     * Método para terminar anormalmente el proceso de autenticación (fase 2).
     *
     * 
     * Este método se invoca si la autenticación general de LoginContext ha sido
     * errónea (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
     * no se ha ejecutado correctamente).
     * 
     *
     * 
     *Si el intento de autenticación de este módulo de inicio de sesión ha sido correcto, este método
     * limpia el estado anterior guardado en la fase 1.
     * 
     *
     * @return  true si la finalización anómala es satisfactoria o false
     *         si se debe ignorar este módulo de inicio de sesión.
     * @exception LoginException
     *                   Si falla la finalización anómala.
     */
    public boolean abort() throws LoginException {
        debugOut("abort() entry");
        debugOut("abort() exit");
        return true;
    }

    /**
     * Método que finaliza la sesión de un sujeto.
     *
     * @return  true si la desconexión es satisfactoria o false
     *         si se debe ignorar este módulo de inicio de sesión.
     * @exception LoginException
     *                   Si falla la desconexión.
     */
    public boolean logout() throws LoginException
    {
        debugOut("logout() entry");
        debugOut("logout() exit");

        return true;
    }

    private void cleanup()
    {
        debugOut("cleanup() entry");
        debugOut("cleanup() exit");
    }

    /*
     * 
     * Método privado para imprimir la información de rastreo.  Esta implementación utiliza System.out
     * para imprimir la información de rastreo en la salida estándar, pero un sistema de rastreo personalizado puede
     * implementarse aquí también.
     * 
     */
    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;
}

Resultados

A través del módulo de inicio de sesión personalizado, las identidades de Microsoft Active Directory se correlacionan con el registro de seguridad de WebSphere Application Server y se personaliza el comportamiento de SPNEGO TAI.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_SPNEGO_tai_umapper
File name: tsec_SPNEGO_tai_umapper.html