O WebSphere eXtreme Scale suporta a autorização Java Authentication and Authorization Service (JAAS) que está pronta para uso e também suporta a autorização customizada usando a interface ObjectGridAuthorization.
O plug-in ObjectGridAuthorization é usado para autorizar acessos do ObjectGrid, do ObjectMap e do JavaMap aos Principals representados por um objeto Subject de uma maneira customizada. Uma implementação típica deste plug-in é recuperar os Principals do objeto Subject e, em seguida, verificar se as permissões especificadas foram concedidas aos Principals.
Uma permissão passada para o método checkPermission(Subject, Permission) pode ser uma das seguintes permissões:
Consulte a documentação da API do ObjectGridAuthorization para obter detalhes adicionais.
A classe pública com.ibm.websphere.objectgrid.security.MapPermission representa permissões para os recursos ObjectGrid, especificamente os métodos de interfaces theObjectMap ou JavaMap. O WebSphere eXtreme Scale define as seguintes cadeias de permissões para acesso aos métodos de ObjectMap e JavaMap:
Consulte a documentação da API da ServerMapPermission para obter mais detalhes.
É possível construir um objeto MapPermission transmitindo o nome completo do mapa do ObjectGrid (no formato [ObjectGrid_name].[ObjectMap_name]) e a cadeia de permissão ou valor inteiro. Uma cadeia de permissão pode ser uma cadeia delimitada por vírgulas das cadeias de permissão anteriores, tais como read, insert, ou podem ser todas. Um valor de número inteiro de permissão pode ser qualquer constante de número inteiro mencionada anteriormente ou um valor matemático de diversas constantes de permissão de número inteiro, tal como MapPermission.READ|MapPermission.WRITE.
A autorização ocorre quando um método ObjectMap ou JavaMap é chamado. O tempo de execução verifica diferentes permissões para métodos diferentes. Se as permissões requeridas não forem concedidas ao cliente, isso resultará em um AccessControlException.
Permissão | ObjectMap/JavaMap |
---|---|
read | Boolean containsKey(Object) |
Boolean equals(Object) | |
Object get(Object) | |
Object get(Object, Serializable) | |
List getAll(List) | |
List getAll(List keyList, Serializable) | |
List getAllForUpdate(List) | |
List getAllForUpdate(List, Serializable) | |
Object getForUpdate(Object) | |
Object getForUpdate(Object, Serializable) | |
public Object getNextKey(long) | |
write | Object put(Object key, Object value) |
void put(Object, Object, Serializable) | |
void putAll(Map) | |
void putAll(Map, Serializable) | |
void update(Object, Object) | |
void update(Object, Object, Serializable) | |
insert | public void insert (Object, Object) |
void insert(Object, Object, Serializable) | |
remove | Object remove (Object) |
void removeAll(Collection) | |
void clear() | |
invalidate | public void invalidate (Object, Boolean) |
void invalidateAll(Collection, Boolean) | |
void invalidateUsingKeyword(Serializable) | |
int setTimeToLive(int) |
A autorização é baseada exclusivamente em qual método é utilizado, ao invés do que o método realmente faz. Por exemplo, um método put pode inserir ou atualizar um registro, dependendo de existir ou não o registro. Entretanto, os casos de inserir ou atualizar não estão discriminados.
Um tipo de operação pode ser obtido por combinações de outros tipos. Por exemplo, uma atualização pode ser obtida por uma remoção e, em seguida, por uma inserção. Considere essas combinações quando projetar suas políticas de autorização.
A tabela a seguir resume os métodos e ObjectGridPermission necessários:
Ação da permissão | Métodos |
---|---|
consulta | com.ibm.websphere.objectgrid.Session.createObjectQuery(String) |
consulta | com.ibm.websphere.objectgrid.em.EntityManager.createQuery(String) |
dynamicmap | com.ibm.websphere.objectgrid.Session.getMap(String) |
Uma ServerMapPermission representa permissões para um ObjectMap hospedado em um servidor. O nome da permissão é o nome completo do nome do mapa do ObjectGrid. Executar as seguintes ações:
Ação da permissão | Métodos |
---|---|
replicate | com.ibm.websphere.objectgrid.ClientReplicableMap.enableClientReplication(Mode, int[], ReplicationMapListener) |
dynamicIndex | com.ibm.websphere.objectgrid.BackingMap.createDynamicIndex(String, Boolean, String, DynamicIndexCallback) |
dynamicIndex | com.ibm.websphere.objectgrid.BackingMap.removeDynamicIndex(String) |
Uma AgentPermission representa as permissões para os agentes datagrid. O nome da permissão é o nome completo do mapa ObjectGrid, e a ação é uma cadeia limitada por vírgulas de nomes de classe de implementação do agente ou de nomes do pacote.
Consulte a documentação da API AgentPermission para obter informações adicionais.
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
O WebSphere eXtreme Scale suporta dois tipos de mecanismos de autorização: Autorização JAAS (Java Authentication and Authorization Service) e autorização customizada. Esses mecanismos aplicam-se a todas as autorizações. A autorização JAAS muda as políticas de segurança Java com controles de acesso centrados no usuário. As permissões podem ser concedidas com base não apenas em qual código está a execução, mas também em quem a está executando. Autorização JAAS é parte do SDK Versão 5 e posterior.
Além disso, o WebSphere eXtreme Scale também suporta a autorização customizada com o seguinte plug-in:
É possível implementar seu próprio mecanismo de autorização, se não desejar utilizar a autorização JAAS. Usando um mecanismo de autorização customizado é possível usar o banco de dados de políticas, servidor de políticas ou Tivoli Access Manager para gerenciar as autorizações.
É possível configurar o mecanismo de autorização de duas maneiras:
1. Configuração XML: É possível utilizar o arquivo XML do ObjectGrid para definir um ObjectGrid e configurar o mecanismo de autorização como AUTHORIZATION_MECHANISM_JAAS ou AUTHORIZATION_MECHANISM_CUSTOM. A seguir está o arquivo secure-objectgrid-definition.xml que é utilizado no ObjectGridSample do aplicativo corporativo:
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
<bean id="TransactionCallback"
classname="com.ibm.websphere.samples.objectgrid.HeapTransactionCallback" />
...
</objectGrids>
2. Configuração Programática: Se desejar criar um ObjectGrid utilizando o método ObjectGrid.setAuthorizationMechanism(int), é possível chamar o seguinte método para configurar o mecanismo de autorização. A chamada deste método aplica-se somente ao modelo de programação local do WebSphere eXtreme Scale quando você instancia diretamente a instância do ObjectGrid:
/**
* Set the authorization Mechanism. The default is
* com.ibm.websphere.objectgrid.security.SecurityConstants.
* AUTHORIZATION_MECHANISM_JAAS.
* @param authMechanism the map authorization mechanism
*/
void setAuthorizationMechanism(int authMechanism);
Autorização JAAS
Um objeto javax.security.auth.Subject representa um usuário autenticado. Um Subject consiste em um conjunto de principals e cada Principal representa uma identidade para esse usuário. Por exemplo, um Subject pode ter um nome principal, por exemplo, Joe Smith, e um grupo principal, por exemplo, gerente.
Utilizando a política de autorização JAAS, as permissões podem ser concedidas a Principals específicos. O WebSphere eXtreme Scale associa o Subject ao contexto de controle de acesso atual. Para cada chamada para o método ObjectMap ou Javamap, o tempo de execução do Java automaticamente determina se a política concede a permissão necessária somente a um Principal específico e se for, a operação será permitida somente se o Subject associado ao contexto do controle de acesso contiver o Principal designado.
É necessário estar familiarizado com a sintaxe de política do arquivo de políticas. Para obter uma descrição detalhada da autorização do JAAS, consulte o Guia de Referência do JAAS.
O WebSphere eXtreme Scale possui uma base de código especial que é usada para verificação da autorização JAAS para as chamadas de método ObjectMap e JavaMap. Esta base de código especial é http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction. Utilize esta base de código ao conceder as permissões ObjectMap ou JavaMap a proprietários. Este código especial foi criado porque o arquivo JAR (Java Archive) para eXtreme Scale é concedido com todas as permissões.
O modelo da política para conceder a permissão MapPermission é:
grant codeBase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
<Principal field(s)>{
permission com.ibm.websphere.objectgrid.security.MapPermission
"[ObjectGrid_name].[ObjectMap_name]", "action";
....
permission com.ibm.websphere.objectgrid.security.MapPermission
"[ObjectGrid_name].[ObjectMap_name]", "action";
};
Um campo de Principal é semelhante ao seguinte exemplo: principal
Principal_class "principal_name"
Nesta política, somente as permissões de inserção e leitura são concedidas a esses quatro mapas para um determinado principal. O outro arquivo de políticas, fullAccessAuth.policy, concede todas as permissões para estes mapas a um principal. Antes de executar o aplicativo, altere o principal_name e a classe do proprietário para os valores apropriados. O valor de principal_name depende do registro do usuário. Por exemplo, se o S.O. local for usado como registro do usuário, o nome da máquina será MACH1, o ID do usuário será user1 e o principal_name será MACH1/user1.
A política de autorização JAAS pode ser colocada diretamente no arquivo de políticas Java, ou pode ser colocada em um arquivo de autorização JAAS separado e, em seguida, configurado usando
-Djava.security.auth.policy=file:[JAAS_AUTH_POLICY_FILE]
-Dauth.policy.url.x=file:[JAAS_AUTH_POLICY_FILE]
Autorização de ObjectGrid Customizada
O plug-in ObjectGridAuthorization é usado para autorizar acessos ObjectGrid, ObjectMap e JavaMap para Principals representados por um objeto Subject de modo customizado. Uma implementação típica desse plug-in é recuperar os Principals do objeto Subject, e então verificar se as permissões especificadas estão concedidas ou não aos Principals.
Uma permissão passada para o método checkPermission(Subject, Permission) poderia ser uma das seguintes:
Consulte a documentação da API do ObjectGridAuthorization para obter mais detalhes.
O plug-in ObjectGridAuthorization pode ser configurado da seguinte forma:
É possível usar o arquivo XML do ObjectGrid para definir um plug-in de ObjectAuthorization. Veja um exemplo a seguir:
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_CUSTOM">
...
<bean id="ObjectGridAuthorization"
className="com.acme.ObjectGridAuthorizationImpl" />
</objectGrids>
Se você quiser criar um ObjectGrid usando o método de API ObjectGrid.setObjectGridAuthorization(ObjectGridAuthorization), pode chamar o seguinte método para configurar o plug-in de autorização. Este método aplica-se somente ao modelo de programação local do eXtreme Scale quando você instancia diretamente a instância do ObjectGrid.
/**
* Sets the <code>ObjectGridAuthorization</code> for this ObjectGrid instance.
* <p>
* Passing <code>null</code> to this method removes a previously set
* <code>ObjectGridAuthorization</code> object from an earlier invocation of this method
* and indicates that this <code>ObjectGrid</code> is not associated with a
* <code>ObjectGridAuthorization</code> object.
* <p>
* This method should only be used when ObjectGrid security is enabled. Se
* the ObjectGrid security is disabled, the provided <code>ObjectGridAuthorization</code> object
* will not be used.
* <p>
* A <code>ObjectGridAuthorization</code> plugin can be used to authorize
* access to the ObjectGrid and maps. Please refer to <code>ObjectGridAuthorization</code> for more details.
*
* <p>
* As of XD 6.1, the <code>setMapAuthorization</code> is deprecated and
* <code>setObjectGridAuthorization</code> is recommended for use. However,
* if both <code>MapAuthorization</code> plugin and <code>ObjectGridAuthorization</code> plugin
* are used, ObjectGrid will use the provided <code>MapAuthorization</code> to authorize map accesses,
* even though it is deprecated.
* <p>
* Note, to avoid an <code>IllegalStateException</code>, this method must be
* called prior to the <code>initialize()</code> method. Also, keep in mind
* that the <code>getSession</code> methods implicitly call the
* <code>initialize()</code> method if it has yet to be called by the
* application.
*
* @param ogAuthorization the <code>ObjectGridAuthorization</code> plugin
*
* @throws IllegalStateException if this method is called after the
* <code>initialize()</code> method is called.
*
* @see #initialize()
* @see ObjectGridAuthorization
* @since WAS XD 6.1
*/
void setObjectGridAuthorization(ObjectGridAuthorization ogAuthorization);
O método Boolean checkPermission(Subject subject, Permission permission) da interface ObjectGridAuthorization é chamado pelo tempo de execução do WebSphere eXtreme Scale para verificar se o objeto subject transmitido possui a permissão de passagem. A implementação da interface ObjectGridAuthorization retorna true se o objeto possui a permissão e false se não possui.
Uma implementação típica deste plug-in é recuperar os proprietários do objeto Subject e verificar se as permissões especificadas serão concedidas aos proprietários consultando políticas específicas. Estas políticas são definidas por usuários. Por exemplo, as políticas podem ser definidas em um banco de dados, um arquivo simples ou em um servidor de políticas Tivoli Access Manager.
Por exemplo, podemos usar o servidor de políticas Tivoli Access Manager para gerenciar a política de autorização e usar sua API para autorizar o acesso. Para saber como usar as APIs do Tivoli Access Manager Authorization, consulte o IBM® Tivoli Access Manager Authorization Java Classes Developer Reference para obter detalhes adicionais.
Esta implementação da amostra faz as seguintes suposições:
O fragmento de código a seguir demonstra como implementar o método checkPermission:
/**
* @see com.ibm.websphere.objectgrid.security.plugins.
* MapAuthorization#checkPermission
* (javax.security.auth.Subject, com.ibm.websphere.objectgrid.security.
* MapPermission)
*/
public boolean checkPermission(final Subject subject,
Permission p) {
// For non-MapPermission, we always authorize.
if (!(p instanceof MapPermission)){
return true;
}
MapPermission permission = (MapPermission) p;
String[] str = permission.getParsedNames();
StringBuffer pdPermissionStr = new StringBuffer(5);
for (int i=0; i<str.length; i++) {
pdPermissionStr.append(str[i].substring(0,1));
}
PDPermission pdPerm = new PDPermission(permission.getName(),
pdPermissionStr.toString());
Set principals = subject.getPrincipals();
Iterator iter= principals.iterator();
while(iter.hasNext()) {
try {
PDPrincipal principal = (PDPrincipal) iter.next();
if (principal.implies(pdPerm)) {
return true;
}
}
catch (ClassCastException cce) {
// Handle exception
}
}
return false;
}