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.
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.
- 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.
- Navegue até o diretório xml.
cd objectgridRoot/xml
- Copie o arquivo SimpleApp.xml no arquivo
SecureSimpleApp.xml.
cp SimpleApp.xml SecureSimpleApp.xml
- 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>
- 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
- 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.
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:
- Navegue até o diretório bin.
- 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.
- Navegue até o diretório bin.
- 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.