Tutorial de Segurança do Java SE - Etapa 5

Após autenticar um cliente, na etapa anterior, você pode fornecer privilégios de segurança através dos mecanismos de autorização do eXtreme Scale.

Antes de Iniciar

Certifique-se de ter concluído o Tutorial de Segurança do Java SE - Etapa 4 antes de continuar com esta tarefa.

Sobre Esta Tarefa

A etapa anterior deste tutorial demonstrou como ativar a autenticação em uma grade do eXtreme Scale. Como resultado, nenhum cliente não autenticado pode se conectar a seu servidor e submeter pedidos para seu sistema. Entretanto, todo cliente autenticado tem a mesma permissão ou privilégios para o servidor, como de leitura, gravação ou exclusão de dados armazenados nos mapas do ObjectGrid. Os clientes também podem emitir qualquer tipo de consulta. Esta seção demonstra como utilizar a autorização do eXtreme Scale para conceder vários privilégios de usuário autenticado.

Semelhante a vários outros sistemas, o eXtreme Scale adota um mecanismo de autorização baseado em permissão. WebSphere eXtreme Scale tem categorias de permissão diferentes que são representadas por diferentes classes de permissão. Este tópico descreve o MapPermission. Para a categoria completa de permissões, consulte o Programação de Autorização de Cliente.

No WebSphere eXtreme Scale, a classe com.ibm.websphere.objectgrid.security.MapPermission representa permissões para os recursos do eXtreme Scale, especificamente os métodos das interfaces ObjectMap ou JavaMap. O WebSphere eXtreme Scale define as seguintes cadeias de permissões para acesso aos métodos de ObjectMap e JavaMap:
  • read: Concede permissão para ler os dados do mapa.
  • write: Concede permissão para atualizar os dados no mapa.
  • insert: Concede permissão para inserir os dados no mapa.
  • remove: Concede permissão para remover os dados do mapa.
  • invalidate: Concede permissão para invalidar os dados do mapa.
  • all: Concede todas as permissões para ler, gravar, inserir, remover e invalidar.

A autorização ocorre quando um cliente chama um método de ObjectMap ou JavaMap. O tempo de execução do eXtreme Scale verifica permissões de mapa diferentes para métodos diferentes. Se as permissões requeridas não forem concedidas ao cliente, isso resultará em um AccessControlException.

Este tutorial demonstra como utilizar a autorização Java Authentication and Authorization Service (JAAS) para conceder acessos do mapa de autorização para diferentes usuários.

Procedimento

  1. Ative a autorização do eXtreme Scale. Para ativar a autorização no ObjectGrid, você precisa configurar o atributo securityEnabled como true para esse ObjectGrid específico no arquivo XML. A ativação da segurança no ObjectGrid significa que você está ativando a autorização. Utilize os seguintes comandos para criar um novo arquivo XML do ObjectGrid com a segurança ativada.
    1. Navegue até o diretório xml.
      cd objectgridRoot/xml
    2. Copie o arquivo SimpleApp.xml no arquivo SecureSimpleApp.xml.
      cp SimpleApp.xml SecureSimpleApp.xml
    3. Abra o arquivo SecureSimpleApp.xml e inclua securityEnabled="true" no nível do ObjectGrid como mostra o seguinte XML:
      <?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. Defina a política de autorização.
    Na seção de autenticação pré-cliente, você criou três usuários no keystore: cashier, manager e administrator. Neste exemplo, o usuário "cashier" só tem permissões de leitura a todos os mapas, e o usuário "manager" tem todas as permissões. A autorização JAAS é usada neste exemplo. A autorização JAAS utiliza o arquivo de políticas de autorização para conceder permissões aos principals. O arquivo a seguir og_auth.policy é definido no diretório de segurança:
    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:
    • A codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" é uma URL reservada especialmente para ObjectGrid. Todas as permissões do ObjectGrid concedidas a principals devem utilizar esse código base especial.
    • A primeira instrução de concessão concede permissão de mapa "read" ao principal "CN=cashier,O=acme,OU=OGSample", de modo que cashier tenha apenas permissão de leitura ao mapa para todos os mapas na contabilidade do ObjectGrid.
    • A segunda instrução de concessão concede permissão de mapa "all" ao principal "CN=manager,O=acme,OU=OGSample", de modo que manager tenha todas as permissões para os mapas na contabilidade do ObjectGrid.
    Agora você pode ativar um servidor com uma política de autorização. O arquivo de política de autorização JAAS pode ser configurado com o uso da propriedade -D padrão: -Djava.security.auth.policy=../security/og_auth.policy
  3. Execute o aplicativo.

    Depois de criar os arquivos acima, será possível executar o aplicativo.

    Utilize os seguintes comandos para iniciar o servidor de catálogos. Para obter mais informações sobre como iniciar o serviço de catálogo, consulte o Iniciando um Serviço de Catálogo Independente.

    1. Navegue até o diretório bin: cd objectgridRoot/bin
    2. Inicie o servidor de catálogos.
      • [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"

      Os arquivos security.xml e server.properties foram criados na etapa anterior deste tutorial.

    3. É possível iniciar um servidor de contêiner seguro utilizando o seguinte script. Execute o seguinte script a partir do diretório 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"
    Observe as seguintes diferenças do comando para iniciar o servidor de contêiner anterior:
    • Utilize o arquivo SecureSimpleApp.xml em vez de o arquivo SimpleApp.xml.
    • Inclua outro argumento -Djava.security.auth.policy para configurar o arquivo de política de autorização JAAS para o processo do servidor de contêiner.
    Utilize o mesmo comando da etapa anterior do tutorial:
    1. Navegue até o diretório 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 o usuário "manager" possui todas as permissões para mapas no ObjectGrid de contabilidade, o aplicativo é executado apropriadamente.

      Agora, em vez de utilizar o usuário "manager", utilize o usuário "cashier" para ativar o aplicativo cliente.

    3. Navegue até o diretório bin.
    4. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties cashier cashier1

    Resulta na seguinte exceção:

    Exception in thread "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 more
    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)
            em 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 more

    Essa exceção ocorre porque o usuário "cashier" não tem permissão de gravação, portanto, ele não pode atualizar o cliente do mapa.

    Agora, o seu sistema suporta autorização. É possível definir políticas de autorização para conceder diferentes permissões a diferentes usuários. Para obter mais informações sobre autorização, consulte Autorização do Aplicativo Cliente.

O que Fazer Depois

Conclua a próxima etapa do tutorial. Consulte Tutorial de Segurança do Java SE - Etapa 6.