Configuración de la autenticación Kerberos en WebSphere Application Server Community Edition

En la actualidad, WebSphere Application Server Community Edition® no soporta la autenticación Kerberos. En este artículo, resaltamos cómo usted puede potenciar la implementación de Kerberos por medio de IBM ® Java™ Platform para realizar la autenticación Kerberos en WebSphere Application Server Community Edition.

Ashish Jain, Software Engineer, IBM

Author photoAshish Jain is a Software Engineer at IBM India Software Labs in Bangalore India. He is working as Level 3 Technical Support of IBM WebSphere Application Server Community Edition. He received a Bachelors of Engineering in Computer Science from NITK Surathkal, India and joined IBM in 2005 as an ELTP.


Nivel de autor contribuyente en developerWorks

Vamsavardhana Reddy Chillakuru, Advisory Software Engineer, IBM

Vamsavardhana Reddy Chillakuru (a.k.a Vamsi) is an Advisory Software Engineer at IBM India Software Labs in Bangalore, India. He is a committer on Apache Geronimo and Apache Tuscany projects, a member of the Apache Geronimo Project Management Committee, and is part of the IBM WebSphere Application Server Community Edition Level 3 Support Team. He received his Bachelor of Statistics (Hons.) and Master of Statistics degrees from the Indian Statistical Institute, Kolkata, India in the years 1994 and 1996, respectively.



20-11-2009

Introducción

IBM WebSphere Application Server Community Edition V2.1.1.2 (al que, de aquí en más, denominaremos Community Edition) es un servidor de aplicación gratuito certificado bajo Java Platform Enterprise Edition 5.0 (Java EE 5) basado en Apache Geronimo 2.1.4. Community Edition usa el módulo de inicio de sesión Java Authentication and Authorization Service (JAAS) para realizar la autenticación del usuario en aplicaciones Web y el módulo de inicio de sesión Java Authorization Contract for Containers (JACC) para realizar la autorización.

Kerberos es un protocolo de autenticación desarrollado por el Massachusetts Institute of Technology. El protocolo Kerberos hace que los nodos de computadora se puedan comunicar en una red de computadoras no segura con el objetivo de autenticarse entre sí de forma segura. La última versión del protocolo Kerberos es la 5.

Community Edition no soporta la implementación del protocolo Kerberos. En este artículo, usted potenciará la implementación del protocolo Kerberos por medio de IBM Java Platform para autenticar y autorizar usuarios en Community Edition. A los propósitos de este artículo, usamos un servidor Microsoft® Active Directory (al que, de aquí en más, denominaremos Active Directory) como un repositorio de usuarios. Este artículo requiere el uso de WebSphere Application Server Community Edition V2.1.1.2 o de alguna versión posterior.


Kerberos: ¿Cómo funciona?

Kerberos usa criptografía de clave simétrica y requiere el uso de un tercero confiable denominado Key Distribution Center (KDC), que incluye un Authentication Server (AS) y un Ticket Granting Server (TGS). El KDC conserva una base de datos de claves secretas. Cada entidad, ya sea un usuario o un servicio, en la red comparte una clave secreta con el KDC y sólo el KDC y la entidad en cuestión conocen dicha clave secreta. Por lo tanto, el conocimiento de esta clave secreta brinda la identificación de la entidad. Kerberos usa tickets, a los que se conoce como tickets de Kerberos, que incluyen la fecha y hora y tienen una vida corta. Por lo tanto, es importante que las entidades conserven sincronizada la hora.

Una entidad se autentica en el Authentication Server usando una clave secreta compartida (generalmente, una contraseña) y recibe un Ticket Granting Ticket (TGT). Luego de esto, se pone en contacto con el Ticket Granting Server, usa el TGT para certificar su identidad y solicita un servicio. El TGS verifica si la entidad está autorizada para usar el servicio en cuestión y envía un Service Ticket (ST). Luego de esto, la entidad se pone en contacto con el Service Server (SS), usa el ST para certificar que cuenta con la autorización necesaria para usar el servicio en cuestión y usa el servicio. La entidad puede evitar que el TGT obtenga STs adicionales para que los use con SS sin tener que autenticarse con AS una vez más. Se diseñó el protocolo Kerberos de forma tal que la autenticación ocurre sin que la clave compartida secreta (por ejemplo, la contraseña) se transmita por la red. Cuando se usa la autenticación Kerberos, los usuarios suelen ingresar sus credenciales usando un dispositivo de entrada (como, por ejemplo, un teclado), mientras que los servicios usan un archivo Keytab para almacenar y usar sus credenciales para autenticarse ante el KDC.


Kerberos y Community Edition

Community Edition no soporta la implementación del protocolo Kerberos. IBM Java Platform soporta la implementación del protocolo Kerberos mediante la clase com.ibm.security.auth.module.Krb5LoginModule. Para potenciar la implementación de Kerberos por medio de Java Platform, hemos creado una implementación LoginModule que contiene Krb5LoginModule y delega todas las invocaciones de la API del LoginModule al Krb5LoginModule. El Listado 1 le muestra el código para el KerberosLoginModule.

Listado 1. KerberosLoginModule.java
package org.apache.geronimo.security.realm.providers;

import java.security.Principal;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class KerberosLoginModule implements LoginModule {

    private static Log log = LogFactory.getLog(KerberosLoginModule.class);
    private Subject subject;
    private LoginModule krb5LoginModule;
    private Subject krb5Subject;
    private Principal addOnPrincipal;

    public void initialize(Subject subject, CallbackHandler callbackHandler,
 Map sharedState, Map options) {
        this.subject = subject;
        String krb5LoginModuleClass = (String) options.get("krb5LoginModuleClass");
        try {
            krb5LoginModule = (LoginModule)Class.forName(krb5LoginModuleClass)
.newInstance();
        } catch (Exception e) {
            log.error("Initialization failed", e);
            throw new IllegalArgumentException("Unable to configure 
kerberos login module: " + e.getMessage(),e);
        }
        
        Map options1 = new HashMap();
        for(Object key : options.keySet()) {
            String key1 = (String) key;
            if(key1.startsWith("krb_")) {
                options1.put(key1.substring(4), options.get(key1));
            }
        }
        
        krb5Subject = new Subject();
krb5LoginModule.initialize(krb5Subject, callbackHandler, sharedState,
options1);
String addOnPrincipalClass = (String) options.get("addOnPrincipalClass");
String addOnPrincipalName = (String) options.get("addOnPrincipalName");
if(addOnPrincipalClass != null && !addOnPrincipalClass.equals("")) {
   try {
   addOnPrincipal = (Principal) Class.forName(addOnPrincipalClass).getConstructor
    (String.class).newInstance(addOnPrincipalName);
            } catch (Exception e) {
             log.error("Initialization failed", e);
             throw new IllegalArgumentException("Unable to configure kerberos login 
              module: " + e.getMessage(), e);
            }
        }
    }

    public boolean login() throws LoginException {
        return krb5LoginModule.login();
    }

    public boolean commit() throws LoginException {
        boolean result = krb5LoginModule.commit();
        if(result) {
         if(addOnPrincipal != null) subject.getPrincipals().add(addOnPrincipal);

subject.getPrincipals().addAll(krb5Subject.getPrincipals());
       subject.getPublicCredentials().addAll(krb5Subject.getPublicCredentials());
       subject.getPrivateCredentials().addAll(krb5Subject.getPrivateCredentials());
        }
        return result;
    }

public boolean abort() throws LoginException {
        return krb5LoginModule.abort();
    }

public boolean logout() throws LoginException {
    if(!subject.isReadOnly()) {
    // Remove principals and credentials added by this LoginModule
    if(addOnPrincipal != null) subject.getPrincipals().remove(addOnPrincipal);
subject.getPrincipals().removeAll(krb5Subject.getPrincipals());
    subject.getPublicCredentials().removeAll(krb5Subject.getPublicCredentials());
   subject.getPrivateCredentials().removeAll(krb5Subject.getPrivateCredentials());
        }
        return krb5LoginModule.logout();
    }
}

El KerberosLoginModule tiene las siguientes opciones del LoginModule:

  • krb5LoginModuleClass: Especifica el nombre completamente calificado de la clase de implementación del protocolo Kerberos provisto por Java Platform. Esta clase debe implementar la interfaz javax.security.auth.spi.LoginModule. Como vamos a usar el Krb5LoginModule provisto por IBM Java Platform, este valor será com.ibm.security.auth.module.Krb5LoginModule.
  • addOnPrincipalClass: Especifica el nombre completamente calificado de la clase del principal a agregar al sujeto si el inicio de sesión es exitoso. Este principal se agregará al sujeto junto con todos los principales que resulten del inicio de sesión al usar krb5LoginModuleClass. No use esta opción si no está agregando más principales.
  • addOnPrincipalName: Especifica el nombre del principal a agregar al sujeto. Esta opción se usa sólo si se especifica addOnPrincipalClass.
  • krb_*: Todas las opciones que se transfieren al métodoinitialize()de krb5LoginModuleClass se deben especificar usando el prefijo “krb_”. El prefijo “krb_” se eliminará del nombre de la opción antes de que se lo transfiera al método initialize(). Por ejemplo, krb_debug=true se transferirá como debug=true al método initialize().

El método KerberosLoginModule.initialize() crea una instancia de clase configurada usando la opción krb5LoginModuleClass e inicializa dicha instancia sólo con aquellas opciones cuyo nombre comienza con “krb_”, pero se remueve dicho prefijo del nombre de la opción. También crea un principal de ampliación según lo configurado por las opciones addOnPrincipalClass y addOnPrincipalName. Luego de una autenticación exitosa, el método KerberosLoginModule.commit() agrega todos los Principals (Principales), las Public Credentials (Credenciales Públicas) y las Private Credentials (Credenciales Privadas) que resultan del inicio de sesión de krb5LoginModuleClass y del Principal de ampliación en el Sujeto. La clase KerberosLoginModule se usa para crear dominios de seguridad que realizan la autenticación en Community Edition usando el protocolo Kerberos.


Configuración de usuarios en Microsoft Active Directory

Este artículo no se ocupa de la instalación y la configuración del servidor Microsoft Active Directory. En lo que respecta a nuestra configuración, iniciamos el Key Distribution Centre (KDC) en el puerto 88. Siga los pasos que figuran a continuación para agregar usuarios nuevos al servidor Active Directory.

  1. Ejecute Active Directory Users and Computers (Usuarios y Computadoras de Active Directory) y seleccione Users (Usuarios), como se observa en la Figura 1.
    Figura 1. Usuarios y computadoras de Active Directory
    Usuarios y computadoras de Active Directory
  2. Presione el botón derecho del mouse sobre Users (Usuarios) y seleccione New > User (Nuevo > Usuario), como se observa en la Figura 2.
    Figura 2. Creación de un nuevo usuario
    Creación de un nuevo usuario
  3. En el recuadro de diálogo, complete los campos First Name (Nombre), Last Name (Apellido) y User logon name (Nombre de inicio de sesión del usuario) y haga clic en Next (Siguiente), como se observa en la Figura 3.
    Figura 3. Creación de un nuevo usuario: Detalles del usuario
    Creación de un nuevo usuario: Detalles del usuario
  4. Ingrese una contraseña para el usuario y haga clic en Next (Siguiente), como se observa en la Figura 4.
    Figura 4. Creación de un nuevo usuario: Contraseña
    Creación de un nuevo usuario: Contraseña
  5. Haga clic en Finish (Finalizar) para terminar de agregar al usuario nuevo, como se observa en la Figura 5.
    Figura 5. Creación de un nuevo usuario: Nuevo usuario agregado
    Creación de un nuevo usuario: Nuevo usuario agregado

Usted podrá observar que el usuario recién creado figura debajo de "Users" (Usuarios).


Configuración de la máquina del cliente

Este paso requiere el copiado del archivo de configuración de Kerberos en una ubicación predefinida. En el caso de los clientes Windows, a este archivo se lo denomina "krb5.ini" y se encuentra en "C:/winnt/". En el caso de los clientes Linux, a este archivo se lo denomina "krb5.conf" y se encuentra en "/etc". El Listado 2 le muestra el archivo de configuración de Kerberos que usamos en nuestra configuración.

Listado 2. Archivo de configuración de Kerberos: krb5.ini
[libdefaults]
                default_realm = AUSTIN.IBM.COM default_tkt_enctypes =
                rc4-hmac,des-cbc-md5,des-cbc-crc default_tgs_enctypes =
                rc4-hmac,des-cbc-md5,des-cbc-crc [realms] AUSTIN.IBM.COM = { kdc =
                ad1ldap.austin.ibm.com:88 } [domain_realm] austin.ibm.com = AUSTIN.IBM.COM
                .austin.ibm.com = AUSTIN.IBM.COM

Ahora, observemos cada una de las secciones de este archivo de configuración y las entradas al mismo.

La primera sección es [libdefaults] y detalla los valores predeterminados usados por la biblioteca de Kerberos V5. A continuación, se describen los diversos campos que forman parte de esta sección:

  • default_realm: Este campo es el dominio predeterminado que se usará para la comunicación entre un cliente y un host. Si usted usa un nombre principal de "ashish", AUSTIN.IBM.COM se agregará de manera predeterminada al principal y el principal final será ashish@AUSTIN.IBM.COM.
  • default_tgs_enctypes: Este campo identifica las encriptaciones de clave de sesión que devuelve KDC. Asegúrese de especificar rc4-hmac en este campo cuando use Microsoft Active Directory como KDC.
  • default_tkt_enctypes: Este campo identifica la lista de tipos de encriptaciones de clave de sesión que el cliente solicitará.

La segunda sección es [realms] y detalla el mapeo del servidor KDC y el dominio. En el Listado 2, AUSTIN.IBM.COM se mapeó hacia ad1ldap.austin.ibm.com:88. Aquí, ad1ldap.austin.ibm.com es el hostName y 88 es el puerto en el que el servidor KDC se está ejecutando.

La tercera sección es [domain_realm] y detalla el mapeo de los nombres de los subdominios y los dominios hacia los nombres del dominio Kerberos. Esto determina en qué dominio se encuentra un host, según su nombre de dominio completamente calificado.


Agregado del JAR del módulo de inicio de sesión de Kerberos personalizado al repositorio

La versión actual de Community Edition no soporta la implementación de KerberosLoginModule. Este artículo le ofrece un JAR del módulo de inicio de sesión personalizado que incluye la clase KerberosLoginModule (que figura en el Listado 1), que lo ayudará a crear un dominio de seguridad Kerberos en Community Edition. Este jar debe agregarse al repositorio de Community Edition. Siga los siguientes pasos para agregar el jar del módulo de inicio de sesión al repositorio de Community Edition:

  1. Inicie Community Edition, y abra http://localhost:8080/console/ en su navegador.
  2. Ingrese system como nombre de usuario y manager como contraseña. Haga clic en Login (Inicio de sesión), que abre la página de inicio en la consola administrativa, como se puede observar en la Figura 6.
    Figura 6. Consola administrativa: Página de inicio
    Consola administrativa: Página de inicio
  3. Haga clic en Repository (Repositorio) debajo de Console Navigation (Navegación de Consola) para iniciar el portlet del Repositorio que aparece en la Figura 7.
    Figura 7. Portlet del Repositorio
    Portlet del Repositorio
  4. Navegue hacia la ubicación en la que descargó el jar del módulo de inicio de sesión personalizado. Complete los campos, como se puede observar en la Figura 7, y haga clic en Install (Instalar). De esta forma, se instala el jar del módulo de inicio de sesión en el repositorio de Community Edition.

Creación de un dominio Kerberos

Esta sección describe los pasos a seguir para crear un dominio Kerberos usando la Consola Administrativa de Community Edition. Siga los pasos que figuran a continuación para crear un dominio Kerberos:

  1. Haga clic en el vínculo Security Realms (Dominios de Seguridad) en Console Navigation (Navegación de Consola) debajo de Security (Seguridad), como se puede observar en la Figura 8.
    Figura 8. Inicio del portlet de dominios de seguridad
    Inicio del portlet de dominios de seguridad
  2. En el portlet Security Realms (Dominios de Seguridad), haga clic en Add new security realm (Agregar dominio de seguridad nuevo), como se puede observar en la Figura 9.
    Figura 9. Inicio de la página del dominio de seguridad nuevo
    Inicio de la página del dominio de seguridad nuevo
  3. En la siguiente página, ingrese el dominio como kerberos-realm, seleccione el tipo de dominio como Other (Otro) y haga clic en Next (Siguiente), como se puede observar en la Figura 10.
    Figura 10. Creación del dominio de seguridad nuevo
    Creación del dominio de seguridad nuevo
  4. Complete los formularios como se puede observar en la Figura 11. Seleccione el jar del módulo de inicio de sesión del menú desplegable. Éste es el mismo jar que se agregó al repositorio con anterioridad. Ingrese org.apache.geronimo.security.realm.providers.KerberosLoginModule en Login Module Class (Clase del Módulo de Inicio de Sesión). Agregue las opciones de Configuración que se pueden observar en el Listado 3.
    Listado 3. Opciones de configuración durante la creación del dominio de seguridad
    addOnPrincipalName=admin
    addOnPrincipalClass=org.apache.geronimo.security.realm.providers.
    GeronimoGroupPrincipal
    krb_debug=true
    krb5LoginModuleClass= com.ibm.security.auth.module.Krb5LoginModule
    Figura 11. Creación del dominio de seguridad nuevo: Configuración
    Creación del dominio de seguridad nuevo: Configuración
  5. Una vez que haya terminado de hacer esto, usted podrá navegar hacia el pie de la página. Haga clic en Show Plan (Mostrar Plan), como se puede observar en la Figura 12, para visualizar el plan del dominio Kerberos.
    Figura 12. Visualización del plan del dominio de seguridad creado
    Visualización del plan del dominio de seguridad creado
  6. En la siguiente pantalla, usted podrá visualizar el plan creado dentro de un recuadro de diálogo, como se puede observar en la Figura 13. Usted también podrá copiarlo a modo de referencia. Haga clic en Deploy para implementar el dominio de seguridad en Community Edition.
    Figura 13. Implementación del plan del dominio de seguridad
    Implementación del plan del dominio de seguridad
    Cuando la implementación sea exitosa, usted podrá ver "kerberos-realm" en la lista de la página Security Realms (Dominios de Seguridad), como se puede observar en la Figura 14.
    Figura 14. Implementación exitosa del dominio Kerberos
    Implementación exitosa del dominio Kerberos

Implementación y prueba de la aplicación de muestra

Para probar el dominio Kerberos, hemos incluido una aplicación de muestra junto con este artículo. Siga los pasos que figuran a continuación para implementar y probar esta aplicación de muestra:

  1. Haga clic en Deploy New en la consola de navegación debajo de Applications, como se puede observar en la Figura 15.
    Figura 15. Inicio del portlet de Implementar Nuevo
    Inicio del portlet de Implementar Nuevo
  2. Navegue hacia la ubicación en la que descargó la aplicación de muestra. Seleccione SimpleWebApp-Subject.war para Archive y SimpleWebApp-Subject-plan.xml para Plan, como se puede observar en la Figura 16.
    Figura 16. Instalación de la aplicación
    Instalación de la aplicación
  3. Haga clic en Install para implementar la aplicación de muestra.
  4. Una vez que haya hecho esto, inicie la siguiente url: http://localhost:8080/kerberos-realm-demo/admin/admin.jsp. Esto desplegará una pantalla para brindar credenciales de inicio de sesión (Figura 17).
    Figura 17. Aplicación Web Simple: Pantalla de inicio de sesión
    Aplicación Web Simple: Pantalla de inicio de sesión
  5. Ingrese el nombre de usuario y la contraseña que se crearon con Microsoft Active Directory y haga clic en Login (Inicio de sesión).
  6. Cuando la autenticación sea exitosa, usted podrá ver la página de inicio, que indica que ashishjain@AUSTIN.IBM.COM se ha agregado al grupo administrador. Además de esto, también muestra el ticket de Kerberos generado, como se puede observar en la Figura 18.
    Figura 18. Página de inicio y otros artefactos resultantes de la autenticación exitosa
    Página de inicio y otros artefactos resultantes de la autenticación exitosa

    Observe que, además de KerberosPrincipal, el Sujeto también tiene a GeronimoGroupPrincipal configurado en el dominio usando las opciones addOnPrincipal.

  7. Ahora, intente ingresar una contraseña incorrecta y podrá ver un mensaje de inicio de sesión incorrecto, como se puede observar en la Figura 19.
    Figura 19. Resultado de un inicio de sesión incorrecto
    Resultado de un inicio de sesión incorrecto

Conclusión

Este artículo le mostró cómo usted puede potenciar la implementación del protocolo Kerberos por medio de IBM Java Platform creando una función contenedora KerberosLoginModule para autenticar usuarios en Community Edition. También se demostró, por medio de una aplicación Web de muestra, cómo se autentican los usuarios que figuran en un servidor Microsoft Active Directory usando Kerberos.


Descargar

DescripciónNombretamaño
Code sampleapplication_files.zip10 KB

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere, Lotus
ArticleID=448471
ArticleTitle=Configuración de la autenticación Kerberos en WebSphere Application Server Community Edition
publish-date=11202009