Programación de la seguridad local

WebSphere eXtreme Scale proporciona varias puntos finales de seguridad que permiten integrar mecanismos personalizados. En el modelo de programación local, la principal función se seguridad es la autorización, que no tiene soporte de autenticación. Debe autenticar fuera de WebSphere Application Server. No obstante, se proporcionan plug-ins con el fin de obtener y validar objetos Subject.

Autenticación

En el modelo de programación local, eXtreme Scale no proporciona ningún mecanismo de autenticación, sino que se basa en el entorno, ya sean servidores de aplicación o aplicaciones, para realizar la autenticación. Cuando se utiliza eXtreme en WebSphere Application Server o WebSphere Extended Deployment, las aplicaciones pueden utilizar el mecanismo de autenticación de seguridad de WebSphere Application Server. Cuando eXtreme Scale se ejecuta en un entorno de Java 2 Platform, Standard Edition (J2SE), la aplicación debe gestionar las autenticaciones con la autenticación JAAS (Java Authentication and Authorization Service) u otro mecanismo de autenticación. Para obtener más información sobre cómo utilizar la autenticación JAAS, consulte la publicación JAAS Reference Guide. El contrato entre una aplicación y una instancia ObjectGrid es el objeto javax.security.auth.Subject. Una vez que el servidor de aplicaciones o la aplicación ha autenticado al cliente, la aplicación puede recuperar el objeto javax.security.auth.Subject autenticado y utilizar este objeto Subject para obtener una sesión de la instancia de ObjectGrid mediante la invocación del método ObjectGrid.getSession(Subject). Este objeto Subject se utiliza para autorizar los accesos a los datos de la correlación. Este contrato se denomina mecanismo de paso de sujetos. El ejemplo siguiente ilustra la API ObjectGrid.getSession(Subject).

/**
 * Esta API permite que la memoria caché utilice un sujeto específico en lugar del
 * configurado en ObjectGrid para obtener una sesión.
 * @param subject
 * @return Una instancia de sesión
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws InvalidSubjectException - el asunto pasado no es válido según
 * el mecanismo SubjectValidation.
 */
public Session getSession(Subject subject)
throws ObjectGridException, TransactionCallbackException, InvalidSubjectException;

El método ObjectGrid.getSession() de la interfaz ObjectGrid también puede utilizarse para obtener un objeto Session:

/**
 * Este método devuelve un objeto Session que puede utilizar una única hebra cada vez.
 * No se puede compartir este objeto Session entre las hebras sin colocar una
 * sección crítica a su alrededor. Mientras que la infraestructura principal
 * permite que el objeto se mueva entre hebras, TransactionCallback y Loader
 * podrían impedir este uso, especialmente en entornos J2EE. Cuando la seguridad está habilitada, este método utiliza el * SubjectSource para obtener un objeto Subject. *
 * Si el método initialize no se ha invocado antes de la primera
 * invocación de getSession, se producirá una inicialización implícita. Esta
 * inicialización garantiza que se completa toda la configuración antes
 * de que se necesite el uso de tiempo de ejecución.
 *
 * @see #initialize()
 * @return Una instancia de sesión
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws IllegalStateException si se llama a este método después de
 *         que se llame al método destroy().
 */
public Session getSession()
throws ObjectGridException, TransactionCallbackException;
Como se especifica en la documentación de la API, al habilitar la seguridad, este método utiliza el plug-in SubjectSource para obtener un objeto Subject. El plug-in SubjectSource es uno de los plug-ins de seguridad definidos en eXtreme Scale para dar soporte a la propagación de objetos Subject. Consulte los plug-ins relacionados con la seguridad para obtener más información. El método getSession(Subject) sólo puede llamarse en la instancia de ObjectGrid local. Si llama al método getSession(Subject) en un cliente en una configuración distribuida de eXtreme Scale, se genera una IllegalStateException.

Plug-ins de seguridad

WebSphere eXtreme Scale proporciona dos plug-ins de seguridad relacionados con el mecanismo de paso de asuntos: los plug-ins SubjectSource y SubjectValidation.

Plug-in SubjectSource

El plug-in SubjectSource, representado por la interfaz com.ibm.websphere.objectgrid.security.plugins.SubjectSource, es un plug-in que se utiliza para obtener un objeto Subject de un entorno de ejecución de eXtreme Scale. Este entorno puede ser una aplicación que utiliza el ObjectGrid o un servidor de aplicaciones que contiene la aplicación. Este plug-in SubjectSource es una alternativa al mecanismo de paso de sujetos. Si utiliza el mecanismo de paso de sujetos, la aplicación recupera el objeto Subject y lo utiliza para obtener el objeto de sesión ObjectGrid. Con el plug-in SubjectSource, la ejecución de eXtreme Scale recupera el objeto Subject y lo utiliza para obtener el objeto de sesión. El mecanismo de paso de sujetos otorga el control de objetos Subject a las aplicaciones, mientras que con el mecanismo de plug-in SubjectSource las aplicaciones no tienen que recuperar el objeto Subject. Puede utilizar el plug-in SubjectSource para obtener un objeto Subject que represente un cliente eXtreme Scale que se utilice para la autorización. Cuando se llama al método ObjectGrid.getSession, el Subject getSubject lanza una ObjectGridSecurityException si la seguridad está habilitada. WebSphere eXtreme Scale proporciona una implementación predeterminada de este plug-in: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectSourceImpl. Esta implementación se puede utilizar para recuperar un asunto llamante o un asunto RunAs de la hebra cuando una aplicación se ejecuta en WebSphere Application Server. Puede configurar esta clase en el archivo XML de descriptor de ObjectGrid como la clase de implementación de SubjectSource al utilizar eXtreme Scale en WebSphere Application Server. El fragmento de código siguiente muestra el flujo principal del método WSSubjectSourceImpl.getSubject.

Subject s = null;
try {
  if (finalType == RUN_AS_SUBJECT) {
    // obtener el sujeto RunAs
    s = com.ibm.websphere.security.auth.WSSubject.getRunAsSubject();
  }
  else if (finalType == CALLER_SUBJECT) {
    // obtener callersubject
    s = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
  }
}
catch (WSSecurityException wse) {
  throw new ObjectGridSecurityException(wse);
}

return s;
Si desea obtener más detalles, consulte la documentación de la API del plug-in SubjectSource y la implementación WSSubjectSourceImpl.

Plug-in SubjectValidation

El plug-in SubjectValidation, que está representado por la interfaz com.ibm.websphere.objectgrid.security.plugins.SubjectValidation, es otro plug-in de seguridad. El plug-in SubjectValidation puede utilizarse para validar que un objeto javax.security.auth.Subject, pasado a ObjectGrid o recuperado mediante el plug-in SubjectSource, es un Subject válido que no se ha manipulado de forma indebida.

El método SubjectValidation.validateSubject(Subject) de la interfaz SubjectValidation toma un objeto Subject y devuelve un objeto Subject. El que un objeto Subject se considere válido y qué objeto Subject se va a devolver dependerá de las implementaciones. Si el objeto Subject no es válido, se genera una InvalidSubjectException.

Puede utilizar este plug-in si no confía en el objeto Subject pasado a este método. Esto no es habitual si se tiene en cuenta que el usuario suele confiar en los desarrolladores de las aplicaciones que desarrollan el código que recupera el objeto Subject.

Una implementación de este plug-in necesita el soporte del creador del objeto Subject porque sólo el creador sabe si el objeto Subject ha sido manipulado indebidamente. Puede darse el caso, no obstante, de que el creador no sepa si el objeto Subject se ha manipulado de forma indebida. En un caso así, este plug-in no resulta de utilidad.

WebSphere eXtreme Scale proporciona una implementación predeterminada de SubjectValidation: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectValidationImpl. Puede utilizar esta implementación para validar el asunto autenticado por WebSphere Application Server. Puede configurar esta clase como la clase de implementación de SubjectValidation cuando se utiliza eXtreme Scale en WebSphere Application Server. La implementación WSSubjectValidationImpl considera válido un objeto Subject sólo si la señal de credencial asociada con este objeto Subject no se ha manipulado de forma indebida. Puede modificar otras partes del objeto Subject. La implementación de WSSubjectValidationImpl solicita a WebSphere Application Server el Subject original correspondiente a la señal de credencial y devuelve el objeto Subject original como el objeto Subject validado. Por lo tanto, los cambios realizados en el contenido de Subject que no sea la señal de credencial, no tiene ningún efecto. El fragmento de código siguiente muestra el flujo básico de WSSubjectValidationImpl.validateSubject(Subject).

//
Crear un LoginContext con WSLogin de esquema y
// pasar un manejador de devolución de llamada.
LoginContext lc = new LoginContext("WSLogin",
new WSCredTokenCallbackHandlerImpl(subject));

// Cuando se llama a este método, los métodos del manejador de devolución de llamada
// se llamarán para iniciar la sesión de usuario.
lc.login();

// Obtener el objeto Subject de LoginContext
return lc.getSubject();
En el fragmento de código anterior, se crea un objeto de manejador de devolución de llamada de la señal de credencial, WSCredTokenCallbackHandlerImpl, con el objeto Subject para validar. Después, se crea un objeto LoginContext con el esquema de inicio de sesión WSLogin. Cuando se llama al método lc.login, la seguridad de WebSphere Application Server recupera la señal de credencial del objeto Subject y, a continuación, devuelve el Subject correspondiente como el objeto Subject validado.

Para ver otros detalles, consulte las API Java de la implementación SubjectValidation y WSSubjectValidationImpl.

Configuración de plug-in

Puede configurar el plug-in SubjectValidation y el plug-in SubjectSource de dos maneras:

  • Configuración del XML Puede utilizar el archivo XML ObjectGrid para definir un ObjectGrid y establecer estos dos plug-ins. A continuación se muestra un ejemplo en el que la clase WSSubjectSourceImpl se configura como plug-in SubjectSource y la clase WSSubjectValidation se configura como plug-in SubjectValidation.
    <objectGrids>
    	<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
    		authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
            <bean id="SubjectSource"
    className="com.ibm.websphere.objectgrid.security.plugins.builtins.
    	WSSubjectSourceImpl" />
    			 <bean id="SubjectValidation"
     className="com.ibm.websphere.objectgrid.security.plugins.builtins.
    	WSSubjectValidationImpl" />
    			 <bean id="TransactionCallback"
    className="com.ibm.websphere.samples.objectgrid.
    	HeapTransactionCallback" />
    ...
    </objectGrids>
  • Configuración mediante programa Si desea crear un ObjectGrid mediante API, puede llamar a los métodos siguientes para establecer los plug-ins SubjectSource o SubjectValidation.
    **
    * Establecer el plug-in SubjectValidation para esta instancia de ObjectGrid. Un
    * plug-in SubjectValidation puede utilizarse para validar el objeto Subject
    * pasado como Subject válido. Consulte {@link SubjectValidation}
    * para obtener más información.
    * @param subjectValidation el plug-in SubjectValidation
    */
    void setSubjectValidation(SubjectValidation subjectValidation);
    
    
    /**
    * Establecer el plug-in SubjectSource. Un plug-in SubjectSource puede utilizarse
    * para obtener un objeto Subject del entorno para representar el
    * cliente ObjectGrid.
    *
    * @param source el plug-in SubjectSource
    */
    void setSubjectSource(SubjectSource source);

Escribir código de autenticación JAAS

Puede escribir su propio código de autenticación JAAS (Java Authentication and Authorization Service) para manejar la autenticación. Debe escribir los módulos de inicio de sesión y después configurarlos para el módulo de autenticación.

El módulo de inicio de sesión recibe información sobre un usuario y lo autentica. Esta información puede ser cualquier información que identifique al usuario. Por ejemplo, puede ser un ID de usuario y una contraseña, un certificado de cliente, etc. Después de recibir la información, el módulo de inicio de sesión comprueba que la información representa a un sujeto válido y crea un objeto Subject. Actualmente existen diversas implementaciones de módulos de inicio de sesión.

Una vez que se ha escrito un módulo de inicio de sesión, configure este módulo de inicio de sesión para su uso en el tiempo de ejecución. Debe configurar un módulo de inicio de sesión JAAS. Este módulo de inicio de sesión contiene el módulo de inicio de sesión y su esquema de autenticación. Por ejemplo:
FileLogin
{
    com.acme.auth.FileLoginModule required
};

El esquema de autenticación es FileLogin y el módulo de inicio de sesión es com.acme.auth.FileLoginModule. La señal requerida indica que el módulo FileLoginModule debe validar este inicio de sesión o se producirá una anomalía en todo el esquema.

Puede establecer el archivo de configuración del módulo de inicio de sesión JAAS de uno de los siguientes modos:

  • Establezca el archivo de configuración del módulo de inicio de sesión JAAS en la propiedad login.config.url del archivo java.security, por ejemplo:
    login.config.url.1=file:${java.home}/lib/security/file.login
  • Establezca el archivo de configuración del módulo de inicio de sesión JAAS desde la línea de mandatos utilizando los argumentos de la máquina virtual Java (JVM) -Djava.security.auth.login.config, por ejemplo, -Djava.security.auth.login.config ==$JAVA_HOME/lib/security/file.login
Para obtener más información, consulte Guía de aprendizaje de seguridad de Java SE - Paso 2.Para obtener más información, consulte Guía de aprendizaje de seguridad de Java SE - Paso 2.

Si el código se está ejecutando en WebSphere Application Server, debe configurar el inicio de sesión JAAS en la consola de administración y almacenar esta configuración de inicio de sesión en la configuración del servidor de aplicaciones. Consulte la configuración del inicio de sesión para Java Authentication and Authorization Service si desea más detalles.