Guía de aprendizaje de seguridad de Java SE - Paso 5

Tras autenticar un cliente, como en el paso anterior, puede proporcionar privilegios de seguridad a través de mecanismos de autorización de eXtreme Scale.

Antes de empezar

Asegúrese de haber completado el apartado Guía de aprendizaje de seguridad de Java SE - Paso 4 antes de llevar a cabo esta tarea.

Acerca de esta tarea

El paso anterior de esta guía de aprendizaje ha demostrado cómo habilitar la autenticación en una cuadrícula de eXtreme Scale. Como resultado, un cliente no autenticado se puede conectar al servidor y enviar solicitudes al sistema. No obstante, cada cliente autenticado tiene el mismo permiso o privilegios que el servidor, como por ejemplo, la lectura, la grabación o la supresión de datos que se almacenan en las correlaciones de ObjectGrid. Los clientes también pueden emitir cualquier tipo de consulta. Esta sección demuestra cómo utilizar la autorización de eXtreme Scale para otorgar distintos privilegios variables de usuarios autenticados.

De forma parecida a muchos otros sistemas, eXtreme Scale adopta un mecanismo de autorización basado en permisos. WebSphere eXtreme Scale tiene distintas categorías de permisos representadas por diferentes clases de permisos. Este tema muestra MapPermission. Para ver la categoría completa de permisos, consulte Programación de autorización de cliente.

En WebSphere eXtreme Scale, la clase com.ibm.websphere.objectgrid.security.MapPermission representa permisos para los recursos de eXtreme Scale, en particular los métodos de las interfaces ObjectMap o JavaMap. WebSphere eXtreme Scale define las siguientes series de permiso para acceder a los métodos de ObjectMap y JavaMap:
  • leer: otorga permiso para leer los datos de la correlación.
  • grabar: otorga permiso para actualizar los datos de la correlación.
  • insertar: otorga permiso para insertar los datos en la correlación.
  • eliminar: otorga permiso para eliminar los datos de la correlación.
  • invalidar: otorga permiso para invalidar los datos de la correlación.
  • todos: otorga todos los permisos anteriores: leer, grabar, insertar, eliminar e invalidar.

La autorización tiene lugar cuando un cliente llama a un método de ObjectMap o JavaMap. El tiempo de ejecución de eXtreme Scale comprueba los distintos permisos de correlación para los métodos diferentes. Si los permisos requeridos no se conceden al cliente, se produce una excepción AccessControlException.

Esta guía de aprendizaje muestra cómo utilizar la autorización Java Authentication and Authorization Service (JAAS) para otorgar accesos a correlaciones de autorizaciones para usuarios distintos.

Procedimiento

  1. Habilitación de la autorización de eXtreme Scale
    Para habilitar la autorización en ObjectGrid, debe establecer true como valor del atributo securityEnabled para ese ObjectGrid determinado en el archivo XML. La habilitación de la seguridad en el ObjectGrid significa que se habilita la autorización. Utilice los siguientes mandatos para crear un nuevo archivo XML de ObjectGrid con la seguridad habilitada.
    1. Vaya al directorio xml.
      cd objectgridRoot/xml
    2. Copie el archivo SimpleApp.xml en el archivo SecureSimpleApp.xml.
      cp SimpleApp.xml SecureSimpleApp.xml
    3. Abra el archivo SecureSimpleApp.xml y añada securityEnabled="true" en el nivel de ObjectGrid tal como se muestra en el XML siguiente:
      <?xml version="1.0" encoding="UTF-8"?>
      <objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
          xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
      		xmlns="http://ibm.com/ws/objectgrid/config">
          <objectGrids>
              <objectGrid name="accounting" securityEnabled="true">
                  <backingMap name="customer" readOnly="false" copyKey="true"/>
              </objectGrid>
          </objectGrids>
      </objectGridConfig>
  2. Definición de la política de autorización.
    En la sección de autenticación previa al cliente, ha creado tres usuarios en el almacén de claves: cashier, manager y administrator. En este ejemplo, el usuario "cashier" sólo tiene permisos de lectura para todas las correlaciones y que el usuario "manager" tiene todos los permisos. La autorización JAAS se utiliza en este ejemplo. La autorización JAAS utiliza el archivo de política de autorización para otorgar permisos a principales. El siguiente archivo og_auth.policy se define en el directorio de seguridad:
    og_auth.policy
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
        principal javax.security.auth.x500.X500Principal "CN=cashier,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "read ";
    };
    
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
        principal javax.security.auth.x500.X500Principal "CN=manager,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "all";
    };
    Nota:
    • El código base codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" es un URL especialmente reservado para ObjectGrid. Todos los permisos de ObjectGrid otorgados a principales deben utilizar esta base de código especial.
    • La primera sentencia grant otorga permiso de correlación de "lectura" al principal "CN=cashier,O=acme,OU=OGSample", de modo que el usuario cashier sólo tiene permiso de lectura de correlación para todas las correlaciones en el ObjectGrid accounting.
    • La segunda sentencia grant otorga "todos" los permisos de correlación al principal "CN=manager,O=acme,OU=OGSample", de modo que el usuario manager tiene todos los permisos para las correlaciones en el ObjectGrid accounting.
    Ahora puede iniciar un servidor con una política de autorización. El archivo de política de autorización JAAS se puede establecer utilizando la propiedad -D estándar: -Djava.security.auth.policy=../security/og_auth.policy
  3. Ejecute la aplicación.

    Después de crear los archivos anteriores, puede ejecutar la aplicación.

    Utilice los siguientes mandatos para iniciar el servidor de catálogo. Para obtener más información sobre cómo iniciar el servicio de catálogo, consulte Inicio de un servicio de catálogo autónomo.

    1. Vaya al directorio bin: cd objectgridRoot/bin
    2. Inicie el servidor de catálogo.
      • [Unix][Linux] startOgServer.sh catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"
      • [Windows] startOgServer.bat catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"

      Los archivos security.xml y server.properties se crearon en el paso anterior de esta guía de aprendizaje.

      T

    3. Entonces puede iniciar un servidor de contenedor seguro utilizando el script siguiente. Ejecute el script siguiente desde el directorio bin:
      • [Unix][Linux] # startOgServer.sh c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
      • [Windows] startOgServer.bat c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
    Tenga en cuenta las siguientes diferencias del mandato de inicio de servidor de contenedor anterior:
    • Utilice el archivo SecureSimpleApp.xml en lugar del archivo SimpleApp.xml.
    • Añada otro argumento -Djava.security.auth.policy para establecer el archivo de política de autorización de JAAS para el proceso de servidor de contenedor.
    Utilice el mismo mandato que en el paso anterior de la guía de aprendizaje:
    1. Desplácese al directorio bin.
    2. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.websphere.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties manager manager1

      Como el usuario "manager" tiene todos los permisos para las correlaciones del accounting ObjectGrid, la aplicación se ejecuta correctamente.

      Ahora, en lugar de utilizar el usuario "manager", utilice el usuario "cashier" para iniciar la aplicación cliente.

    3. Desplácese al directorio bin.
    4. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties cashier cashier1

    Se genera la siguiente excepción:

    Excepción en la hebra "P=387313:O=0:CT" com.ibm.websphere.objectgrid.TransactionException:
    rolling back transaction, see caused by exception
    at com.ibm.ws.objectgrid.SessionImpl.rollbackPMapChanges(SessionImpl.java:1422)
     at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1149)
     at com.ibm.ws.objectgrid.SessionImpl.mapPostInvoke(SessionImpl.java:2260)
     at com.ibm.ws.objectgrid.ObjectMapImpl.update(ObjectMapImpl.java:1062)
     at com.ibm.ws.objectgrid.security.sample.guide.SimpleApp.run(SimpleApp.java:42)
    at com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp.main(SecureSimpleApp.java:27)
    Caused by: com.ibm.websphere.objectgrid.ClientServerTransactionCallbackException: 
       Client Services - received exception from remote server:
         com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, 
    			see caused by Throwable
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteResponse(
                RemoteTransactionCallbackImpl.java:1399)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteRequestAndResponse(
                RemoteTransactionCallbackImpl.java:2333)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.commit(RemoteTransactionCallbackImpl.java:557)
            at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1079)
            ... 4 más
    Caused by: com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, see caused by Throwable
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1133)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processReadWriteTransactionRequest
    					(ServerCoreEventProcessor.java:910)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processClientServerRequest(ServerCoreEventProcessor.java:1285)
    
            at com.ibm.ws.objectgrid.ShardImpl.processMessage(ShardImpl.java:515)
            at com.ibm.ws.objectgrid.partition.IDLShardPOA._invoke(IDLShardPOA.java:154)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatchToServant(POAServerDelegate.java:396)
            at com.ibm.CORBA.poa.POAServerDelegate.internalDispatch(POAServerDelegate.java:331)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatch(POAServerDelegate.java:253)
            at com.ibm.rmi.iiop.ORB.process(ORB.java:503)
            at com.ibm.CORBA.iiop.ORB.process(ORB.java:1553)
            at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2680)
            at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2554)
            at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:62)
            at com.ibm.rmi.iiop.WorkerThread.run(ThreadPoolImpl.java:202)
            at java.lang.Thread.run(Thread.java:803)
    Caused by: java.security.AccessControlException: Access denied (
       com.ibm.websphere.objectgrid.security.MapPermission accounting.customer write)
            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:155)
            at com.ibm.ws.objectgrid.security.MapPermissionCheckAction.run(MapPermissionCheckAction.java:141)
            at java.security.AccessController.doPrivileged(AccessController.java:275)
            at javax.security.auth.Subject.doAsPrivileged(Subject.java:727)
            at com.ibm.ws.objectgrid.security.MapAuthorizer$1.run(MapAuthorizer.java:76)
            at java.security.AccessController.doPrivileged(AccessController.java:242)
            at com.ibm.ws.objectgrid.security.MapAuthorizer.check(MapAuthorizer.java:66)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.checkMapAuthorization(SecuredObjectMapImpl.java:429)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.update(SecuredObjectMapImpl.java:490)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1913)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1805)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1011)
            ... 14 más

    Esta excepción se produce porque el usuario "cashier" no tiene permiso de grabación, y por ello no puede actualizar el cliente de correlación.

    Ahora el sistema da soporte a la autorización. Puede definir políticas de autorización para otorgar distintos permisos a usuarios diferentes. Para obtener información sobre la autorización, consulte Autorización de cliente de aplicaciones.

Qué hacer a continuación

Complete el siguiente paso de la guía de aprendizaje. Consulte Guía de aprendizaje de seguridad de Java SE - Paso 6.