14.5. Java Authentication and Authorization Service (JAAS)

A arquitetura de segurança do JBoss Enterprise Application Plataform 6 é composta de um subsistema de configuração de segurança, configurações de segurança específica do aplicativo que já são incluídas em diversos arquivos de configuração com o aplicativo e o JAAS Security Manager, que é implementado como um MBean.
Configuração Específica do Servidor, Grupo do Servidor e Domain

Os grupos do servidor (num managed domain) e servidores (no servidor autônomo) incluem a configuração para os security domains. O security domain inclui a informação a respeito da combinação da autenticação, autorização, mapeamento e módulos de auditoria com detalhes de configuração. Um aplicativo especifica qual security domain ele requer, pelo nome no próprio jboss-web.xml.

Configuração específica do Aplicativo

A configuração específica do aplicativo assume um ou mais dos seguintes arquivos:

Tabela 14.1. Arquivos de Configuração Específica do Aplicativo

Arquivo Descrição
ejb-jar.xml
O descritor da implantação para o aplicativo Enterprise JavaBean (EJB) localizado no diretório META-INF do EJB. Use o ejb-jar.xml para especificar as funções e as mapeie aos principals no nível do aplicativo. Você pode também limitar os métodos específicos e as classes de certas funções. Isto é também utilizado para outra configuração específica do EJB não relacionada à segurança.
web.xml
O descritor de implantação do aplicativo da web Java Enterprise Edition (EE). Use o web.xml para declarar o security domain que o aplicativo usa para autenticação e autorização, assim como restrições de transporte e recurso para o aplicativo, tais como a limitação dos tipos de solicitações HTTP permitidas. Você pode configurar uma autenticação baseada na web simples neste arquivo. Isto é também usado para outra configuração específica do aplicativo não relacionada com a segurança.
jboss-ejb3.xml
Contém as extensões específicas do JBoss para o descritor ejb-jar.xml.
jboss-web.xml
Contém as extensões específicas do JBoss ao descritor web.xml.

Nota

O ejb-jar.xml e web.xml estão definidos na especificação do Java Enterprise Edition (Java EE). O jboss-ejb3.xml fornece extensões específicas do JBoss para o ejb-jar.xml e o jboss-web.xml fornece extensões específicas do JBoss para o web.xml.
JAAS Security Manager MBean

O Java Authentication and Authorization Service (JAAS) é um framework para segurança à nível do usuário nos aplicativos Java, usando os pluggable authentication modules (PAM - módulos de autenticação plugáveis). Ele está integrado no Java Runtime Environment (JRE). O componente ao lado do contêiner é o org.jboss.security.plugins.JaasSecurityManager MBean no JBoss Enterprise Application Plataform. Ele fornece as implementações padrões das interfaces AuthenticationManagere RealmMapping.

O JaasSecurityManager MBean integra as camadas do web contêiner e EJB baseadas no security domain especificado no EJB e arquivos do descritor de implantação da web no aplicativo. Quando um aplicativo implanta, o contêiner associa o security domain especificado no descritor de implantação com a instância do gerenciador de segurança do contêiner. O gerenciador de segurança reforça a configuração do security domain conforme configurado no grupo de servidor ou servidor autônomo.
Fluxo de Interação entre o Cliente e o Contêiner com o JAAS

O JaasSecurityManager usa os pacotes JAAS para implantar o comportamento da interface do AuthenticationManager e RealmMapping. Na realidade, seu comportamento deriva da execução das instâncias do módulo de login que são configuradas no security domain pelo qual o JaasSecurityManager foi determinado. Os módulos de login implementam a autenticação principal do security domain e comportamento de mapeamento de função. Você pode usar o JaasSecurityManager por todos os security domains pelo plugging em configurações para os domains.

Para ilustrar como o JaasSecurityManager usa o processo de autenticação, siga as etapas seguintes sobre a invocação do cliente do método que implementa o método EJBHome. O EJB já foi implantado no servidor e seus métodos de interface EJBHome foram assegurados usando os elementos <method-permission> no descritor ejb-jar.xml. Ele usa o security domain jwdomain, que é especificado no elemento <security-domain> do arquivo jboss-ejb3.xml. A imagem abaixo apresenta as etapas que serão explicadas mais tarde:
Etapas de autenticação para um EJB

Figura 14.1. Etapas da Invocação do Método EJB com Segurança

  1. O cliente executa o login JAAS para estabelecer o principal e credenciais para autenticação. Isto é o Client Side Login rotulado na figura. Isto pode ser também executado na forma de JNDI.
    Para executar um login JAAS, você cria uma instância de LoginContext e passa o nome de configuração para uso. Neste caso, o nome da configuração é other. Este login associa de uma vez só o principal do login e credenciais com todas as invocações de método EJB subsequente. Este processo não autentica o usuário necessariamente. A natureza do login ao lado do cliente depende da configuração do módulo de login que o cliente usa. Nesta amostra, a entrada da configuração de login ao lado do cliente other usa o módulo de login ClientLoginModule. Este módulo efetua o bind no nome do usuário e senha à camada de invocação EJB para autenticação mais tarde no servidor. A autenticação do cliente não é autenticado no cliente.
  2. O cliente obtém o método EJBHome e o invoca no servidor. A invocação inclui os argumentos do método passados ao cliente, juntamente com a identidade do usuário e credenciais a partir do login JAAS ao lado do cliente.
  3. No lado do servidor, o servidor de segurança autentica o usuário que invocou o método. Isto envolve outro login JAAS.
  4. O security domain na parte inferior determina a escolha dos módulos de login. O nome do security domain é passado ao construtor LoginContext como o nome de entrada da configuração do login. O security domain é jwdomain. Caso a autenticação for bem sucedida, o JAAS Subject é criado. O JAAS subject inclui PrincipalSet, que inclui os seguintes credenciais:
    • A instância java.security.Principal que corresponde à identidade do cliente a partir do ambiente de segurança da implantação.
    • Um java.security.acl.Group chamado Roles que contém os nomes da função do domain do aplicativo do usuário. Os objetos org.jboss.security.SimplePrincipal do tipo representam os nomes da função. Essas funções validam o acesso aos métodos EJB de acordo com as restrições no ejb-jar.xml e implementação do método EJBContext.isCallerInRole(String).
    • O java.security.acl.Group opcional nomeado CallerPrincipal, que contém um org.jboss.security.SimplePrincipal único que corresponde à identidade do chamador do domain do aplicativo. O associado do grupo CallerPrincipal é o valor retornado pelo método EJBContext.getCallerPrincipal(). Este mapeamento permite que o Principal no ambiente de segurança operacional mapeie um Principal conhecido pelo aplicativo. Na ausência do mapeamento CallerPrincipal, o principal operacional é o mesmo do principal do domain do aplicativo.
  5. O servidor verifica que o usuário chamando o método EJB possui permissão. A execução desta autorização envolve as seguintes etapas:
    • Obtém os nomes de funções para acesso do método EJB a partir do contêiner EJB. Os nomes de funções são determinados pelos elementos <role-name> do descritor ejb-jar.xml de todos os elementos <method-permission> contendo o método invocado.
    • Caso nenhuma das funções seja determinada ou o método especificado num elemento de lista exclusivo, o acesso ao método é negado. Do contrário, o método doesUserHaveRole é invocado no gerenciador de segurança pelo interceptor de segurança para verificar se o chamador possui um dos nomes de função determinado. Esse método interage através dos nomes de função e verifica se o grupo Subject Roles do usuário autenticado contém um SimplePrincipal com o nome da função determinado. O acesso é permitido caso o nome da função seja um associado do grupo Funções. O acesso é negado caso nenhum dos nomes de função seja associado.
    • Caso o EJB use um proxy de segurança personalizado, a invocação do método é delegada do proxy. Caso o proxy de segurança negar acesso ao chamador, ele lança um java.lang.SecurityException. Do contrário, o acesso ao método EJB é permitido e a invocação do método passa ao próximo interceptor do contêiner. O SecurityProxyInterceptor manuseia esta checagem e este interceptor não é apresentado.
    • Para as solicitações da conexão, o servidor da web verifica as restrições de segurança definidas no web.xml que combinam com o recurso solicitado e o método HTTP acessado.
      Caso a restrição existir para a solicitação, o servidor da web chama o JaasSecurityManager para executar a autenticação principal, que em troca garante que as funções do usuário são associadas com o objeto principal.