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 de infraestructura para asegurarse de que el objeto Java™ se propaga.
Antes de comenzar
Acerca de esta tarea
Procedimiento
- Añada el objeto Java personalizado en el 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 de Java Authentication and Authorization Service (JAAS). WebSphere® Application Server completa los procesos siguientes 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.
Después de añadir 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 en el 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 se juntan las clases en un archivo JAR (Java Archive) y se añade el archivo al archivoapp_server_root/lib/ext/, el módulo de inicio de sesión tiene 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. Sin embargo, debe modificar elprofile_root/properties/server.policypara asegurarse de que el directorio privado, el archivo JAR (Java Archive) o ambos tienen los permisos necesarios para ejecutar las interfaces de programación de aplicaciones (API) que se invocan 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ñade el módulo de inicio de sesión en elprofile_root/classes, el módulo de inicio de sesión tiene 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 qué hacer durante la inicialización, el inicio de sesión y la confirmació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.public customLoginModule() { public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { } public boolean login() throws LoginException { // Construct callback for the WSTokenHolderCallback so that you // can determine if // your custom object has propagated Callback callbacks[] = new Callback[1]; callbacks[0] = new WSTokenHolderCallback("Authz Token List: "); try { _callbackHandler.handle(callbacks); } catch (Exception e) { throw new LoginException (e.getLocalizedMessage()); } // Checks to see if any information is propagated into this login List authzTokenList = ((WSTokenHolderCallback) callbacks[1]). getTokenHolderList(); if (authzTokenList != null) { for (int i = 0; i< authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Look for your custom object. Make sure you use // "startsWith"because there is some data appended // to the end of the name indicating in which Subject // Set it belongs. Example from getName(): // "com.acme.CustomObject (1)". The class name is // generated at the sending side by calling the // object.getClass().getName() method. If this object // is deserialized by WebSphere Application Server, // then return it and you do not need to add it here. // Otherwise, you can add it in the following code. // Note: If your class appears in this list and does // not use custom serialization (for example, an // implementation of the Token interface described in // the Propagation Token Framework), then WebSphere // Application Server automatically deserializes the // Java object for you. You might just return here if // it is found in the list. if (tokenHolder.getName().startsWith("com.acme.CustomObject")) return true; } } // If you get to this point, then your custom object has not propagated myCustomObject = new com.acme.CustomObject(); myCustomObject.put("mykey", "mydata"); } public boolean commit() throws LoginException { try { // Assigns a reference to a final variable so it can be used in // the doPrivileged block final com.acme.CustomObject myCustomObjectFinal = myCustomObject; // Prevents your applications from needing a JAAS getPrivateCredential // permission. java.security.AccessController.doPrivileged(new java.security. PrivilegedExceptionAction() { public Object run() throws java.lang.Exception { // Try not to add a null object to the Subject or an object // that already exists. if (myCustomObjectFinal != null && !subject.getPrivateCredentials(). contains(myCustomObjectFinal)) { // This call requires a special Java 2 Security permission, // see the JAAS application programming interface (API) // documentation. subject.getPrivateCredentials().add(myCustomObjectFinal); } return null; } }); } catch (java.security.PrivilegedActionException e) { // Wraps the exception in a WSLoginFailedException java.lang.Throwable myException = e.getException(); throw new WSLoginFailedException (myException.getMessage(), myException); } } // Defines your login module variables 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 petición, pero el objeto no se propaga. Para asegurarse de que se propaga un objeto que se añade al sujeto, implemente una de las interfaces de señal definidas en Propagación de atributos de seguridad o añada atributos a una de las siguientes implementaciones de señal 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 objetos personalizados y sigue todos los pasos para asegurarse de que WebSphere Application Server puede serializar y deserializar el objeto en cada salto, es suficiente utilizar sólo objetos Java personalizados.
- Verifique que la clase Java personalizada exista en todos los sistemas que puedan recibir la solicitud.
Al añadir un objeto personalizado al sujeto y esperar que WebSphere Application Server propague el objeto, ponga las definiciones de clase juntas en un archivo JAR (Java Archive) y añada el archivo al archivoapp_server_root/lib/ext/en todos los nodos donde se puede producir la serialización o deserialización. Además, verifique que las versiones de clase Java son las mismas.
Al añadir un objeto personalizado al sujeto y esperar que WebSphere Application Server propague el objeto, asegúrese de que la definición de clase para ese objeto personalizado existe en elprofile_root/classesen todos los nodos donde se puede producir la serialización o deserialización. Además, verifique que las versiones de clase Java son 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 de salida 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 que se utilice 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 petición EJB a un servidor en sentido descendente y la propagación de atributos de seguridad está inhabilitada en dicho servidor, sólo el símbolo 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 peticiones. 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ñadircom.ibm.ws.security.propagationExcludeListen 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, puede especificarcom.acme.CustomLocalObject:com.acme.private.*. Puede especificar un nombre de clase como, por ejemplo,com.acme.CustomLocalObjecto un nombre de paquete como, por ejemplo,com.acme.private.*. En este ejemplo, WebSphere Application Server no propaga ninguna clase que sea igual acom.acme.CustomLocalObjecto empieza porcom.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 durante la vida de la señal de inicio de sesión único (SSO). La duración del símbolo 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 al símbolo opaco 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 señal SSO es mayor que el valor de tiempo de espera de memoria caché de autenticación. Para modificar la memoria caché de autenticación, consulte la documentación acerca de la configuración de la memoria caché de autenticación.