Mapeamento de um Nome de Proprietário do Kerberos do Cliente para o ID do Registro do Usuário do WebSphere

É possível mapear o nome do principal cliente Kerberos para o ID do registro do usuário WebSphere para a autenticação da Web Simple and Protected GSS-API Negotiation (SPNEGO) e para a autenticação Kerberos.

Sobre Esta Tarefa

Utilize o módulo de login customizado JAAS (Java Authentication and Authorization Service) para desempenhar qualquer mapeamento customizado de um nome de proprietário do Kerberos do cliente para a identidade do registro do usuário do WebSphere. O módulo de login customizado JAAS é um mecanismo de plug-in que é definido para a autenticar solicitações recebidas no WebSphere Application Server. Se o mecanismo de autenticação ativo for o LTPA, o módulo de login customizado JAAS será inserido imediatamente antes do ltpaLoginModule. Se o mecanismo de autenticação ativo for Kerberos, o módulo de login customizado JAAS será inserido imediatamente antes de WSKrb5LoginModule.

O módulo de login customizado JAAS recupera um nome do principal do Kerberos cliente no javax.security.auth.Subject usando o métodosubject.getPrivateCredentials(KRBAuthnToken.class). O módulo de login customizado JAAS, então, mapeia o nome do principal do Kerberos cliente para a identidade do registro do usuário do WebSphere e insere a identidade de mapeamento na propriedade hashtable, com.ibm.wsspi.security.cred.userId. O wsMapDefaultInboundLoginModule então utiliza a identidade mapeada para criar uma WSCredential.

Nota: Para autenticação da Web de SPNEGO, o módulo de login customizado também pode fornecer o conjunto completo de propriedades de segurança no javax.security.auth.Subject no com.ibm.wsspi.security.tai.TAIResult para asserção completa da identidade mapeada. Quando a identidade estiver completamente asserida, o wsMapDefaultInboundLoginModule mapeará essas propriedades de segurança para uma WSCredential.

Procedimento

  1. Consulte o exemplo a seguir de um módulo de login customizado:
    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 {
        /*
         * 
         * Constante que representa o nome desse módulo de mapeamento.  Sempre que essa amostra
         * de código for utilizada para criar uma classe com um nome diferente, esse valor deve ser alterado.
         * 
         */
        private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
    
        private String mapUid = null;
        /**
         * Construir um objeto WSLoginModuleImpl não inicializado.
         */
        public sampleSpnegoMappingLoginModule() {
            debugOut("sampleSpnegoMappingLoginModule() entry");
            debugOut("sampleSpnegoMappingLoginModule() exit");
        }
    
        /**
         * Inicialize esse módulo de login.
         *
         * 
         * Ele é chamado pelo LoginContext depois que esse módulo de login é
         * instanciado. As informações relevantes são transmitidas do LoginContext
         * para esse módulo de login. Se o módulo de login não entender os dados
         * armazenados no sharedState e parâmetros opcionais,
         * eles podem ser ignorados.
         * 
         *
         * @param subject O sujeito a ser autenticado.
         * @param callbackHandler
         *                Um CallbackHandler para se comunicar com o usuário final para reunir informações de login (por exemplo, nome de usuário e senha).
         * @param sharedState
         *                O estado compartilhado com outros módulos de login configurados.
         * @param options As opções especificadas na configuração de login para este módulo de login específico.
         */
        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 um Subject (fase 1).
         * 
         *
         * 
         * Este método autentica um Subject. Ele utiliza o CallbackHandler para reunir
         * as informações do Subject, tais como nome do usuário e senha, por exemplo, e verifica essas
         * informações. O resultado da autenticação é salvo no estado privado dentro
         * deste módulo de login.
         * 
         *
         * @retornar verdadeiro se a autenticação for bem-sucedida, ou falso
         *         se este módulo de login deve ser ignorado.
         * @exception LoginException
         *                   Se a autenticação falhar.
         */
        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("Incluir um ID de usuário de mapeamento na Hashtable, ID do mapeamento = "+mapUid); 
                                        
                                     debugOut("login() custom properties = " + customProperties);
                }
            }
    
            succeeded = true;
            debugOut("sampleSpnegoMappingLoginModule.login() exit"); 
    
            return succeeded;
        }
    
        /**
         * 
         * Método para confirmar o resultado da autenticação (fase 2).
         * 
         *
         * 
         * Esse método será chamado se a autenticação geral do LoginContext
         * obteve êxito (o módulo de login REQUIRED, REQUISITE, SUFFICIENT e OPTIONAL
         * obteve êxito).
         * 
         *
         * @retornar true se a confirmação for bem-sucedida, ou false
         *         se este módulo de login deve ser ignorado.
         * @exception LoginException
         *                   Se a confirmação falhar.
         */
        public boolean commit() throws LoginException              
        {
            debugOut("commit()");
    
            debugOut("commit()");
    
            return true;
        }
    
        /**
         * Método para interromper o processo de autenticação (fase 2).
         *
         * 
         * Esse método será chamado se a autenticação geral do LoginContext
         * falhou (o módulo de login REQUIRED, REQUISITE, SUFFICIENT e OPTIONAL
         * não obteve êxito).
         * 
         *
         * 
         * Se a tentativa de autenticação deste módulo de login obteve êxito, este método limpa
         * o estado anterior salvo na fase 1.
         * 
         *
         * @retornar verdadeiro se a interrupção for bem-sucedida, ou falso
         *         se este módulo de login deve ser ignorado.
         * @exception LoginException
         *                   Se a interrupção falhar.
         */
        public boolean abort() throws LoginException {
            debugOut("abort() entry");
            debugOut("abort() exit");
            return true;
        }
    
        /**
         * Método que efetua logout de um Subject.
         *
         * @retornar true se a logout for bem-sucedido, ou false
         *         se este módulo de login deve ser ignorado.
         * @exception LoginException
         *                   Se o logout falhar.
         */
        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 informações de rastreio.  A implementação utiliza System.out
         * para imprimir informações de rastreio de saída padrão, mas um sistema de rastreio personalizado pode
         * ser implementado aqui também.
         * 
         */
        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. Para a autenticação da Web SPNEGO sem a autenticação Kerberos, esse módulo de login do JAAS customizado deve primeiro ser inserido imediatamente antes do ltpaLoginModule no login de pilha da configuração de logon do sistema para WEB_INBOUND, RMI_INBOUND e DEFAULT.
  3. Para a autenticação Kerberos, esse módulo de login customizado JAAS deve ser inserido imediatamente antes do WSKrb5LoginModule para a configuração de login do sistema para WEB_INBOUND, RMI_INBOUND e DEFAULT.

Resultados

Usando o módulo de login customizado, o nome do principal do Kerberos é mapeado para o registro de segurança do WebSphere Application Server.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_kerb_map
Nome do arquivo: tsec_kerb_map.html