Propagación de un objeto serializable Java personalizado para la propagación de atributos de seguridad
Este documento describe cómo añadir un objeto al sujeto desde un módulo de inicio de sesión y describe otras consideraciones sobre infraestructura para garantizar que el objeto Java™ se propague.
Antes de empezar
Acerca de esta tarea
Procedimiento
- Añada el objeto Java personalizado al sujeto
desde un módulo de inicio de sesión personalizado. Existe un proceso de dos
fases para cada módulo de inicio de sesión JAAS (Java Authentication
and Authorization Service). WebSphere Application Server
completa los siguientes procesos para cada módulo de inicio de sesión
presente en la configuración:
- método de inicio de sesión
- En este paso, se analizan los devoluciones de llamada de la configuración de inicio de sesión, si es necesario, y se crean los nuevos objetos y credenciales.
- método de compromiso
- En esta paso, los objetos y credenciales que se crean durante el inicio de sesión se añaden al Subject.
Una vez añadido un objeto Java personalizado al sujeto, WebSphere Application Server serializa el objeto en el servidor emisor, deserializa el objeto en el servidor receptor y vuelve a añadir el objeto al sujeto en sentido descendente. No obstante, existen algunos requisitos para que este proceso se efectúe correctamente. Para obtener más información sobre el modelo de programación JAAS, consulte la información de JAAS proporcionada en el artículo Seguridad: Recursos de aprendizaje.Importante: Siempre que conecte un módulo de inicio de sesión personalizado a la infraestructura de inicio de sesión de WebSphere Application Server, asegúrese de que el código es de confianza. Cuando ponga juntas las clases en un archivo JAR (Java Archive) y añada el archivo al directorio raíz_servidor_apl/lib/ext/, el módulo de inicio de sesión tendrá los permisos AllPermissions de la seguridad de Java 2. Se recomienda que añada el módulo de inicio de sesión y otras clases de infraestructura en cualquier directorio privado. No obstante, debe modificar el archivo raíz_perfil/properties/server.policy para asegurarse de que el directorio privado, el archivo JAR (Java Archive), o ambos tienen los permisos necesarios para ejecutar las API (interfaces de programación de aplicaciones) que se llaman desde el módulo de inicio de sesión. Como es posible que el módulo de inicio de sesión se ejecute después del código de aplicación en la pila de llamadas, puede añadir el código doPrivileged para que no sea necesario añadir las propiedades adicionales a la aplicación.
Importante: Siempre que conecte un módulo de inicio de sesión personalizado a la infraestructura de inicio de sesión de WebSphere Application Server, asegúrese de que el código es de confianza. Cuando añada el módulo de inicio de sesión al directorio raíz_perfil/classes, el módulo de inicio de sesión tiene los permisos AllPermissions de la seguridad de Java 2. Para obtener más información, consulte Creación de un subdirectorio de clases en el perfil para clases personalizadas. Sin embargo, puesto que el módulo de inicio de sesión se puede ejecutar después del código de aplicación en la pila de llamadas, puede añadir el código doPrivileged para que no tener que añadir propiedades adicionales a las aplicaciones.
El siguiente ejemplo de código muestra cómo añadir el código doPrivileged. Para obtener información sobre los pasos de inicialización, inicio de sesión y compromiso a seguir, consulte Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAASpublic customLoginModule() { public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { } public boolean login() throws LoginException { // Construye la devolución de llamada de WSTokenHolderCallback para que // pueda determinar si // se ha propagado el objeto personalizado Callback callbacks[] = new Callback[1]; callbacks[0] = new WSTokenHolderCallback("Authz Token List: "); try { _callbackHandler.handle(callbacks); } catch (Exception e) { throw new LoginException (e.getLocalizedMessage()); } // Comprueba si alguna información se propaga durante este inicio de sesión List authzTokenList = ((WSTokenHolderCallback) callbacks[1]). getTokenHolderList(); if (authzTokenList != null) { for (int i = 0; i< authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Busca el objeto personalizado. Asegúrese de que utiliza // "startsWith" porque hay algunos datos añadidos // al final del nombre, lo que indica a qué Subject // Set pertenece. Ejemplo de getName(): // "com.acme.CustomObject (1)". El nombre de clase // se genera en el extremo emisor llamando al // método object.getClass().getName(). Si este objeto // está deserializado en WebSphere Application Server, // devuélvalo y no tendrá que añadirlo aquí. // De lo contrario, puede añadirlo más abajo. // Nota: si la clase aparece en esta lista y // no utiliza serialización personalizada (por ejemplo, // una implementación de la interfaz de señales descrita // en Propagation Token Framework), WebSphere // Application Server deserializa automáticamente el // objeto Java. Puede volver aquí, si // se encuentra en la lista. if (tokenHolder.getName().startsWith("com.acme.CustomObject")) return true; } } // Si llega hasta aquí, es que no se ha propagado el objeto personalizado myCustomObject = new com.acme.CustomObject(); myCustomObject.put("mykey", "mydata"); } public boolean commit() throws LoginException { try { // Asigna una referencia a una variable final para que se pueda utilizar // en el bloque doPrivileged final com.acme.CustomObject myCustomObjectFinal = myCustomObject; // Evita que las aplicaciones necesiten un permiso getPrivateCredential // de Java. java.security.AccessController.doPrivileged(new java.security. PrivilegedExceptionAction() { public Object run() throws java.lang.Exception { // Procure no añadir un objeto nulo al Subject ni un objeto // que ya exista. if (myCustomObjectFinal != null && !subject.getPrivateCredentials(). contains(myCustomObjectFinal)) { // Esta llamada requiere un permiso especial de seguridad de Java 2, // consulte la documentación de la API (interfaz de programación de aplicaciones) // de JAAS. subject.getPrivateCredentials().add(myCustomObjectFinal); } return null; } }); } catch (java.security.PrivilegedActionException e) { // Envuelve la excepción en WSLoginFailedException java.lang.Throwable myException = e.getException(); throw new WSLoginFailedException (myException.getMessage(), myException); } } // Define las variables del módulo de inicio de sesión com.acme.CustomObject myCustomObject = null; }
- Verifique que la clase Java personalizada implementa la
interfaz java.io.Serializable. Un objeto que se añade al Subject debe estar serializado, si desea
que el objeto se propague. Por ejemplo, el objeto debe implementar la
interfaz java.io.Serializable. Si el objeto no está serializado,
no se produce un error en la solicitud, pero el objeto no se propaga. Para
asegurarse de que los objetos añadidos al Subject se propagan, implemente
una de las interfaces de símbolos definidas en Propagación de atributos de seguridad o
añada los atributos a una de las siguientes implementaciones de señales predeterminadas existentes:
- AuthorizationToken
- Añada los atributos, si son específicos para usuario. Para obtener más información, consulte Utilización de la señal de autorización predeterminada para propagar atributos de seguridad.
- PropagationToken
- Añada los atributos que sean específicos para una invocación. Para obtener más información, consulte Utilización de la señal de propagación predeterminada para propagar atributos de seguridad.
Si tiene cuidado al añadir los objetos personalizados y sigue los pasos para asegurarse de que WebSphere Application Server pueda serializar y deserializar el objeto en todos los saltos, sólo bastará con utilizar objetos Java personalizados.
- Verifique que la clase Java personalizada exista en todos
los sistemas que puedan recibir la solicitud.
Cuando añada un objeto personalizado al sujeto con la intención de que WebSphere Application Server propague dicho objeto, ponga juntas las definiciones de clases en un archivo JAR (Java Archive) y añada el archivo al directorio raíz_servidor_apl/lib/ext/ en todos los nodos en que pueda realizarse la serialización y deserialización. Además, verifique que las versiones de clase Java sean las mismas.
Cuando añada un objeto personalizado al sujeto con la intención de que WebSphere Application Server propague dicho objeto, asegúrese de que la definición de clase del objeto personalizado exista en el directorio raíz_perfil/classes en todos los nodos en que pueda realizarse la serialización y deserialización. Además, verifique que las versiones de clase Java sean las mismas.
- Verifique que el módulo de inicio de sesión personalizado está configurado en todas las configuraciones de inicio de sesión utilizadas en el entorno en que tiene que añadir el objeto personalizado durante un inicio de sesión. Cualquier configuración de inicio de sesión que interactúe con WebSphere Application Server genera un sujeto que puede propagarse hacia fuera para una solicitud EJB (Enterprise JavaBeans). Si desea que WebSphere Application Server propague un objeto personalizado en todos los casos, asegúrese de que el módulo de inicio de sesión personalizado se añada a cada configuración de inicio de sesión utilizada en el entorno. Para obtener más información, consulte Desarrollo de módulos de inicio de sesión personalizados para una configuración de inicio de sesión del sistema para JAAS.
- Verifique que la propagación de atributos de seguridad esté habilitada en todos los servidores en sentido descendente que reciban la información propagada. Cuando se envía una solicitud EJB a un servidor en sentido descendente y la propagación de atributos de seguridad está inhabilitada en dicho servidor, sólo la señal de autenticación se envía para la compatibilidad con versiones anteriores. Por lo tanto, debe revisar la configuración para verificar que la propagación esté habilitada en todas las células que pueden recibir solicitudes. Debe comprobar varios lugares de la consola administrativa para asegurarse de que la propagación está completamente habilitada. Para obtener más información, consulte Propagación de atributos de seguridad entre servidores de aplicaciones.
- Añada cualquier objeto personalizado a la lista de exclusión de
propagación que no desee que se propague. Puede configurar una
propiedad para que excluya la propagación de objetos que coincidan con nombres
de clase y/o nombres de paquetes específicos. Por ejemplo, puede
tener un objeto personalizado que esté relacionado con un proceso
específico. Si el objeto se propaga, no contiene información válida. Debe
indicar a WebSphere Application
Server que no propague este objeto. Siga estos
pasos para especificar el objeto de la lista de exclusión de propagación
mediante la consola administrativa:
- Pulse Seguridad > Seguridad global > Propiedades personalizadas > Nueva.
- Añada com.ibm.ws.security.propagationExcludeList en el campo Nombre.
- Añada el nombre del objeto personalizado en el campo
Valor. Puede añadir una lista de objetos personalizados a la lista de
exclusión de propagación separados por dos puntos (:). Por ejemplo, podría
especificar com.acme.CustomLocalObject:com.acme.private.*.
Puede especificar un nombre de clase, como por ejemplo
com.acme.CustomLocalObject, o bien un nombre de paquete, como por
ejemplo com.acme.private.*. En este ejemplo,
WebSphere
Application Server no propaga ninguna clase que sea igual a
com.acme.CustomLocalObject o empiece por
com.acme.private.
Aunque puede añadir objetos personalizados a la lista de exclusión de propagación, tenga en cuenta los efectos colaterales. WebSphere Application Server almacena la señal opaca o el contenido del sujeto serializado en una memoria caché local para la duración de la señal de inicio de sesión único (SSO). La duración de la señal SSO, que tiene un valor por omisión de dos horas, se configura en las propiedades SSO de la consola administrativa. La información que se añada a la señal opaca sólo incluye los objetos que no aparecen en la lista de exclusión.
Asegúrese de que el valor de tiempo de espera de la señal SSO sea mayor que el valor de tiempo de espera de la memoria caché de autenticación. Para modificar la memoria caché de autenticación, consulte la documentación relacionada con los valores de la memoria caché de autenticación.
Resultados


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_propcustjavaser
File name: tsec_propcustjavaser.html