Guia de Segurança
para uso com a Plataforma do Aplicativo JBoss Enterprise 5
Edição 5.1.0
Resumo
Parte I. Visão Geral da Segurança Copiar o linkLink copiado para a área de transferência!
Nota
Capítulo 1. Visão Geral de Proteção Declarativa do Java EE Copiar o linkLink copiado para a área de transferência!
ejb-jar.xml e web.xml. As seguintes seções descrevem o propósito e uso de vários elementos de segurança.
1.1. Referências de Segurança Copiar o linkLink copiado para a área de transferência!
Figura 1.1. O elemento <security-role-ref>
role-nameType do elemento <role-name> como um argumento ao método isCallerInRole(String). Um componente pode verificar se o chamador está na função declarada pelo elemento <role-name> ou <security-role-ref>. O valor do elemento <role-name> deve conectar-se ao elemento através do elemento <role-link>. O uso típico do isCallerInRole é executar uma checagem de segurança que não pode ser definida pelo uso dos elementos <method-permissions> baseados na função.
ejb-jar.xml.
Exemplo 1.1. fragmento do descritor ejb-jar.xml
web.xml.
Nota
Exemplo 1.2. fragmento do descritor web.xml
1.2. Identidade de Segurança Copiar o linkLink copiado para a área de transferência!
Figura 1.2. O elemento de identidade de segurança
EJBContext.getCallerPrincipal(). Ao invés disto, as funções de segurança do chamador são configuradas à função única especificada pelo valor do elemento <run-as> ou <role-name>.
anonymous é determinado a todas as chamadas de saída. Caso você deseje que outro principal seja associado com a chamada, você deverá associar um <run-as-principal> com o bean no arquivo jboss.xml. O seguinte fragmento associa um principal nomeado internal com o RunAsBean com a amostra anterior.
web.xml. A amostra seguinte apresenta como determinar o InternalRole de função a um servlet:
principal anônimo. O elemento está disponível no arquivo jboss-web.xml para determinar um principal específico juntamente com a função run-as. O seguinte fragmento apresenta como associar um principal nomeado internal ao servlet acima.
<servlet>
<servlet-name>AServlet</servlet-name>
<run-as-principal>internal</run-as-principal>
</servlet>
<servlet>
<servlet-name>AServlet</servlet-name>
<run-as-principal>internal</run-as-principal>
</servlet>
1.3. Funções de Segurança Copiar o linkLink copiado para a área de transferência!
Figura 1.3. elemento <security-role>
ejb-jar.xml.
Exemplo 1.3. fragmento do descritor ejb-jar.xm
web.xml.
Exemplo 1.4. amostra do fragmento do descritor web.xml
1.4. Permissões do método EJB Copiar o linkLink copiado para a área de transferência!
Figura 1.4. O elemento <method-permission>
exclude-list.
Figura 1.5. elemento <method>
<method>
<ejb-name>EJBNAME</ejb-name>
<method-name>*</method-name>
</method>
<method>
<ejb-name>EJBNAME</ejb-name>
<method-name>*</method-name>
</method>
<method>
<ejb-name>EJBNAME</ejb-name>
<method-name>METHOD</method-name>
</method>
<method>
<ejb-name>EJBNAME</ejb-name>
<method-name>METHOD</method-name>
</method>
Exemplo 1.5. uso do elemento <method-permission>
1.5. Anotações de Segurança do Enterprise Bean Copiar o linkLink copiado para a área de transferência!
- @DeclareRoles
- Declara cada função de segurança no código. Por favor, refira-se ao Java EE 5 Tutorial Declaring Security Roles Using Annotations para maiores informações sobre a configuração das funções.
- @RolesAllowed, @PermitAll, and @DenyAll
- Especifica as permissões do método para anotações. Refira-se ao Java EE 5 Tutorial Specifying Method Permissions Using Annotations para maiores informações sobre a configuração das permissões do método de anotação.
- @RunAs
- Configura a identidade de segurança propagada de um componente. Por favor, refira-se ao Java EE 5 Tutorial Configuring a Component’s Propagated Security Identity para maiores informações sobre a configuração das identidades usando a segurança propagada.
1.6. Restrições de Segurança do Conteúdo da Web Copiar o linkLink copiado para a área de transferência!
web.xml security-constraint.
Figura 1.6. elemento <security-constraint>
NONE, INTEGRAL e CONFIDENTIAL. O valor NONE significa que o aplicativo não requer quaisquer garantias de transporte. O valor INTEGRAL significa que o aplicativo requer que os dados sejam enviados entre o cliente e o servidor a ser enviado de tal maneira, sendo que eles não possam ser alterados em trânsito. O valor CONFIDENTIAL significa que o aplicativo requer que os dados sejam transmitidos de maneira que previnam outras entidades de observar os conteúdos de transmissão. Na maioria dos casos, a presença do aviso INTEGRAL ou CONFIDENTIAL indica que o uso do SSL é requerido.
Figura 1.7. elemento <login-config>
BASIC, DIGEST, FORM e CLIENT-CERT. O elemento filho <realm-name> especifica o nome realm para uso no HTTP básico e autorização de resumo. O elemento filho <form-login-config> especifica o logon assim como as páginas de erro que devem ser usadas no logon baseado no formulário. O form-login-config e seus elementos filhos são ignorados, caso o valor <auth-method> não seja FORM.
/restricted do aplicativo da web requer uma função AuthorizedUser. Não existe garantia de transporte solicitada e método de autenticação usado para obtenção da identidade do usuário de autenticação HTTP BÁSICA.
1.7. Ativação da Autenticação baseada no Formulário Copiar o linkLink copiado para a área de transferência!
<auth-method>FORM</auth-method> no elemento <login-config> do descritor da implantação, web.xml. O logon e as páginas de erro estão também definidas no <login-config>, conforme abaixo:
FormAuthenticator para direcionar usuários à página apropriada. A Plataforma do Aplicativo JBoss Enterprise mantém o pool de sessão de forma que a informação de autenticação não precisa estar presente a cada solicitação. Quando o FormAuthenticator receber uma solicitação, ele consulta o org.apache.catalina.session.Manager por uma sessão existente. Caso a sessão não existir, a nova sessão é criada. Em seguida, o FormAuthenticator verifica os credenciais da sessão.
Nota
/dev/urandom (Linux) por padrão e aplicados hash com o MD5. As checagens são executadas na criação da ID da sessão como garantia de que a ID criada é única.
JSESSIONID. O seu valor é uma sequência hexa da ID da sessão. Esta cookie é configurada para ser não-persistente. Isto significa que ela será deletada ao lado do cliente quando o navegador for encerrado. No lado do servidor, as sessões expiram após 60 segundos de inatividade, sendo que os objetos de sessão do período e suas informações de credencial são deletados.
FormAuthenticator aplica o cache na solicitação, cria uma nova sessão se for necessário, e redireciona o usuário à página de logon definida no login-config. (No código da amostra anterior, a página de logon é login.html.) Em seguida, o usuário insere seu nome e senha de usuário no formulário HTML fornecido. O nome e senha do usuário são passados ao FormAuthenticator através da ação do formulário j_security_check.
FormAuthenticator autentica o nome e senha do usuário em relação ao realm anexado ao contexto do aplicativo da web. O realm é o JBossWebRealm, na Plataforma do Aplicativo JBoss Enterprise. O FormAuthenticator restaura as solicitações salvas do cache e redireciona o usuário à solicitação original, quando a autenticação for bem sucedida.
Nota
/j_security_check e que pelo menos os parâmetros j_username e j_password existam.
1.8. Ativação da Segurança Declarativa Copiar o linkLink copiado para a área de transferência!
Capítulo 2. Introdução ao JAAS Copiar o linkLink copiado para a área de transferência!
2.1. Classes Principais do JAAS Copiar o linkLink copiado para a área de transferência!
Subject(javax.security.auth.Subject)Principal(java.security.Principal)
Callback(javax.security.auth.callback.Callback)CallbackHandler(javax.security.auth.callback.CallbackHandler)\n\t\nConfiguration(javax.security.auth.login.Configuration)LoginContext(javax.security.auth.login.LoginContext)LoginModule(javax.security.auth.spi.LoginModule)
2.1.1. Classes do Assunto e Principal Copiar o linkLink copiado para a área de transferência!
Subject é a classe central no JAAS. O Subject representa a informação para a entidade única, tal como uma pessoa ou serviço. Ele abrange os principais da entidade, credenciais públicos e credenciais privados. Os JAAS APIs usam a interface java.security.Principal do Java 2 existente para representar um principal, que é basicamente um nome digitado.
public Set getPrincipals() {...}
public Set getPrincipals(Class c) {...}
public Set getPrincipals() {...}
public Set getPrincipals(Class c) {...}
getPrincipals() retorna todos os principais contidos no assunto. O getPrincipals(Class c) retorna apenas os principais que são instâncias de classe c ou uma se suas sub-classes. Um conjunto vazio é retornado caso o assunto não possua principais de combinação.
java.security.acl.Group é uma sub-interface do java.security.Principal, portanto uma instância no conjunto dos principais pode representar o agrupamento lógico de outros principais ou grupos de principais.
2.1.2. Autenticação do Assunto Copiar o linkLink copiado para a área de transferência!
- O aplicativo instancia um
LoginContexte passa o nome da configuração de logon, além de umCallbackHandlerpara popular os objetosCallback, conforme solicitado pelosLoginModules da configuração. - O
LoginContextconsulta umConfigurationpara carregar todos osLoginModulesincluídos na configuração de logon nomeada. Caso tal configuração nomeada não existir, a configuraçãootherserá usada como padrão. - O aplicativo invoca o método
LoginContext.login. - O método de logon invoca todos os
LoginModules carregados. Uma vez que cadaLoginModuletenta autenticar o assunto, ele invoca o método de manuseio noCallbackHandlerassociado para obter informações solicitadas para o processo de autenticação. A informação requerida é passada para manuseio do método na forma de um array de objetosCallback. Caso bem sucedido, osLoginModules associam principais e credenciais relevantes com o assunto. - O
LoginContextretorna o status de autenticação para o aplicativo. O sucesso da operação é representado pelo retorno do método de logon. A falha é representada através de um LoginException sendo lançado através do método de logon. - Caso a autenticação seja bem sucedida, o aplicativo restaura o assunto autenticado usando o método
LoginContext.getSubject. - Após o escopo da autenticação do assunto ser completado, todos os principais e informações relacionadas associadas com o assunto pelo método de logon podem ser removidos pela invocação do método
LoginContext.logout.
LoginContext fornece os métodos básicos de autenticação dos assuntos e oferece uma maneira de desenvolver um aplicativo que é independente da tecnologia de autenticação subjacente. O LoginContext consulta um Configuration para determinar os serviços de autenticação configurados para um aplicativo em particular. As classes LoginModule representam os serviços de autenticação. Portanto, você pode conectar-se a diferentes módulos de logon em um aplicativo sem alterar o próprio aplicativo. O seguinte código apresenta as etapas solicitadas por um aplicativo para autenticar o assunto.
LoginModule. Isto permite que um administrador conecte-se a diferentes tecnologias de autenticação em um aplicativo. Você pode formar uma cadeia de múltiplos LoginModules para permitir que mais de uma tecnologia de autenticação participe no processo de autenticação. Por exemplo, um LoginModule pode executar a autenticação baseada no nome/senha do usuário, enquanto outro pode ser a interface para dispositivos de hardware tais como leituras de cartões e autenticadores biométricos.
LoginModule é dirigido pelo objeto LoginContext pelo qual o cliente crie e imprime o método de logon. O processo consiste em duas fases. Segue abaixo as etapas do processo:
- O
LoginContextcria cadaLoginModuleconfigurado usando o construtor não-arg. - Cada
LoginModuleé inicializado por uma chamada para inicializar cada método. Garante-se que o argumentoSubjectseja não-nulo. A assinatura do método inicializar é a seguinte:public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options). - O método
loginé chamado para iniciar o processo de autenticação. Por exemplo, a implantação do método pode pedir a um usuário pelo nome e senha do usuário e verificar a informação sobre os dados armazenados no serviço de nomeação, tais como o NIS ou LDAP. Implantações alternativas podem servir como interface para cartões smart e dispositivos biométricos, ou simplesmente extrair a informação do usuário a partir do sistema de operação subjacente. A validação da identidade do usuário por cadaLoginModuleé considerada fase 1 da autenticação do JAAS. A assinatura do método deloginé oboolean login() throws LoginException. OLoginExceptionindica falha. O valor de retorno verdadeiro indica que o método é bem sucedido, onde o valor de retorno negativo indica que o módulo de logon deve ser ignorado. - Caso a autenticação de visão geral do
LoginContextseja bem sucedida, ocommité invocado em cadaLoginModule. Caso a fase 1 suceda para umLoginModule, o método de confirmação continua na fase 2 e associa os principais relevantes, credenciais públicos e/ou credenciais privados com o assunto. Caso a fase 1 falhar para oLoginModule, ocommitremoverá qualquer estado de autenticação armazenado anteriormente, tal como nomes e senhas de usuário. A assinatura do métodocommité a seguinte:boolean commit() throws LoginException. A falha em completar a fase de confirmação é indicada pelo lançamento de umLoginException. O retorno como verdadeiro indica que o método é bem sucedido, onde o retorno como falso indica que o módulo de logon deve ser ignorado. - Caso a autenticação da visão geral do
LoginContextfalhar, o métodoabortserá invocado em cadaLoginModule. O métodoabortremove ou destrói qualquer estado de autenticação criado pelos métodos de logon ou inicialização. A assinatura do métodoaborté oboolean abort() throws LoginException. A falha em completar a faseaborté indicada pelo lançamento de umLoginException. O retorno como verdadeiro indica que o método foi bem sucedido, onde o retorno como falso indica que o módulo de logon deve ser ignorado. - Para remover o estado de autenticação após o logon com êxito, o aplicativo invoca o
logoutnoLoginContext. Este, por sua vez resulta numa invocação de métodologoutem cadaLoginModule. O métodologoutremove os principais e credenciais originalmente associados com o assunto durante a operaçãocommit. Os credenciais devem ser destruídos na remoção. A assinatura do métodologouté a seguinte:boolean logout() throws LoginException. A falha em completar o processo de saída é indicada pelo lançamento de umLoginException. O retorno como verdadeiro indica que o método foi bem sucedido, onde o retorno como falso indica que o módulo de logon deve ser ignorado.
LoginModule necessitar comunicar-se com o usuário para obtenção de informação da autenticação, ele usará um objeto CallbackHandler. Os aplicativos implementam a interface CallbackHandler e passam-as ao LoginContext, que envia a informação de autenticação diretamente aos módulos de logon subjacentes.
CallbackHandler para obterem entradas dos usuários, tais como uma senha ou PIN de cartão smart, além de fornecerem informação aos usuários tais como informação de status. Quando permitindo que o aplicativo especifique o CallbackHandler, os LoginModules subjacentes continuam independentes das diversas maneiras em que os aplicativos interagem com os usuários. Por exemplo, uma implantação do CallbackHandler para um aplicativo GUI pode exibir uma janela para solicitar a entrada do usuário. Por outro lado, uma implantação CallbackHandler para um ambiente sem GUI, tal como o servidor do aplicativo, pode simplesmente obter informação do credencial pelo uso de um API do servidor do aplicativo. A interface callbackhandler possui um método para implantação:
void handle(Callback[] callbacks)
throws java.io.IOException,
UnsupportedCallbackException;
void handle(Callback[] callbacks)
throws java.io.IOException,
UnsupportedCallbackException;
Callback é a última classe de autenticação que iremos observar. Ela é uma interface de marcação pela qual diversas implantações padrões são fornecidas, incluindo o NameCallback e PasswordCallback usado numa amostra anterior. O LoginModule usa um Callback para obter informação solicitada pelo mecanismo de autenticação. Os LoginModules passam um array dos Callbacks diretamente ao método CallbackHandler.handle durante a fase de logon da autenticação. Caso um callbackhandler não entender como usar um objeto Callback passado a um método de manuseio, ele lança um UnsupportedCallbackException para abortar a chamada de logon.
Capítulo 3. Modelo de Segurança do JBoss Copiar o linkLink copiado para a área de transferência!
org.jboss.security.AuthenticationManagerorg.jboss.security.RealmMappingorg.jboss.security.SecurityProxyorg.jboss.security.AuthorizationManagerorg.jboss.security.AuditManagerorg.jboss.security.MappingManager
Figura 3.1. Relações da Interface do Modelo de Segurança para os Elementos do Recipiente EJB do Servidor JBoss.
org.jboss.ejb.Container, org.jboss.SecurityInterceptor e org.jboss.SecurityProxyInterceptor. As demais classes são interfaces e classes fornecidas pelo subsistema de segurança.
org.jboss.security.AuthenticationManagerorg.jboss.security.AuthorizationManager
Funções da Interface de Segurança
- AuthenticationManager
- Esta interface é responsável pela validação de credenciais associados com os Principals. Os Principais são identidades, tais como nomes de usuários, números de funcionário e números de segurança social. Os Credentials são prova de identidade, tais como senhas, teclas de sessão e assinaturas digitais. O método
isValidé invocado para determinar se é que uma identidade de usuário e as credenciais associadas conhecidas conforme conhecidas no ambiente operacional são prova válida da identidade do usuário. - AuthorizationManager
- Esta interface é responsável pelo controle de acesso mandatório pelas especificações do Java EE. A implementação desta interface fornece a habilidade de empilhar um conjunto de Fornecedores de Política úteis para a autorização conectável.
- SecurityProxy
- Esta interface descreve as solicitações para um plugin
SecurityProxyInterceptorpersonalizado. OSecurityProxypermite que a externalização de segurança personalizada realize checagem baseada em métodos para ambos os métodos de página principal EJB e interface remota. - AuditManager
- Esta interface é responsável em fornecer um atalho de auditoria para os eventos de segurança.
- MappingManager
- Esta interface é responsável em fornecer o mapeamento do Principal, Função e Atributos. A implementação do AuthorizationManager pode chamar internamente o gerenciador do mapeamento para mapear as funções antes de executar o controle de acesso.
- SecurityDomain
- Esta é uma extensão das interfaces
AuthenticationManager, RealmMapping eSubjectSecurityManager. OSecurityDomainé a maneira recomendada para implementar segurança nos componentes, devido às vantagens oferecidas pelo JAAS Subject e o aumento de suporte oferecido ao aplicativo de estilo ASP e implementações de recurso. Ojava.security.KeyStoree as interfacescom.sun.net.ssl.KeyManagerFactoryecom.sun.net.ssl.TrustManagerFactoryestão incluídos nesta classe. - RealmMapping
- Esta interface é responsável pelo mapeamento principal e função. O método
getPrincipalleva uma identidade de usuário conforme conhecida no ambiente operacional e retorna a identidade do domínio do aplicativo. O métododoesUserHaveRoleque valida aquela identidade do usuário no ambiente de operação, é determinado para indicar a função daquele domínio do aplicativo.
AuthenticationManager, RealmMapping e SecurityProxy não possuem associações às classes relacionadas ao JAAS. Embora o framework do JBossSX seja inteiramente dependente no JAAS, as interfaces de segurança básicas requeridas para implementação do modelo de segurança do Java EE não o são. O framework do JBossSX é simplesmente uma implementação das interfaces do plug-in de segurança baseadas no JAAS.
Figura 3.2. Classes de Implementação do Framework do JBossSX e Camada do Recipiente EJB do Servidor do JBoss.
3.1. Ativação de Segurança Declarativa Revisitada Copiar o linkLink copiado para a área de transferência!
Figura 3.3. jboss.xml and jboss-web.xml Security Element Subsets.
AuthenticationManager e RealmMapping. Ele define qual domínio de segurança é especificado para todas as unidades de implantação, quando especificado como um elemento de nível superior. Este é o uso típico uma vez que a mistura dos gerenciadores de segurança com uma unidade de implantação complica a operação entre componentes e administração.
Principal retornado pelo método EJBContext.getUserPrincipal quando um usuário não-autenticado invoca um EJB. Perceba que isto não requer permissões especiais a um chamador não-autenticado. O seu propósito inicial é permitir servlets desprotegidos e páginas JSP para invocar EJBs desprotegidos e permitir que o EJB de destino obtenha um Principal não nulo para o chamador usando o método getUserPrincipal. Este é um requerimento da especificação do J2EE.
org.jboss.security.SecurityProxy. Alternativamente, você pode usar uma interface comum que usa um objeto para implementar métodos na página principal, remota, página principal local ou interfaces locais do EJB. A instância deve ser quebrada automaticamente numa implementação que delega as invocações de métodos ao objeto, caso a classe gerada não implementar a interface SecurityProxy. O org.jboss.security.SubjectSecurityProxy é um exemplo de implementação SecurityProxy usado pela instalação padrão.
SecurityProxy personalizado no contexto de um bean de sessão sem estado trivial. O SecurityProxy personalizado valida que ninguém invoque o método echo do bean com quatro letras como seu argumento. Esta checagem não é possível com a segurança baseada na função. Neste caso, você não pode definir uma função FourLetterEchoInvoker, uma vez que o contexto de segurança é um argumento de método e não uma propriedade do chamador. O código para o SecurityProxy personalizado é gerado no Exemplo 3.1, “Implementação EchoSecurityProxy Personalizada. ”
Exemplo 3.1. Implementação EchoSecurityProxy Personalizada.
EchoSecurityProxy confere se o método a ser invocado na instância do bean corresponde ao método echo(String) carregado no método init. Caso haja um correspondente, o argumento do método é obtido e seu comprimento comparado com 4 ou nulo. Ambos os casos resultam num SecurityException sendo lançado.
jboss.xml associado que instala o EchoSecurityProxy como um proxy personalizado para o EchoBean é gerado no Exemplo 3.2, “descritor jboss.xml ”.
Exemplo 3.2. descritor jboss.xml
EchoBean.echo com os argumentos Hello e Four, conforme ilustrado no seguinte fragmento:
Four é uma palavra de quatro letras. Execute o cliente usando Ant a partir do diretório das amostras:
echo('Hello') bem sucedida e a chamada do método echo('Four')\tresultando numa exceção confusa, também esperada. O resultado acima está truncado para adaptação neste livro. A parte principal da exceção é que o SecurityException("No 4 letter words") gerado pelo EchoSecurityProxy foi lançado para abortar a tentativa de invocação, conforme o desejado.
Capítulo 4. Arquitetura de Extensão de Segurança do JBoss Copiar o linkLink copiado para a área de transferência!
org.jboss.security.plugins.JaasSecurityManager. Esta é a implantação padrão das interfaces AuthenticationManager e RealmMapping. A Figura 4.1, “Relação entre o valor do descritor <security-domain> de implantação, recipiente do componente e JaasSecurityManager.” apresenta como o JaasSecurityManager integra-se ao EJB e camadas de recipientes da web, baseados no elemento <security-domain> do descritor de implantação do componente correspondente.
Figura 4.1. Relação entre o valor do descritor <security-domain> de implantação, recipiente do componente e JaasSecurityManager.
jwdomain de domínio de segurança. Os recipientes EJB e da web possuem um interceptor de arquitetura que reforça o modelo de segurança do recipiente. No período de implantação, o valor do elemento <security-domain> nos descritores jboss.xml e jboss-web.xml é usado para obter uma instância do gerenciador de segurança associada com o recipiente. Em seguida, o interceptor de segurança usa o gerenciador de segurança para executar sua função. Quando um componente protegido for solicitado, o interceptor de segurança delega checagens de segurança para proteger a instância do gerenciador de segurança associado com o recipiente.
JaasSecurityManager executa checagens de segurança baseadas na informação associada com a instância que resulta da execução dos módulos de logon JAAS configurados sob o nome de combinação do valor do elemento <security-domain>. Nós descreveremos mais a fundo a implementação JaasSecurityManager e seu uso na próxima seção.
4.1. Como o JaasSecurityManager usa o JAAS Copiar o linkLink copiado para a área de transferência!
JaasSecurityManager usa os pacotes JAAS para implementar o AuthenticationManager e o comportamento de interface RealmMapping. Basicamente, seu comportamento deriva de uma execução das instâncias do módulo de logon que estão configuradas sob o nome que coincide ao domínio de segurança pelo qual o JaasSecurityManager foi determinado. Os módulos de logon implantam a autenticação do principal do domínio de segurança e o comportamento do mapeamento de função. Portanto, você pode usar o JaasSecurityManager através de diferentes domínios de segurança simplesmente pela conexão de diferentes configurações de módulo do logon pelos domínios.
JaasSecurityManager do processo de autenticação do JAAS, você passará pela invocação do cliente de uma invocação do método da página principal do EJB. O pré-requisito da configuração é que o EJB seja implantado no servidor do JBoss e seus métodos de interface da página principal sejam protegidos usando os elementos <method-permission> no descritor, além de ser determinado um domínio de segurança nomeado jwdomain, usando o descritor jboss.xml do elemento <security-domain>.
Figura 4.2. Etapas de Autenticação do Método da Página Principal do EJB e Invocação da Autorização.
- O cliente deve executar um logon JAAS para estabelecer o principal e os credenciais para a autenticação, além de ser etiquetado Logon ao Lado do Cliente na figura. Este é o procedimento de como os clientes estabelecem suas identidades no JBoss. O suporte para apresentação da informação de logon através das propriedades
InitialContextdo JNDI é fornecido através de uma configuração alternativa.O logon JAAS implica na criação de uma instânciaLoginContexte passagem do nome da configuração a ser usada. O nome da configuração éother. Este logon de uma única vez associa o principal do logon e as credenciais com todas as invocações do método EJB subsequentes. Perceba que o processo pode não ser autenticado pelo usuário. A natureza do logon ao lado do cliente depende da configuração do módulo de logon que o cliente usa. Nesta amostra, a entrada da configuração do logon ao lado do clienteotheré configurada para uso do móduloClientLoginModule(umorg.jboss.security.ClientLoginModule). Este é o módulo ao lado do cliente padrão que simplesmente efetua o bind no nome do usuário e senha para a camada de invocação EJB do JBoss para uma autenticação mais tarde no servidor. A identidade do cliente não é autenticada no cliente. - O cliente obtém uma interface da página principal do EJB e tenta criar um bean. Esse evento é etiquetado como a Invocação do Método de Página Principal. Isto resulta no envio da invocação do método da interface de página principal ao servidor do JBoss. A invocação inclui os argumentos do método passados pelo cliente, juntamente com a identidade do usuário e credenciais do logon do JAAS ao lado do cliente, executados na Etapa 1.
- No lado do servidor, o interceptor de segurança primeiramente requer a autenticação do usuário invocando a chamada, que uma vez ao lado do cliente, envolve o logon do JAAS.
- O domínio de segurança pelo qual o EJB é protegido determina a escolha dos módulos de logon. O nome do domínio de segurança é usado como o nome da entrada da configuração do logon passado ao construtor
LoginContext. O domínio de segurança EJB é ojwdomain. Caso o logon do JAAS autenticar o usuário, o JAASSubjecte contém o seguinte em seuPrincipalsSet:- O
java.security.Principalque corresponde à identidade do cliente, como é conhecida no ambiente de segurança da implantação. - O
java.security.acl.GroupnomeadoRolesque contém o nome de função a partir do domínio do aplicativo pelo qual o usuário é determinado. Os objetosorg.jboss.security.SimplePrincipalsão usados para representar os nomes de função. OSimplePrincipalé uma implantação baseada na sequência simples doPrincipal. Essas funções são usadas para validar as funções determinadas aos métodos noejb-jar.xmle na implantação do métodoEJBContext.isCallerInRole(String). - Um
java.security.acl.Groupopcional nomeadoCallerPrincipal, que contém umorg.jboss.security.SimplePrincipalúnico que corresponde à identidade do chamador do domínio do aplicativo. O membro do grupo únicoCallerPrincipalserá o valor retornado pelo métodoEJBContext.getCallerPrincipal(). O propósito do mapeamento é permitir umPrincipaltambém conhecido no ambiente de segurança opcional para mapear umPrincipalcom o nome conhecido pelo aplicativo. Na ausência de um mapeamentoCallerPrincipal, o principal do ambiente de segurança implantado é usado como o valor do métodogetCallerPrincipal. Quer dizer, o principal operacional é o mesmo que o principal do domínio do aplicativo.
- O passo final da checagem do interceptor de segurança é verificar que o usuário autenticado possui permissão para invocar o método solicitado. Isto é etiquetado como Autorização ao lado do servidor na Figura 4.2, “Etapas de Autenticação do Método da Página Principal do EJB e Invocação da Autorização.”. As seguintes etapas descrevem a execução da autorização:
- Obtém os nomes das funções permitidas para acesso ao método EJB a partir do container. Os nomes da função são determinados pelo descritor
ejb-jar.xmldos elementos <role-name> de todos os elementos <method-permission> contendo o método invocado. - Caso nenhuma função tenha sido determinada ou o método seja especificado num elemento exclude-list, o acesso ao método será 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 determinados. Esse método interage através dos nomes de função e checa se o grupoRolesdo Assunto do usuário autenticado contém umSimplePrincipalcom o nome de função determinado. O acesso é permitido caso qualquer nome de função seja membro do grupoRoles. O acesso é negado caso nenhum dos nomes de funções forem membros. - Caso o EJB for configurado por um proxy de segurança personalizada, a invocação de método é delegada também. Caso o proxy de segurança desejar negar acesso ao chamador, ele lançará um
java.lang.SecurityException. Caso nenhumSecurityExceptionfor lançado, o acesso ao método é permitido e a invocação de método passa ao próximo interceptor do recipiente. Perceba que oSecurityProxyInterceptormanuseia esta checagem e este interceptor não é apresentado. - O Tomcat gerencia elementos de restrição de segurança e verificação de função para as conexões do JBoss Web.Quando uma solicitação receber uma conexão da web, o Tomcat checa as restrições de segurança definidas no
web.xmlque coincide com o recurso solicitado e o método HTTP acessado.Caso uma restrição existir, o Tomcat chama o JaasSecurityManager para executar a autenticação principal, que em troca garante que as funções do usuário sejam associadas com o objeto do principal.A verificação da função é executada inteiramente pelo Tomcat, incluindo as checagens dos parâmetros, tais comoallRolese se é que oSTRICT_MODEé usado ou não.
JaasSecurityManager suporta a noção de um cache de autenticação que é usado para armazenar a informação do principal e credencial a partir dos logons anteriores bem sucedidos. Você pode especificar a instância do cache de autenticação para uso como parte da configuração JaasSecurityManager conforme descrito na seção seguinte do serviço MBean associado. Na ausência de qualquer cache de usuário definido, o cache padrão que mantém a informação do credencial para o período de tempo configurável será usado.
4.2. O JaasSecurityManagerService MBean Copiar o linkLink copiado para a área de transferência!
JaasSecurityManagerService administra os gerenciadores de segurança. Embora seu nome inicie com Jaas, os gerenciadores de segurança que isto manuseia não precisam usar JAAS em suas implantações. O nome surgiu a partir do fato que a implantação do gerenciador de segurança é um JaasSecurityManager. A função principal do JaasSecurityManagerService é externalizar a implantação do gerenciador de segurança. Você pode alterar a implantação do gerenciador de segurança fornecendo uma implantação alternativa das interfaces AuthenticationManager e RealmMapping.
JaasSecurityManagerService é fornecer uma implantação javax.naming.spi.ObjectFactory do JNDI para permitir um gerenciamento simples sem código do nome JNDI para mapeamento da implantação do gerenciador de segurança. A segurança é ativada pela especificação do nome JNDI da implantação de segurança através do elemento descritor da implantação <security-domain>.
JaasSecurityManagerService gerencia a associação das instâncias do gerenciador de segurança para nomes pela efetuação de bind na próxima referência de sistema de nomeação (entre o mesmo), como o JNDI ObjectFactory sob o nome de java:/jaas. Tudo isto, para simplificar a configuração do nome JNDI para bindings do gerenciador de segurança. Isto permite uma convenção de nomeação do java:/jaas/XYZ do formulário como o valor para o elemento <security-domain> e a instância do gerenciador de segurança para o domínio de segurança ser criado, conforme isto seja necessário.
XYZ de domínio é criado na primeira busca relacionada à efetuação de bind ao java:/jaas/XYZ, criando uma instância da classe especificada pelo atributo SecurityManagerClassName usando um construtor que leva o nome do domínio de segurança.
Importante
java:/jaas, em cada elemento do descritor da implantação <security-domain>, era solicitado para efetuação do bind correta no nome JNDI do domínio de segurança para os binds do gerenciador de segurança.
java:/jaas não é solicitado pela declaração do domínio de segurança a partir da Plataforma do Aplicativo JBoss Enterprise 5. O prefixo java:/jaas ainda é suportado e é mantido para a compatibilidade inversa.
<jboss>
<!-- Configure all containers to be secured under the "customer" security domain -->
<security-domain>customer</security-domain>
<!-- ... -->
</jboss>
<jboss>
<!-- Configure all containers to be secured under the "customer" security domain -->
<security-domain>customer</security-domain>
<!-- ... -->
</jboss>
customer retornará uma instância de gerenciador de segurança associada com o domínio de segurança nomeado customer. Este gerenciador de segurança implementará as interfaces de segurança e será do tipo especificado pelo atributo JaasSecurityManagerServiceSecurityManagerClassName.
JaasSecurityManagerService é configurado por padrão para uso na distribuição do JBoss padrão e você normalmente poderá usar a configuração padrão assim como ela é. Os atributos configuráveis do JaasSecurityManagerService incluem:
- SecurityManagerClassName
- O nome da classe que fornece a implantação do gerenciador de segurança. A implantação deve suportar ambas as interfaces
org.jboss.security.AuthenticationManagereorg.jboss.security.RealmMapping. O padrão éorg.jboss.security.plugins.JaasSecurityManager, caso não tenha sido especificado. - CallbackHandlerClassName
- O nome da classe que fornece a implantação
javax.security.auth.callback.CallbackHandlerusada peloJaasSecurityManager.Nota
Você pode substituir o manuseador usado pela implantação padrãoJaasSecurityManager, caso a implantação padrão (org.jboss.security.auth.callback.SecurityAssociationHandler) não atender suas necessidades. A maioria das implantações irão considerar o manuseador padrão suficiente. - SecurityProxyFactoryClassName
- O nome da classe que fornece a implantação
org.jboss.security.SecurityProxyFactory. O padrão éorg.jboss.security.SubjectSecurityProxyFactory, caso não seja especificado. - AuthenticationCacheJndiName
- Especifica a localização da política do cache credencial de segurança. Isto é tratado primeiramente como uma localização
ObjectFactorycapaz de retornar as instâncias baseando-se no <security-domain>. Isto é realizado anexando o nome do domínio de segurança ao nome quando observando oCachePolicypara o domínio. Caso isto falhe, a localização é tratada como umCachePolicyúnico para todos os domínios de segurança. A política de cache de período limitado é usada como padrão. - DefaultCacheTimeout
- Especifica o intervalo da política de cache de período limitado em segundos. O valor padrão é 1800 segundos (30 minutos). O valor de uso para o intervalo é uma média entre as operações de autenticações frequentes e do período pelo qual a informação de credencial pode permanecer fora de sync em relação ao armazenamento da informação de segurança. Caso você deseje desativar o cache dos credenciais de segurança, configure isto para 0 com o objetivo de forçar a autenticação a ocorrer todo o tempo. Isto não possui efeito caso o
AuthenticationCacheJndiNametenha o valor padrão alterado. - DefaultCacheResolution
- Especifica a resolução da política de cache de período limitado padrão em segundos. Isto controla o intervalo pelo qual o carimbo de tempo atual do cache é atualizado e deve ser inferior que
DefaultCacheTimeout, com o objetivo do intervalo ser significativo. A resolução padrão é de 60 segundos (1 minuto). Isto não tem efeito caso oAuthenticationCacheJndiNametenha o valor padrão alterado. - DefaultUnauthenticatedPrincipal
- Especifica o principal para uso para usuários não-autenticados. Esta configuração facilita a configuração de permissões padrões para usuários que não foram autenticados.
JaasSecurityManagerService também suporta um número de operações úteis. Elas incluem o esvaziamento de qualquer cache de autenticação do domínio de segurança no período de rodagem e qualquer um dos métodos da interface do gerenciador de segurança.
public void flushAuthenticationCache(String securityDomain).
Principals no cache de autenticação do domínio de segurança que não estão expiradas. A assinatura da operação do MBean é a seguinte: public List getAuthenticationCachePrincipals(String securityDomain).
public boolean isValid(String securityDomain, Principal principal, Object credential);
public Principal getPrincipal(String securityDomain, Principal principal);
public boolean doesUserHaveRole(String securityDomain, Principal principal,
Object credential, Set roles);
public Set getUserRoles(String securityDomain, Principal principal, Object credential);
public boolean isValid(String securityDomain, Principal principal, Object credential);
public Principal getPrincipal(String securityDomain, Principal principal);
public boolean doesUserHaveRole(String securityDomain, Principal principal,
Object credential, Set roles);
public Set getUserRoles(String securityDomain, Principal principal, Object credential);
AuthenticationManager correspondente e ao método da interface do domínio de segurança associado nomeado pelo argumento securityDomain.
4.3. O JaasSecurityDomain MBean Copiar o linkLink copiado para a área de transferência!
org.jboss.security.plugins.JaasSecurityDomain é uma extensão do JaasSecurityManager que adiciona a noção de um KeyStore, um JSSE KeyManagerFactory e um TrustManagerFactory para suporte do SSL e outros casos de uso de criptografia. Os atributos configuráveis adicionais do JaasSecurityDomain incluem:
- KeyStoreType
- O tipo de implantação
KeyStore. Este é o tipo de argumento passado ao método de criaçãojava.security.KeyStore.getInstance(String type). O padrão éJKS. - KeyStoreURL
- Um URL para a localização do banco de dados
KeyStore. Ele é usado para obter umInputStreampara inicializar oKeyStore. Caso a sequência não conter um URL de nome/valor, o valor será tratado como um arquivo. - KeyStorePass
- A senha associada com os conteúdos do banco de dados do
KeyStore. OKeyStorePassé também usado na combinação com os atributosSalteIterationCountpara criar uma chave secreta do PBE usado com as operações de codificação/decodificação. O formato do valor do atributoKeyStorePassé um dos seguintes:- A senha de texto simples para o
KeyStore. O valortoCharArray()da sequência é usado sem qualquer manipulação. - O comando a ser executado para obter a senha de texto plano. O formato é
{EXT}...onde o...é a mesma linha de comando passada ao métodoRuntime.exec(String)para executar o comando específico da plataforma. O primeiro resultado da linha de comando é usado como senha. - A classe a ser criada para obter a senha de texto simples. O formato é
{CLASS}classname[:ctorarg], onde o[:ctorarg]é uma sequência opcional que será passada ao construtor quando instanciando oclassname. A senha é obtida a partir do nome de classe pela invocação de um métodotoCharArray(), caso encontrado. Do contrário, o métodotoString()será usado.
- Salt
- O valor do salt
PBEParameterSpec. - IterationCount
- O valor de contagem de interação
PBEParameterSpec. - TrustStoreType
- O tipo de implantação
TrustStore. Este é o tipo de argumento passado ao método de criaçãojava.security.KeyStore.getInstance(String type). O padrão éJKS. - TrustStoreURL
- Um URL para a localização do banco de dados
TrustStore. Isto é usado para obter umInputStreampara inicializar oKeyStore. Caso a sequência não seja um URL de valor, ele será usado como um arquivo. - TrustStorePass
- A senha associada com os conteúdos do banco de dados do armazenamento. O
TrustStorePassé uma senha simples e não possui as mesmas opções de configuração como oKeyStorePass. - ManagerServiceName
- Determina a sequência do nome do objeto de um MBean do serviço do gerenciador de segurança. Ele é usado para registrar os padrões para registro do
JaasSecurityDomaincomo um gerenciador de segurança sob ojava:/jaas/<domain>, onde o<domain>é o nome passado ao construtor do MBean. O padrão do nome éjboss.security:service=JaasSecurityManager.
Parte II. Segurança do Aplicativo Copiar o linkLink copiado para a área de transferência!
Capítulo 5. Visão Geral Copiar o linkLink copiado para a área de transferência!
- Autenticação
- O processo pelo qual o servidor determina se é que um usuário deve estar apto a acessar um sistema ou uma operação.
- Autorização
- Processo pelo qual o servidor determina se é que o usuário autenticado possui permissão de acesso aos privilégios específicos ou recursos no sistema ou operação.
- Mapeamento
- Processo pelo qual o servidor associa usuários autenticados com os perfis de autorização pré-definidos.
- Auditoria
- Processo pelo qual o servidor monitora a autenticação e autorização dos eventos de segurança.
- Domínio de Segurança
- O conjunto de políticas de autenticação, autorização e mapeamento que são definidas no XML e estão disponíveis aos aplicativos no período de rodagem usando a Nomeação do Java e Interface do Diretório (JNDI - Java Naming and Directory Interface).
Capítulo 6. Esquema do Domínio de Segurança Copiar o linkLink copiado para a área de transferência!
- 5.1
/schema/security-beans_1_0.xsddentro dojboss-as/lib/jbosssx.jar/- 5.0, 5.0.1
/schema/security-beans_1_0.xsddentro dojboss-as/common/lib/jbosssx.jar
Exemplo 6.1. Esquema do Domínio de Segurança
Descritores do Elemento do Domínio de Segurança
- <application-policy>
- Os elementos do domínio de segurança estão contidos no elemento <application-policy>, independente de como ele é implantado no sistema. O elemento usa o ML namespace conforme declarado no atributo
xmlns.O atributonameconfigura o nome do domínio de segurança referenciado por um aplicativo. O nome do domínio de segurança está vinculado no JNDI sob o contextojava:/jaase é acessado pelos aplicativos através da referência em seus descritores de implantação.O elemento <application-policy> pode conter um número de elementos filhos que determinam o comportamento para o domínio de segurança e todos os aplicativos que usam o mesmo. Esses elementos estão descritos em maiores detalhes na Seção 6.1, “<authentication>”, Seção 6.2, “<authorization>” e Seção 6.3, “<mapping>”.
6.1. Copiar o linkLink copiado para a área de transferência!
- <authentication>
- Esse elemento contém os elementos <login-module> que controlam quais módulos de autenticação são usados quando autenticando usuários que conectam-se através do aplicativo.Quando os elementos <login-module> estiverem presentes, eles formam um grupo coletivo de solicitações que devem ser realizados antes da autenticação ser confirmada. Esse grupo coletivo é chamado stack.
- <login-module>
- Este elemento usa o atributo
codepara especificar qual implantação do módulo de logon um aplicativo pode usar e o atributoflagpara informar o aplicativo como analisar cada módulo de logon presente na pilha. O atributoflagsuporta os seguintes valores:- requeridos
- O módulo deve suceder para que uma autenticação seja bem sucedida. Caso quaisquer <login-module> falharem, a autenticação também falhará. Os módulos de logon restantes na pilha são chamados independente do resultado de autenticação.
- solicitação
- É necessário que o módulo seja bem sucedido. Caso ele suceda, a autenticação continua na parte inferior da pilha. Caso o módulo falhe, o controle retorna imediatamente ao aplicativo.
- suficiência
- Não há necessidade de que o módulo de logon suceda. Caso ele seja bem sucedido, o controle retorna imediatamente ao aplicativo. Caso o módulo falhe, a autenticação continua na parte inferior do aplicativo.
- opcional
- Não é necessário que o módulo de logon suceda. A autenticação continua a proceder na parte inferior da pilha independente de módulo de logon suceder ou falhar.
Cada <login-module> contém um conjunto de elementos <module-option> que definem futuramente as configurações solicitadas pela implantação do módulo de logon. - <module-option>
- Cada módulo de logon possui o próprio conjunto de configuração. O atributo do nome especifica a propriedade solicitada pelo módulo de logon e o valor é declarado no CDATA do elemento <module-option>. As opções de módulo dependem em qual módulo de logon você escolher. A Seção 12.1, “Módulos de Uso” descreve as opções de módulos em maiores detalhes.
6.2. Copiar o linkLink copiado para a área de transferência!
- <authorization>
- O elemento contém os elementos <policy-module> que definem o módulo de política usado para autorizar usuários e se é que o módulo é requerido ou não:Quando os elementos <policy-module> estiverem presentes, eles formarão uma grupo coletivo de solicitações que devem ser realizadas antes da autorização ser verificada. Este grupo coletivo é chamado stack.
- <policy-module>
- Este elemento usa o atributo
codepara especificar qual implementação do módulo da política um aplicativo pode utilizar e o atributoflagpara informar o aplicativo de como analisar cada módulo de política presente na pilha da política. O atributoflagsuporta os seguintes valores:- requeridos
- O módulo deve suceder para a autorização ser bem sucedida. Caso qualquer <policy-module> solicitado falhar, a tentativa de autorização falhará. Os módulos restantes na pilha são chamados independente do resultado do módulo.
- solicitação
- É necessário que o módulo seja bem sucedido. Caso ele suceda, a autorização continua na parte inferior da pilha. Caso ele falhe, o controle retorna imediatamente ao aplicativo.
- suficiência
- Não é necessário que o módulo de logon suceda. Caso ele seja bem sucedido, o controle retorna imediatamente ao aplicativo. Caso ele falhe, a autorização continua na parte inferior da pilha.
- opcional
- Não é necessário que o módulo de logon seja bem sucedido. A autorização continua na parte inferior da pilha independente do módulo suceder ou falhar.
6.3. Copiar o linkLink copiado para a área de transferência!
- <mapping>
- Este elemento contém os elementos <mapping-module> que são usados para definir os parâmetros dos elementos do módulo de mapeamento.Quando os elementos <mapping-module> estiverem presentes, eles formarão um grupo coletivo de solicitações que devem ser realizadas antes do mapeamento ser bem sucedido. Esse grupo coletivo é chamado stack.
- <mapping-module>
- Esses elementos usam o atributo
codepara especificar qual implantação do módulo de mapeamento um aplicativo pode usar e o atributoflagpara informar o aplicativo como analisar cada módulo de mapeamento presente na pilha da política. O atributo flag suporta os seguintes valores:- requeridos
- O módulo deve suceder para o mapeamento ser bem sucedido. Caso qualquer <mapping-module> falhar, a autenticação falhará. Os módulos restantes na pilha são chamados independente do resultado da autenticação.
- solicitação
- É necessário que o módulo seja bem sucedido. Caso ele suceda, o mapeamento continua na parte inferior da pilha. Caso o módulo falhe, o controle retorna imediatamente ao aplicativo.
- suficiência
- Não é necessário que o módulo seja bem sucedido. Caso suceda, o controle retorna imediatamente ao aplicativo. Caso o módulo falhe, o mapeamento continua na parte inferior da pilha.
- opcional
- O módulo não precisa ser bem sucedido. A autenticação continua na parte inferior da pilha, independente do módulo ser bem sucedido ou falhar.
Capítulo 7. Autenticação Copiar o linkLink copiado para a área de transferência!
Exemplo 7.1. Política de autenticação da pilha de logon único
jmx-console que usa um módulo de logon único, UsersRolesLoginModule (refira-se à Seção 12.1.5, “UsersRolesLoginModule”).
jboss-as/server/$PROFILE/conf/props.
Exemplo 7.2. Política da autenticação da pilha de logon múltiplo
web-console que usa dois módulos de logon na pilha de módulo de logon de autenticação.
LdapLoginModule (referia-se à Seção 12.1.1, “LdapLoginModule”), onde o outro <login-module> obtém as credenciais de autenticação usando o BaseCertLoginModule (refira-se à Seção 12.1.7, “BaseCertLoginModule”).
7.1. Manuseadores de Chamada de Retorno Personalizada Copiar o linkLink copiado para a área de transferência!
- Especificando o atributo CallbackHandlerClassName na definição JaasSecurityManagerService MBean do
conf/jboss-service.xml. - Injetando a instância do manuseador da chamada de retorno no JNDISecurityManagement bean do
deploy/security/security-jboss-beans.xml.
Procedimento 7.1. Define o manuseador de chamada de retorno usando os atributos
jboss-service.xml.
Abra o arquivo de configuração
Navegue ao$JBOSS_HOME/server/$PROFILE/conf/Abra o arquivojboss-service.xml.Por padrão, o arquivojboss-service.xmlcontém a configuração no Exemplo 7.3, “configuração padrão do jboss-service”Exemplo 7.3. configuração padrão do jboss-service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Anexe o atributo
Para definir o manuseador da chamada de retorno padrão, anexe um elemento <attribute> como um filho do elemento <mbean> e especifique o nome inteiramente qualificado do manuseador da chamada de retorno. Refira-se ao Exemplo 7.4, “chamador da chamada de retorno anexado do jboss-service” para uma amostra do elemento <attribute>, com o manuseador da chamada de retorno especificada.Exemplo 7.4. chamador da chamada de retorno anexado do jboss-service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie o servidor
Você acabou de configurar o arquivojboss-service.xmlpara uso com o manuseador de chamada de retorno.Reinicie o servidor para garantir de que a nova política de segurança fará efeito.
Procedimento 7.2. Defina o manuseador da chamada de retorno usando a injeção
Crie uma instância de chamada de retorno personalizada
Você deve criar uma instância do manuseador da chamada de retorno personalizada e registrá-la.Abra o arquivo de configuração
Navigue ao$JBOSS_HOME/server/$PROFILE/deploy/security/Abra o arquivosecurity-jboss-beans.xml.Por padrão, o arquivosecurity-jboss-beans.xmlcontém a configuração do JNDIBasedSecurityManagement bean no Exemplo 7.5, “configuração padrão do security-jboss-beans”Exemplo 7.5. configuração padrão do security-jboss-beans
<!-- JNDI Based Security Management --> <bean name="JBossSecuritySubjectFactory" class="org.jboss.security.integration.JBossSecuritySubjectFactory" />
<!-- JNDI Based Security Management --> <bean name="JBossSecuritySubjectFactory" class="org.jboss.security.integration.JBossSecuritySubjectFactory" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow Anexe a propriedade de injeção
Para injetar o manuseador da chamada de retorno, anexe um elemento <property> como filho do elemento <mbean> do JNDIBasedSecurityManagement. Especifique o manuseador da chamada de retorno usando os elementos <property> e <inject> descritos no Exemplo 7.4, “chamador da chamada de retorno anexado do jboss-service”.Exemplo 7.6. manuseador da chamada de retorno do security-jboss-beans
<bean name="JBossSecuritySubjectFactory" class="org.jboss.security.integration.JBossSecuritySubjectFactory"> <property name="securityManagement"> <inject bean="JNDIBasedSecurityManagement" /> </property> </bean><bean name="JBossSecuritySubjectFactory" class="org.jboss.security.integration.JBossSecuritySubjectFactory"> <property name="securityManagement"> <inject bean="JNDIBasedSecurityManagement" /> </property> </bean>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie o servidor
Você acabou de configurar o arquivosecurity-jboss-beans.xmlpara injeção de seu manuseador da chamada de retorno personalizada.Reinicie o servidor para garantir de que a nova política de segurança fará efeito.
Capítulo 8. Autorização Copiar o linkLink copiado para a área de transferência!
jboss-web-policy padrão e a autorização jboss-ejb-policy, configurados no jboss-as/server/$PROFILE/deploy/security/security-policies-jboss-beans.xml, serão utilizados.
security-policies-jboss-beans.xml.
jboss.xml (for EJBs) e jboss-web.xml (para WAR).
Procedimento 8.1. Configuração das políticas de autorização para todos os componentes EJB e WAR
jboss-web-policy e jboss-ejb-policy.
Abra o bean de política de segurança
Navegue ao$JBOSS_HOME/server/$PROFILE/deploy/securityAbra o arquivosecurity-policies-jboss-beans.xml.Por padrão, o arquivosecurity-policies-jboss-beans.xmlcontém a configuração no Exemplo 8.1, “security-policies-jboss-beans.xml”.Exemplo 8.1. security-policies-jboss-beans.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Altere as definições da política do aplicativo
Para configurar uma política de autorização única para cada componente usando o JACC, anexe cada atributo<policy-module>codecom o nome do módulo de autorização JACC.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie o servidor
Você configurou o arquivosecurity-policy-jboss-beans.xmlcom a autorização JACC ativada para cada política do aplicativo.Reinicie o servidor para garantir que a nova política de segurança tenha efeito.
Caso aplicativos solicitem políticas de segurança granular, você pode declarar políticas de segurança de autorização múltiplas para cada política de aplicativo. Os novos domínios de segurança podem herdar configurações base a partir de outros domínios de segurança e substituir configurações específicas tais como o módulo de política de autorização.
Procedimento 8.2. Configuração das políticas de autorização para domínios de segurança específicos
test-domain usa o módulo de logon UsersRolesLoginModule e usa a autorização JACC. O domínio de segurança test-domain-inherited herda a informação do módulo de logon a partir do test-domain, além de especificar que a autorização XACML deve ser usada.
Abra a política de segurança
Você pode especificar as configurações do domínio de segurança no arquivojboss-as/server/$PROFILE/conf/login-config.xmlou criar um arquivo descritor de implantação contendo as configurações. Escolha o descritor de implantação caso deseje empacotar as configurações do domínio de segurança com seu aplicativo.Localize e abra o login-config.xml
Navegue ao arquivologin-config.xmldo perfil do servidor sendo utilizado e abra o arquivo para edição.$JBOSS_HOME/jboss-as/server/$PROFILE/conf/login-config.xmlCrie o descritor jboss-beans.xml
Crie o descritor[prefix]-jboss-beans.xmlsubstituindo [prefix] por um nome significativo (por exemplo:test-war-jboss-beans.xml)Salve este arquivo no diretório/deploydo perfil do servidor que você está configurando.jboss-as/server/$PROFILE/deploy/[prefix]-jboss-beans.xml
Especifique o domínio de segurança do teste-domínio
No arquivo de destino escolhido no passo 1, especifique o domínio de segurançatest-domain. Este domínio contém a informação de autenticação, incluindo a definição <login-module> e a definição do módulo de política de autorização JACC.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Anexe o domínio de segurança teste-domínio-herdado
Anexe a definição da política do aplicativotest-domain-inheritedapós a política do aplicativotest-domain.Configure o atributoextendsparaother, de forma que a informação do módulo de logon é herdada.Especifique o módulo de autorização XACML no elemento<policy-module>.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie o servidor
Você precisa configurar o arquivo de destino com os domínios de segurança que usam diferentes métodos de autorização.Reinicie o servidor para garantir que a nova política de segurança tenha efeito.
8.1. Delegação de Módulo Copiar o linkLink copiado para a área de transferência!
*-jboss-beans.xml) para especificar as políticas de autorização à autenticação padrão de sua implementação, uma vez que a autorização relata o tipo de componente (não a camada) que você protege.
org.jboss.security.authorization.modules.AuthorizationModuleDelegate fornece um número de sub-classes que permitem você implementar a delegação do módulo:
AbstractJACCModuleDelegateWebPolicyModuleDelegateEJBPolicyModuleDelegateWebXACMLPolicyModuleDelegateWebJACCPolicyModuleDelegateEJBXACMLPolicyModuleDelegateEJBJACCPolicyModuleDelegate
org.jboss.security.authorization.modules.AuthorizationModuleDelegate.
Exemplo 8.2. Declaração do Módulo de Delegação
Capítulo 9. Mapeamento Copiar o linkLink copiado para a área de transferência!
org.jboss.security.mapping.providers.DeploymentRolesMappingProvider conforme valor para o atributo code no elemento <mapping-module>. Além disso, o atributo type deve ser configurado para role. Refira-se à Seção 6.3, “<mapping>” para maiores informações sobre o esquema do elemento <mapping>.
Importante
Exemplo 9.1. Declaração <mapping-module>
WEB-INF/jboss-web.xml (.war ou .sar).
Exemplo 9.2. Declaração <security-role>
WEB-INF/jboss-web.xml.
Capítulo 10. Auditoria Copiar o linkLink copiado para a área de transferência!
Importante
Importante
Procedimento 10.1. Ativação do recurso de auditoria de segurança
Abra o arquivo de configuração log4j
Navegue ao$JBOSS_HOME/server/$PROFILE/conf/Abra o arquivojboss-log4j.xmlusando um editor de texto.Descomente a categoria de auditoria de segurança
Por padrão, a definição da categoria do Provedor de Auditoria de Segurança é comentada no arquivojboss-log4j.xml. Descomente a definição de categoria apresentada no Exemplo 10.1, “Categoria do Provedor de Auditoria de Segurança log4j”.Exemplo 10.1. Categoria do Provedor de Auditoria de Segurança log4j
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Descomente o anexo de auditoria
Por padrão, a definição AUDITORIA é comentada no arquivojboss-log4j.xml. Descomente a definição do anexo apresentada no Exemplo 10.1, “Categoria do Provedor de Auditoria de Segurança log4j”.Exemplo 10.2. Categoria do Provedor de Auditoria de Segurança log4j
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Salve e reinicie o servidor
Você ativou o serviço de auditoria para sua implantação, conforme configurado no arquivojboss-log4j.xml.Reinicie o servidor para garantir que a nova política de segurança seja aplicada.Verifique se a auditoria de segurança está operando corretamente
Uma vez que o serviço de auditoria seja configurado e implantado, as entradas de log de auditoria verificarão se o serviço de auditoria e a invocação EJB foram procedidos com sucesso.O arquivoaudit.logestá localizado no diretóriojboss-as/server/$PROFILE/log/.Uma invocação EJB processada com êxito parece-se com o seguinte resultadoaudit.log.Exemplo 10.3. Entrada de log da Invocação EJB com êxito
2008-12-05 16:08:26,719 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-2:) [Success]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518; Resource:=[org.jboss.security.authorization.resources.EJBResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518}:method=public abstract org.jboss.test.security.interfaces.RunAsServiceRemote org.jboss.test.security.interfaces.RunAsServiceRemoteHome.create() throws java.rmi.RemoteException,javax.ejb.CreateException:ejbMethodInterface=Home:ejbName=RunAs:ejbPrincipal=jduke:MethodRoles=Roles(identitySubstitutionCaller,):securityRoleReferences=null:callerSubject=Subject: Principal: [roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser] Principal: Roles(members:extraRunAsRole,identitySubstitutionCaller) :callerRunAs=[roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser]:callerRunAs=[roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser]:ejbRestrictionEnforcement=false:ejbVersion=null];Source=org.jboss.security.plugins.javaee.EJBAuthorizationHelper;Exception:=;2008-12-05 16:08:26,719 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-2:) [Success]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518; Resource:=[org.jboss.security.authorization.resources.EJBResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518}:method=public abstract org.jboss.test.security.interfaces.RunAsServiceRemote org.jboss.test.security.interfaces.RunAsServiceRemoteHome.create() throws java.rmi.RemoteException,javax.ejb.CreateException:ejbMethodInterface=Home:ejbName=RunAs:ejbPrincipal=jduke:MethodRoles=Roles(identitySubstitutionCaller,):securityRoleReferences=null:callerSubject=Subject: Principal: [roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser] Principal: Roles(members:extraRunAsRole,identitySubstitutionCaller) :callerRunAs=[roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser]:callerRunAs=[roles=[identitySubstitutionCaller, extraRunAsRole],principal=runAsUser]:ejbRestrictionEnforcement=false:ejbVersion=null];Source=org.jboss.security.plugins.javaee.EJBAuthorizationHelper;Exception:=;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Uma invocação EJB processada sem êxito parece-se ao seguinte resultadoaudit.log.Exemplo 10.4. Entrada de log da Invocação EJB processada sem êxito
[Error]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518;Resource:=[org.jboss.security.authorization.resources.EJBResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518}:method=public java.security.Principal org.jboss.test.security.ejb3.SimpleStatelessSessionBean.invokeUnavailableMethod():ejbMethodInterface=Remote:ejbName=SimpleStatelessSessionBean:ejbPrincipal=UserA:MethodRoles=Roles(<NOBODY>,):securityRoleReferences=null:callerSubject=Subject: Principal: UserA Principal: Roles(members:RegularUser,Administrator) :callerRunAs=null:callerRunAs=null:ejbRestrictionEnforcement=false:ejbVersion=null];Source=org.jboss.security.plugins.javaee.EJBAuthorizationHelper;Exception:=Authorization Failed: ;[Error]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518;Resource:=[org.jboss.security.authorization.resources.EJBResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518}:method=public java.security.Principal org.jboss.test.security.ejb3.SimpleStatelessSessionBean.invokeUnavailableMethod():ejbMethodInterface=Remote:ejbName=SimpleStatelessSessionBean:ejbPrincipal=UserA:MethodRoles=Roles(<NOBODY>,):securityRoleReferences=null:callerSubject=Subject: Principal: UserA Principal: Roles(members:RegularUser,Administrator) :callerRunAs=null:callerRunAs=null:ejbRestrictionEnforcement=false:ejbVersion=null];Source=org.jboss.security.plugins.javaee.EJBAuthorizationHelper;Exception:=Authorization Failed: ;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Procedimento 10.2. Ativação da auditoria de segurança para recipientes da Web
Ative a auditoria da segurança EJB
Você deve ativar a segurança descrita no Procedimento 10.1, “Ativação do recurso de auditoria de segurança”.Ative a auditoria no realm do servidor
A auditoria do recipiente deve ser primeiramente ativada no realm do servidor do arquivoserver.xml.O arquivoserver.xmlestá localizado no diretóriojboss-as/server/$PROFILE/deploy/jbossweb.sar/.O elemento<Realm>deve possuir o atributoenableAudit="configurado, conforme o Exemplo 10.5, “server.xml audit activation”.true"Exemplo 10.5. server.xml audit activation
<Realm className="org.jboss.web.tomcat.security.JBossWebRealm" certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping" allRolesMode="authOnly" enableAudit="true"/>
<Realm className="org.jboss.web.tomcat.security.JBossWebRealm" certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping" allRolesMode="authOnly" enableAudit="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especifique a propriedade do sistema dos níveis de auditoria
Os níveis de auditoria para aplicativos da Web devem ser especificados usando a propriedade do sistema org.jboss.security.web.audit no scriptrun.bat(Microsoft Windows) ourun.sh(Linux).Alternativamente, você pode especificar a propriedade de sistema no arquivojboss-as/server/$PROFILE/deploy/properties-service.xml.Linux
Adicione a propriedade de sistema no arquivojboss-as/bin/run.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow Microsoft Windows
Adicione a propriedade de sistema ao arquivojboss-as/bin/run.batCopy to Clipboard Copied! Toggle word wrap Toggle overflow properties-service.xml
Atualize o MBean de classeSystemPropertiesServiceno arquivojboss-as/server/$PROFILE/deploy/properties-service.xmle declare a propriedade java como um <attribute>. Você pode descomentar o bloqueio do sistema de operação relevante da amostra do código abaixo.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Verifique se a auditoria de segurança está operando corretamente
Uma propriedade do sistema é especificada no arquivo, as entradas de log da auditoria verificarão se a invocação da Web foi procedida com êxito.O arquivoaudit.logestá localizado no diretóriojboss-as/server/$PROFILE/log/.Uma invocação da Web procedida com êxito parece-se com o seguinte resultadoaudit.log.Exemplo 10.6. Entrada do log da Invocação da Web processada com êxito
2008-12-05 16:08:38,997 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-17:) [Success]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518;Resource:=[org.jboss.security.authorization.resources.WebResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518,securityConstraints=[Lorg.apache.catalina.deploy.SecurityConstraint;@6feeae6, resourcePermissionCheck=true},canonicalRequestURI=/restricted/get-only/x,request=[/web-constraints:cookies=null:headers=user-agent=Jakarta Commons-HttpClient/3.0,authorization=host=localhost:8080,][parameters=],CodeSource=null];securityConstraints=SecurityConstraint[RestrictedAccess - Get Only];Source=org.jboss.security.plugins.javaee.WebAuthorizationHelper;resourcePermissionCheck=true;Exception:=;2008-12-05 16:08:38,997 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-17:) [Success]policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518;Resource:=[org.jboss.security.authorization.resources.WebResource:contextMap={policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@76ed4518,securityConstraints=[Lorg.apache.catalina.deploy.SecurityConstraint;@6feeae6, resourcePermissionCheck=true},canonicalRequestURI=/restricted/get-only/x,request=[/web-constraints:cookies=null:headers=user-agent=Jakarta Commons-HttpClient/3.0,authorization=host=localhost:8080,][parameters=],CodeSource=null];securityConstraints=SecurityConstraint[RestrictedAccess - Get Only];Source=org.jboss.security.plugins.javaee.WebAuthorizationHelper;resourcePermissionCheck=true;Exception:=;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Uma invocação EJB processada sem êxito parece-se ao seguinte resultadoaudit.log.Exemplo 10.7. Entrada do log da Invocação da Web processada sem êxito
2008-12-05 16:08:41,561 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-4:) [Failure]principal=anil;Source=org.jboss.web.tomcat.security.JBossWebRealm;request=[/jaspi-web-basic:cookies=null:headers=user-agent=Jakarta Commons-HttpClient/3.0,authorization=host=localhost:8080,][parameters=][attributes=];2008-12-05 16:07:30,129 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (WorkerThread#1[127.0.0.1:55055]:)
2008-12-05 16:08:41,561 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (http-127.0.0.1-8080-4:) [Failure]principal=anil;Source=org.jboss.web.tomcat.security.JBossWebRealm;request=[/jaspi-web-basic:cookies=null:headers=user-agent=Jakarta Commons-HttpClient/3.0,authorization=host=localhost:8080,][parameters=][attributes=];2008-12-05 16:07:30,129 TRACE [org.jboss.security.audit.providers.LogAuditProvider] (WorkerThread#1[127.0.0.1:55055]:)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Capítulo 11. Implantação dos Domínios de Segurança Copiar o linkLink copiado para a área de transferência!
- Domínio de Segurança Modular
- O método de implantação do domínio de segurança, onde a declaração do domínio de segurança está inclusa no deployment descriptor. Um domínio de segurança modular possui a forma do
*-jboss-beans.xml. Ele está incluído no diretórioMETA-INFdo EJB Jars ou no diretórioWEB-INFdo aplicativo da web (WAR). - Descritor de Implementação
- Um arquivo de configuração XML declarativa que descreve as configurações da implementação de um aplicativo. A maneira em que um aplicativo é implantado pode ser alterado com este arquivo, eliminando a necessidade de realizar alterações ao código adjacente do aplicativo.
- Declare o domínio de segurança no arquivo
jboss-as/server/$PROFILE/conf/login-config.xml. - Crie e implemente o domínio de segurança modular.
Procedimento 11.1. Configuração do Domínio de Segurança Modular
UsersRolesLoginModule para a política de autorização, no entanto você não está limitado a este módulo de logon quando criando um domínio de segurança modular. Refira-se à Seção 12.1, “Módulos de Uso” para módulos de logon adicionais lançados com a Plataforma do Aplicativo JBoss Enterprise.
Crie um descritor de implantação
Você deve criar um arquivo do descritor de implantação para conter uma configuração do domínio de segurança.Caso você já tenha criado um descritor de implantação para seu aplicativo, você pode pular este procedimento e proceder ao passo 2.Este filename possui o formulário[domain_name]-jboss-beans.xml. Enquanto o domain_name é arbritário, você deve escolher um nome que é significativo ao aplicativo para garantir o nome do descritor de implantação seja único por todo o perfil do servidor.O arquivo deve conter a declaração XML padrão e um elemento<deployment>corretamente configurado.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Defina políticas de aplicativo
Os domínios de segurança individuais são definidos com o elemento <deployment>.Segue abaixo dois domínios de segurança especificados. Cada política de autenticação usa o mesmo módulo de login e parâmetros de módulo.Nota
Outros módulos de logon estão disponíveis para uso com a Plataforma do Aplicativo Enterprise. Para maiores informações sobre os módulos de logon disponíveis, refira-se à Seção 12.1, “Módulos de Uso”.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Implemente ou empacote o descritor de implantação
Mova o arquivo do descritor de implantação para o diretóriojboss-as/server/$PROFILE/deploydo perfil do servidor solicitado em sua instalação.Caso você estiver distribuindo seu aplicativo a uma audiência mais ampla, empacote o descritor de implantação no diretórioMETA-INFdo EJB Jar ou no diretórioWEB-INFde seu aplicativo da web (WAR).
Capítulo 12. Módulos de Logon Copiar o linkLink copiado para a área de transferência!
12.1. Módulos de Uso Copiar o linkLink copiado para a área de transferência!
12.1.1. LdapLoginModule Copiar o linkLink copiado para a área de transferência!
LdapLoginModule é uma implantação LoginModule que autentica o servidor do Protocolo de Acesso ao Diretório de Peso Leve (LDAP - Lightweight Directory Access Protocol), caso seu nome de usuário e credenciais estejam armazenados num servidor LDAP que é acessado usando um provedor LDAP da Interface do Diretório e Nomeação do Java (JNDI).
Nota
- java.naming.factory.initial
- O nome da classe de implantação
InitialContextFactory. O padrão é a implantação do provedor LDAP do Suncom.sun.jndi.ldap.LdapCtxFactory. - java.naming.provider.url
- O URL do LDAP para o servidor LDAP.
- java.naming.security.authentication
- O nível do protocolo para uso. Os valores disponíveis incluem o
none,simpleestrong. Caso a propriedade seja indefinida, o comportamento é determinado pelo provedor do serviço. - java.naming.security.protocol
- O protocolo de transporte para uso de acesso de segurança. Configure a opção de configuração ao tipo do provedor do serviço (por exemplo: o SSL). Caso a propriedade seja indefinida, o comportamento será determinado pelo provedor do serviço.
- java.naming.security.principal
- Especifica a identidade do Principal para autenticação do chamador ao serviço. Ele é construído a partir de outras propriedades conforme descrito abaixo.
- java.naming.security.credentials
- Especifica os credenciais do Principal para autenticação do chamador ao serviço. Os credenciais podem levar o modelo de uma senha com hash, uma senha de texto simples, uma chave ou um certificado. Caso a propriedade for indefinida, o comportamento é determinado pelo provedor do serviço.
- principalDNPrefix
- O prefixo adicionado ao nome do usuário para formar o distinguished name do usuário. Consulte
principalDNSuffixpara maiores informações. - principalDNSuffix
- O sufixo adicionado ao nome do usuário quando formando o nome distinguido do usuário. Ele é útil caso você solicite pelo nome do usuário e não queira que o usuário insira o todo o nome distinguido. O uso desta propriedade e
principalDNSuffixleva ouserDNa ser formado comoprincipalDNPrefix + username + principalDNSuffix. - useObjectCredential
- O valor que indica o credencial deve ser obtido como um
Objectopaco usando o tipo doorg.jboss.security.auth.callback.ObjectCallbackdoCallbackao invés de uma senhachar[]usando umPasswordCallbackdo JAAS. Isto permite a passagem da informação sem-credencial para o servidor LDAP. Os valores disponíveis sãotrueefalse. - rolesCtxDN
- Ajustado, o nome distinguido do contexto para busca das funções do usuário.
- userRolesCtxDNAttributeName
- Nome de um atributo no objeto do usuário que contém o nome distinguido do contexto para busca das funções do usuário. Isto difere-se do
rolesCtxDN, de forma que o contexto de busca para funções do usuário pode ser único para cada usuário. - roleAttributeID
- Nome do atributo contendo as funções do usuário. O padrão é
roles, caso não seja especificado. - roleAttributeIsDN
- Aviso indicando se é que o roleAttributeID contém todo o nome distinguido de um objeto de função, ou o nome de função. O nome de função é obtido do valor do atributo roleNameAttributeId do nome do contexto pelo nome distinguido.Caso verdadeiro, o atributo da função representa o nome distinguido de um objeto de função. Caso seja falso, o nome de função é obtido a partir do valor de um
roleAttributeID. O padrão éfalse.Nota
Em certos esquemas de diretório (ex.: MS ActiveDirectory), os atributos de função no objeto do usuário são armazenados como Nomes Distinguidos para objetos de função ao invés de nomes simples. O roleAttributeIsDN deve ser configurado paratrue, para implantações que usam este tipo de esquema. - roleNameAttributeID
- O nome do atributo de um contexto direcionado pelo valor do nome distinguido roleCtxDN que contém o nome de função. Caso a propriedade roleAttributeIsDN seja configurada para
true, esta propriedade será usada para encontrar o atributonamedo objeto de função. O padrão égroup. - uidAttributeID
- Nome do atributo no objeto contento as funções do usuário que correspondem à ID do usuário. Isto é usado para localizar as funções do usuário. O padrão é
uid, caso não seja especificado. - matchOnUserDN
- Aviso que especifica se é que a busca por funções do usuário devem coincidir com todo o nome distinguido do usuário. Caso
true, ouserDNcompleto será usado como valor de combinação. Casofalse, apenas o nome do usuário será usado como valor de combinação em relação ao atributo uidAttributeName. O valor padrão éfalse. - unauthenticatedIdentity
- O nome principal a ser determinado sem conter qualquer informação de autenticação. Este comportamento é herdado a partir da super-classe
UsernamePasswordLoginModule. - allowEmptyPasswords
- Um aviso indicando se as senhas nulas (comprimento 0) devem ser passadas ao servidor LDAP. Uma senha vazia é tratada como um logon anônimo por alguns servidores LDAP e isto pode não ser um recurso desejado. Para rejeição de senhas nulas, configure isto para
false. Caso configurado paratrue, o servidor LDAP validará a senha nula. O padrão étrue.
InitialLdapContext com um ambiente composto de propriedades JNDI do LDAP descritas anteriormente nesta seção.
String ou o credencial Object dependendo da opção useObjectCredential.
InitialLdapContext é criada), as funções do usuário são solicitadas pela execução de uma busca da localização rolesCtxDN com os atributos determinados para os valores de opção roleAttributeName e uidAttributeName. Os nomes de função são obtidos pela invocação do método toString nos atributos de função do conjunto do resultado de busca.
Exemplo 12.1. Política da Autenticação do Módulo do Logon LDAP
java.naming.factory.initial, java.naming.factory.url e java.naming.security da configuração testLDAP <login-module> indicam as condições:
- A implantação do provedor JNDI do LDAP Sun será usada.
- O servidor LDAP está localizado no
ldaphost.jboss.orgdo host na porta 1389. - O método de autenticação simples do LDAP será usado para conexão ao servidor LDAP.
jsmith mapearia para uid=jsmith,ou=People,dc=jboss,dc=org.
- Nome Distinguido (DN)
- Num Protocolo de Acesso ao Diretório de Carga Leve (LDAP), o nome distinguido identifica unicamente um objeto num diretório. Cada nome distinguido deve possuir um nome e localização únicos a partir de todos os objetos, que é atingido usando um número de pares de valor do atributo (AVPs). Os AVPs definem informações tais como nomes comuns, unidade de organização, entre outras coisas. A combinação desses valores resulta numa sequência única solicitada pelo LDAP.
Nota
userPassword da entrada do usuário (theduke nesta amostra). A maioria dos servidores LDAP operam desta maneira. No entanto, caso o servidor LDAP manuseia autenticações de forma diferente, você deverá certificar-se que o LDAP é configurado de acordo com suas solicitações do ambiente de produção.
rolesCtxDN para entradas cujos uidAttributeID coincidem com o usuário. Caso o matchOnUserDN seja verdadeiro, a busca será baseada no DN completo do usuário. Do contrário, a busca será baseada no nome do usuário atual inserido. Nesta amostra, a busca está sob o ou=Roles,dc=jboss,dc=org para quaisquer entradas que possuem o atributo member ao uid=jduke,ou=People,dc=jboss,dc=org. A busca localizaria o cn=JBossAdmin sob a entrada das funções.
cn. O valor retornado seria o JBossAdmin, de forma que o usuário jsmith é determinado à função do JBossAdmin.
- Formato de Inter-alteração dos Dados LDAP (LDIF)
- O formato de inter-alteração de dados planos usados para representar o conteúdo do diretório LDAP e solicitações de atualização. O conteúdo do diretório é representado como uma gravação para cada solicitação de atualização e objeto. O conteúdo consiste na adição, renomeação, remoção, modificação das solicitações.
Exemplo 12.2. Amostra do Arquivo LDIF
12.1.2. Empilhamento da Senha Copiar o linkLink copiado para a área de transferência!
password-stacking para useFirstPass. Caso um módulo anterior configurado para a pilha da senha tenha autenticado o usuário, todos os demais módulos de pilha considerarão o usuário autenticado e apenas tentarão fornecer um conjunto de funções para a etapa de autorização.
password-stacking for configurada para useFirstPass, este módulo observa primeiro por um nome e senha compartilhados sob os nomes de propriedade javax.security.auth.login.name e javax.security.auth.login.password respectivamente no mapa do estado compartilhado do módulo de logon.
Nota
Exemplo 12.3. Amostra da Pilha da Senha
12.1.3. Aplicação do Hash na Senha Copiar o linkLink copiado para a área de transferência!
Exemplo 12.4. Aplicação do Hash na Senha
nobody de nome principal e contém o based64-encoded, hashes MD5 das senhas num arquivo usersb64.properties. O arquivo usersb64.properties pode fazer parte de um classpath de implantação ou ser salvo no diretório /conf.
- hashAlgorithm
- O nome do algoritmo
java.security.MessageDigestpara aplicar o hash na senha. Não existe padrão, de forma que a opção deve ser especificada para ativar o hash. Os valores típicos sãoMD5eSHA. - hashEncoding
- A sequência especifica um dos três tipos de codificação:
base64,hexourfc2617. O padrão ébase64. - hashCharset
- O conjunto de caractere de codificação usado para converter a senha de texto simples a um array de byte. A codificação do padrão da plataforma é o padrão.
- hashUserPassword
- Especifica que o algorismo hash deve ser aplicado à senha que o usuário submete. A senha do usuário com hash é comparada ao valor no módulo de logon, que espera-se ser um hash da senha. O padrão é
true. - hashStorePassword
- Especifica que o algorismo hash deve ser aplicado à senha armazenada ao lado do servidor. Isto é usado para resumir a autenticação, onde o usuário submete um hash da senha do usuário com os tokens específicos de solicitação a partir do servidor a ser comparado. O algorismo hash (para resumir, isto seria
rfc2617) é utilizado para computar o hash ao lado do servidor, que deve coincidir o valor com hash enviado a partir do cliente.
the org.jboss.security.Util fornece um método de ajuda estático que efetuará o hash numa senha usando a codificação especificada.
String hashedPassword = Util.createPasswordHash("MD5",
Util.BASE64_ENCODING, null, null, "password");
String hashedPassword = Util.createPasswordHash("MD5",
Util.BASE64_ENCODING, null, null, "password");
echo -n password | openssl dgst -md5 -binary | openssl base64
echo -n password | openssl dgst -md5 -binary | openssl base64
X03MO1qnZdYdgyfeuILPmQ==. Este valor deve ser armazenado num armazenamento do usuário.
12.1.4. Identidade não-autenticada Copiar o linkLink copiado para a área de transferência!
unauthenticated identity é uma opção de configuração do módulo de logon que determina uma identidade específica (convidado, por exemplo) para solicitações que são feitas com a informação não associada. Isto pode ser usado para permitir os servlets não-protegidos para invocar os métodos no EJBs que não requerem uma função específica. Tal principal não possui funções associadas e pode apenas associar tanto os métodos EJB ou EJBs não assegurados que são associados com a restrição de permissão não selecionada.
- unauthenticatedIdentity: define o nome principal que deve ser determinado para solicitações que não contém a informação de autenticação.
12.1.5. UsersRolesLoginModule Copiar o linkLink copiado para a área de transferência!
UsersRolesLoginModule é um módulo de logon que suporta usuários múltiplos e funções de usuários carregadas de arquivos de propriedades Java. O arquivo de mapeamento nome-para-senha do usuário é chamado users.properties e o arquivo de mapeamento de nome-para-funções é chamado roles.properties.
- usersProperties
- Nome do recurso (arquivo) de propriedades contendo o nome do usuário para mapeamentos de senha. O padrão é
<filename_prefix>-users.properties. - rolesProperties
- Nome do recurso (arquivo) de propriedades contendo o nome de usuário para mapeamentos de funções. O padrão é
<filename_prefix>-roles.properties.
Exemplo 12.5. UserRolesLoginModule
ejb3-sampleapp-users.properties no Exemplo 12.5, “UserRolesLoginModule” usa o formato username=password com cada entrada de usuário numa linha separada:
username1=password1 username2=password2 ...
username1=password1
username2=password2
...
ejb3-sampleapp-roles.properties referenciado no Exemplo 12.5, “UserRolesLoginModule” usa o username=role1,role2, padrão com o valor do nome do grupo opcional. Por exemplo:
username1=role1,role2,... username1.RoleGroup1=role3,role4,... username2=role1,role3,...
username1=role1,role2,...
username1.RoleGroup1=role3,role4,...
username2=role1,role3,...
ejb3-sampleapp-roles.properties é usado para determinar as funções do nome do usuário para o grupo nomeado em particular onde a porção XXX do nome da propriedade é o nome do grupo. O formulário user name=... é uma abreviação para user name.Roles=..., onde o nome do grupo Roles é um nome padrão que o JaasSecurityManager espera conter as funções que definem permissões aos usuários.
jduke:
jduke=TheDuke,AnimatedCharacter jduke.Roles=TheDuke,AnimatedCharacter
jduke=TheDuke,AnimatedCharacter
jduke.Roles=TheDuke,AnimatedCharacter
12.1.6. DatabaseServerLoginModule Copiar o linkLink copiado para a área de transferência!
DatabaseServerLoginModule é o módulo do logon na Conectividade do Banco de Dados do Java - Java Database Connectivity (JDBC) que suporta a autenticação e o mapeamento da função. Use este módulo de logon caso você possua o nome do usuário, senha e informação da função armazenada num banco de dados relacional.
Nota
DatabaseServerLoginModule é baseado em duas tabelas lógicas:
Table Principals(PrincipalID text, Password text) Table Roles(PrincipalID text, Role text, RoleGroup text)
Table Principals(PrincipalID text, Password text)
Table Roles(PrincipalID text, Role text, RoleGroup text)
Principals associa o PrincipalID do usuário com a senha válida e a tabela Roles associa o PrincipalID do usuário com os próprios conjuntos de funções. As funções usadas para permissões do usuário devem estar contidas em filas com um valor de coluna RoleGroup do Roles.
java.sql.ResultSet possua a mesma estrutura lógica às das tabelas Principals e Roles descritas anteriormente. Os nomes atuais das tabelas e colunas não são relevantes uma vez que os resultados são acessados baseando-se no índice da coluna.
Principals e Roles, conforme já declarado. As seguintes declarações preenchem as tabelas com os seguintes dados:
- O
PrincipalIDjavacom oPassworddoechomanna tabelaPrincipals. - O
PrincipalIDjavacom a função nomeadaEchonoRolesRoleGroupda tabelaRoles. - O
PrincipalIDjavacom a função nomeadacaller_javanoCallerPrincipalRoleGroupda tabelaRoles.
INSERT INTO Principals VALUES('java', 'echoman')
INSERT INTO Roles VALUES('java', 'Echo', 'Roles')
INSERT INTO Roles VALUES('java', 'caller_java', 'CallerPrincipal')
INSERT INTO Principals VALUES('java', 'echoman')
INSERT INTO Roles VALUES('java', 'Echo', 'Roles')
INSERT INTO Roles VALUES('java', 'caller_java', 'CallerPrincipal')
- dsJndiName
- O nome do JNDI para o
DataSourcedo banco de dados contendo as tabelasPrincipalseRoles. O padrão éjava:/DefaultDS, caso não seja especificado. - principalsQuery
- A consulta de declaração preparada é equivalente a:
select Password from Principals where PrincipalID=?. Essa será a declaração preparada utilizada, caso não seja especificada. - rolesQuery
- A consulta de declaração preparada é equivalente a:
select Role, RoleGroup from Roles where PrincipalID=?. Essa será a declaração preparada utilizada, caso não seja especificada. - ignorePasswordCase
- Um aviso boolean indicando se a comparação de senha deve ignorar o caso. Isto pode ser útil para a codificação de senha com hash onde o caso da senha com não é significativo.
- principalClass
- Uma opção que especifica uma classe de implementação
Principal. Isto deve suportar um construtor levando um argumento de sequência para o nome principal.
DatabaseServerLoginModule pode ser construída conforme abaixo:
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64)) CREATE TABLE UserRoles(username VARCHAR(64), userRoles VARCHAR(32))
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64))
CREATE TABLE UserRoles(username VARCHAR(64), userRoles VARCHAR(32))
login-config.xml correspondente parece-se com o seguinte:
12.1.7. BaseCertLoginModule Copiar o linkLink copiado para a área de transferência!
BaseCertLoginModule autentica usuários baseados nos certificados X509. Um caso típico de uso para o módulo de logon é a autenticação CLIENT-CERT na camada da web.
CertRolesLoginModule e DatabaseCertLoginModule estendem o comportamento para obter as funções de autorização de ambos banco de dados ou arquivo de propriedades.
BaseCertLoginModule precisa de um KeyStore para executar a validação do usuário. Isto é obtido através de uma implantação org.jboss.security.SecurityDomain. Normalmente, a implantação SecurityDomain é configurada usando o org.jboss.security.plugins.JaasSecurityDomain MBean conforme apresentado neste fragmento de configuração jboss-service.xml:
jmx-console do nome, com uma implantação SecurityDomain disponível através do JNDI sob o java:/jaas/jmx-console do nome. O domínio de segurança segue o padrão de nomeamento do domínio de segurança do JBossSX.
Procedimento 12.1. Proteção dos Aplicativos da Web com os Certificados e Autorização baseada na Função
jmx-console.war, usando os certificados de cliente e a autorização baseada da função.
Declaração dos Recursos e Funções
Modifique oweb.xmlpara declarar os recursos a serem protegidos com as funções permitidas e domínio de segurança a serem usados para a autenticação e autorização.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especificação do Domínio de Segurança do JBoss
Especifique o domínio de segurança solicitado nojboss-web.xml.<jboss-web> <security-domain>jmx-console</security-domain> </jboss-web>
<jboss-web> <security-domain>jmx-console</security-domain> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especificação da Configuração do Módulo de Logon
Define a configuração do módulo de logon para o domínio de segurança do jmx-console que você acabou de especificar. Isto é realizado no arquivoconf/login-config.xml.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
BaseCertLoginModule é usado para autenticação do cert do cliente e o UsersRolesLoginModule é apenas usado para a autorização devido à opção password-stacking=useFirstPass. Ambos os localhost.keystore e jmx-console-roles.properties requerem uma entrada que mapeia o associado principal ao cert do cliente.
Exemplo 12.6. Amostra de Certificado
localhost.keystore precisa do certificado no Exemplo 12.6, “Amostra de Certificado” armazenado com um alias do CN=unit-tests-client, OU=JBoss Inc., O=JBoss Inc., ST=Washington, C=US. O jmx-console-roles.properties também precisa de uma entrada para a mesma entrada. Uma vez que o DN contém caracteres que são normalmente tratados como delimitadores, você deverá fugir do problema com caracteres usando uma barra invertida ('\'), conforme ilustrado abaixo.
# Um arquivo roles.properties de amostra para uso com o UsersRolesLoginModule CN\=unit-tests-client,\ OU\=JBoss\ Inc.,\ O\=JBoss\ Inc.,\ ST\=Washington,\ C\=US=JBossAdmin admin=JBossAdmin
# Um arquivo roles.properties de amostra para uso com o UsersRolesLoginModule
CN\=unit-tests-client,\ OU\=JBoss\ Inc.,\ O\=JBoss\ Inc.,\ ST\=Washington,\ C\=US=JBossAdmin
admin=JBossAdmin
12.1.8. IdentityLoginModule Copiar o linkLink copiado para a área de transferência!
IdentityLoginModule é um módulo de logon\nsimples que associa o nome do usuário de código rígido a qualquer assunto autenticado em relação ao módulo. Ele cria uma instância SimplePrincipal usando o nome especificado pela opção principal.
Nota
- principal
- Este é o nome a ser usado no
SimplePrincipal, sendo que todos os usuários são autenticados como tal. O padrão do nome principal éguest, caso nenhuma opção do principal seja especificada. - funções
- Esta é a lista de vírgula delimitada das funções que serão determinadas ao usuário.
jduke e determina os nomes de função determinados do TheDuke e AnimatedCharacter:
12.1.9. RunAsLoginModule Copiar o linkLink copiado para a área de transferência!
RunAsLoginModule (org.jboss.security.auth.spi.RunAsLoginModule) é um módulo de ajuda que envia uma execução como função na pilha durante a fase de logon de autenticação, além de lançar a execução como função tanto na fase de confirmação ou abortação.
RunAsLoginModule deve ser configurado antes dos módulos de logon que requerem uma execução como função estabelecida.
- roleName
- Nome da função para uso como a execução durante a fase de logon. Caso não especificado, o padrão do
nobodyserá usado.
12.1.10. Criação do RunAsIdentity Copiar o linkLink copiado para a área de transferência!
javax.security.auth.Subject ou uma instância org.jboss.security.RunAsIdentity. Ambas as classes armazenam um ou mais principais que representam a identidade e uma lista de funções que a identidade possui. No caso do javax.security.auth.Subject, uma lista de credenciais é também armazenada.
ejb-jar.xml, você especifica uma ou mais funções que um usuário deve acessar para os diversos métodos EJB. Uma comparação destas listas mostra se o usuário possui uma das funções necessárias para acessar o método EJB.
Exemplo 12.7. Criação do org.jboss.security.RunAsIdentity
ejb-jar.xml, você especifica um elemento <security-identity> com uma função <run-as> definida como o filho do elemento <session>.
<run-as-principal> no arquivo jboss-web.xml.
<security-identity> em ambos os arquivos ejb-jar.xml e jboss-web.xml são analisados no período de implantação. O nome da função <run-as> e o nome <run-as-principal> são armazenados na classe org.jboss.metadata.SecurityIdentityMetaData.
Exemplo 12.8. Determinação de funções múltiplas a um RunAsIdentity
jboss-web.xml do grupo do elemento <assembly-descriptor>.
<run-as-principal> da "Marca" foi criado. A configuração nesta amostra estende a função "Admin" pela adição da função "Suporte". A nova função contém principais extras, incluindo o principal definido originalmente "John".
<security-role> em ambos os arquivos ejb-jar.xml e jboss.xml são analisados no período de implantação. O <role-name> e os dados <principal-name> são armazenados na classe org.jboss.metadata.SecurityIdentityMetaData.
12.1.11. ClientLoginModule Copiar o linkLink copiado para a área de transferência!
ClientLoginModule (org.jboss.security.ClientLoginModule) é uma implantação do LoginModule para uso dos clientes JBoss, com o objetivo de estabelecer a identidade do chamador e credenciais. Basicamente, isto determina o org.jboss.security.SecurityAssociation.principal ao valor do NameCallback preenchido pelo callbackhandler e o org.jboss.security.SecurityAssociation.credential para o valor do PasswordCallback preenchido pelo callbackhandler.
ClientLoginModule é o único mecanismo suportado por um cliente para estabelecer o chamador do segmento atual. Ambos os aplicativos do cliente autônomo e os ambientes do servidor (atuando como clientes do JBoss EJB onde o ambiente de segurança não foi configurado para uso do JBossSX) devem usar o ClientLoginModule.
ClientLoginModule.
- multi-threaded
- O valor que especifica a maneira que os segmentos de logon conectam-se às fontes de armazenamento credencial e principal. Cada segmento de logon possui o próprio armazenamento credencial e principal e cada segmento separado deve executar o próprio logon, quando configurado para verdadeiro. Isto é útil em ambientes onde as identidades do usuário múltiplo são ativas em segmentos separados. A identidade de logon e as credenciais são variáveis aplicáveis a todos os segmentos no VM, quando configurado para falso. A configuração padrão é
false. - password-stacking
- Ativa a autenticação ao lado dos clientes usando outros módulos de logon tais como o
LdapLoginModule. Quando a opçãopassword-stackingfor configurada parauseFirstPass, o módulo primeiramente observa o nome de usuário compartilhado e senha usando ojavax.security.auth.login.nameejavax.security.auth.login.passwordrespectivamente no mapa do estado compartilhado do módulo de logon. Isto permite que um módulo configurado anteriormente à estabelecer um nome e senha de usuário do JBoss válidos. - restore-login-identity
- O valor que especifica se é que o principal e credencial
SecurityAssociationvistos na entrada do métodologin()estão salvos e restaurados tanto quando abortando ou finalizando. Isto é necessário se você alterar as identidades e restaurar a identidade do chamador original. A informação principal e credencial são salvas e restauradas quando anulando ou finalizando, caso configurado paratrue. Caso configurado paraSecurityAssociation, a anulação ou finalização esvaziarão oSecurityAssociation.
12.2. Módulos Personalizados Copiar o linkLink copiado para a área de transferência!
JaasSecurityManager requer um padrão de uso particular do conjunto de principais Subject. Você deve entender os recursos da classe de informação da classe do Sujeito JAAS e o uso esperado desses recursos para gravar um módulo de logon que funciona com o JaasSecurityManager.
LoginModule básicas abstratas que podem ajudá-lo a implantar os módulos de logon personalizados.
Subject pelo uso dos seguintes métodos:
getPrincipals() e getPrincipals(java.lang.Class) para as identidades e funções do Subject. Segue abaixo o uso padrão:
- As identidades do usuário (por exemplo: nome do usuário, número de segurança social e ID do empregado) conforme armazenado com os objetos
java.security.Principalno conjuntoSubjectPrincipals. A implementaçãoPrincipalque representa a identidade do usuário deve basear-se nas comparações e igualdade do nome do principal. Uma implantação útil está disponível como a classeorg.jboss.security.SimplePrincipal. Outras instânciasPrincipalpodem ser adicionadas ao conjuntoSubjectPrincipalsconforme seja necessário. - As funções determinadas do usuário estão também armazenadas no conjunto
Principalse estão agrupadas nos conjuntos de função nomeados usando as instânciasjava.security.acl.Group. A interfaceGroupdefine uma coleção dePrincipals e/ouGroups, além de ser uma sub-interface dojava.security.Principal. - Qualquer número de conjuntos de funções podem ser determinados a um
Subject.
- O framework do JBossSX usa dois conjuntos de funções bem conhecidos pelos nomes de
RoleseCallerPrincipal.- O grupo
Rolesé uma coleção dePrincipals para funções nomeadas conforme o domínio do aplicativo pelo qual oSubjecté autenticado. Este conjunto de função é usado por métodos como oEJBContext.isCallerInRole(String), em que os EJBs podem usar para verificar se o chamador atual pertence à função do domínio do aplicativo nomeado. A lógica do interceptor de segurança que executa as checagens de permissão do método usa também este conjunto de função. - O
CallerPrincipalGroupconsiste da identidadePrincipalúnica determinada ao usuário no domínio do aplicativo. O métodoEJBContext.getCallerPrincipal()usa oCallerPrincipalpara permitir que o domínio do aplicativo realize o mapeamento a partir da identidade do ambiente de operação à identidade do usuário adequada ao aplicativo. Caso oSubjectnão possua umCallerPrincipalGroup, a identidade de aplicativo é o mesmo como a identidade de ambiente operacional.
12.2.1. Suporte Padrão de Uso do Assunto Copiar o linkLink copiado para a área de transferência!
Subject autenticado com o padrão de modelo que reforça o uso do Subject correto, com o objetivo de simplificar a implantação correta do uso padrão descrito na Seção 12.2, “Módulos Personalizados”.
O módulo mais genérico dos dois é a classe org.jboss.security.auth.spi.AbstractServerLoginModule.
javax.security.auth.spi.LoginModule e oferece métodos abstratos para as tarefas chave específicas à infra-estrutura de segurança do ambiente. Os detalhes chave da classe estão descritos no Exemplo 12.9, “Fragmento da Classe AbstractServerLoginModule”. Os comentários do JavaDoc destacam as responsabilidades das sub-classes.
Importante
loginOk é experimental. Ela deve ser configurada para true, caso o logon for bem sucedido ou false por qualquer sub-classes que substituem o método de logon. Caso esta variável for incorretamente usada, o método de confirmação não atualizará corretamente o assunto.
Exemplo 12.9. Fragmento da Classe AbstractServerLoginModule
O segundo módulo de logon base abstrato apto para os módulos de logon personalizados é o org.jboss.security.auth.spi.UsernamePasswordLoginModule.
char[] conforme as credenciais de autenticação. Ele suporta também o mapeamento de usuários anônimos (indicados pelo nome do usuário e senha nulos) para um principal sem funções. Os detalhes chave da classe estão destacadas no fragmento da classe seguinte. Os comentários do JavaDoc detalham as responsabilidades das sub-classes.
Exemplo 12.10. Fragmento da Classe UsernamePasswordLoginModule
A escolha da sub-classificação do AbstractServerLoginModule versus UsernamePasswordLoginModule simplesmente baseia-se no fato do nome do usuário e credenciais baseados na sequência a serem usados ou não pela tecnologia de autenticação que você está gravando para o módulo de logon. Caso a semântica baseada na sequência for válida, o UsernamePasswordLoginModule será sub-classificado. Do contrário, o AbstractServerLoginModule será sub-classificado.
As etapas, pelas quais seu módulo de logon personalizado deve executar, dependem de qual classe de módulo de logon básico você escolher. Quando gravando o módulo de logon personalizado, que integra sua infra-estrutura de segurança, você deve iniciar pela sub-classificação do AbstractServerLoginModule ou UsernamePasswordLoginModule para garantir que seu módulo fornece a informação Principal autenticada pela forma esperada pelo gerenciador de segurança do JBossSX.
AbstractServerLoginModule:
void initialize(Subject, CallbackHandler, Map, Map): caso você possua opções de personalização para análise.boolean login(): para executar a atividade da autenticação. Certifique-se de configurar a variável da instâncialoginOkpara verdadeiro caso o logon for bem sucedido e falso caso ele falhar.Principal getIdentity(): para retornar o objetoPrincipalpara o usuário autenticado pela etapalog().Group[] getRoleSets(): para retornar pelo menos umGroupnomeadoRolesque contém as funções determinadas aoPrincipalautenticado durante ologin(). O segundoGroupcomum é nomeadoCallerPrincipale fornece a identidade do aplicativo do usuário ao invés da identidade do domínio de segurança.
UsernamePasswordLoginModule:
void initialize(Subject, CallbackHandler, Map, Map): caso você possua opções de personalização para análise.Group[] getRoleSets(): para retornar pelo menos umGroupnomeadoRolesque contém as funções determinadas aoPrincipalautenticado durante ologin(). O segundoGroupcomum é nomeadoCallerPrincipale fornece a identidade do aplicativo do usuário ao invés da identidade do domínio de segurança.String getUsersPassword(): para retornar a senha esperada pelo nome de usuário atual disponível através do métodogetUsername(). O métodogetUsersPassword()é chamado a partir dologin()após ocallbackhandlerretornar o nome do usuário e senha do candidato.
12.2.2. Amostra do LoginModule Personalizado Copiar o linkLink copiado para a área de transferência!
UsernamePasswordLoginModule e obtém uma senha de usuário e nomes de função a partir da observação do JNDI.
password/<username> do formulário (onde o <username> é o usuário atual sendo autenticado). Similarmente, uma busca do roles/<username> do formulário retorna funções de usuário requeridas.
JndiUserAndPass.
UsernamePasswordLoginModule, tudo o que o JndiUserAndPass realiza é obter a senha e funções do usuário a partir do armazenamento JNDI. O JndiUserAndPass não interage com as operações LoginModule do JAAS.
Exemplo 12.11. Módulo de Logon Personalizado do JndiUserAndPass
org.jboss.book.security.ex2.service.JndiStore MBean. Este serviço vincula um ObjectFactory que retorna um javax.naming.Context proxy ao JNDI. O proxy manuseia as operações de busca realizadas pela checagem do prefixo do nome de busca em relação ao password e roles.
password, a senha do usuário é solicitada. Quando o nome iniciar por roles, as funções do usuário serão solicitadas. A implementação da amostra sempre retorna uma senha de theduke e um array de nomes de funções igual ao {"TheDuke", "Echo"}, independente do nome de usuário. Você pode experimentar este procedimento com outras implementações.
META-INF/jboss.xml determina o domínio de segurança.
<?xml version="1.0"?> <jboss> <security-domain>security-ex2</security-domain> </jboss>
<?xml version="1.0"?>
<jboss>
<security-domain>security-ex2</security-domain>
</jboss>
META-INF/login-config.xml do SAR define a configuração do módulo de logon.
Parte III. Criptografia e Segurança Copiar o linkLink copiado para a área de transferência!
Capítulo 13. Protocolo de Senha Remota de Segurança Copiar o linkLink copiado para a área de transferência!
Este documento descreve um mecanismo de autenticação de rede potente criptográfica conhecido como protocolo da Senha Remota de Segurança - Secure Remote Password (SRP). Este mecanismo é útil para negociação de conexões de segurança usando uma senha de usuário fornecida, enquanto eliminando os problemas de segurança tradicionalmente associados com as senhas reutilizáveis. Além disso, o sistema executa uma troca da chave de segurança no processo de autenticação, permitindo camadas de segurança (privacidade e/ou proteção de integridade) a serem ativadas durante a sessão. Os servidores de chave confiável e infra-estruturas de certificado não são solicitados e os clientes não precisam armazenar ou gerenciar quaisquer chaves de longo termo. O SPR oferece ambas vantagens de implantação e segurança sobre técnicas de respostas de desafio existentes, fazendo disto uma substituição ideal onde a autenticação de senha é necessária.
- Uma implementação do protocolo de introdução do SRP que é independente de qualquer protocolo de cliente/servidor particular.
- Uma implementação RMI de protocolo de introdução como uma implementação SRP do servidor/cliente padrão.
- Uma implementação JAAS
LoginModuleao lado do cliente que usa uma implementação para uso de autenticação dos clientes num modo de segurança. - Um JMX MBean para gerenciamento da implantação do servidor RMI. O MBean permite que a implementação do servidor RMI seja conectável ao JMX framework e que externaliza a configuração do armazenamento de informação de verificação. Isto também estabiliza um cache de autenticação que é vinculado ao JNDI namespace do servidor do JBoss.
- Uma implementação JAAS
LoginModuleao lado do servidor que usa um cache de autenticação gerenciado pelo SRP JMX MBean.
Figura 13.1. Os componentes do JBossSX do framework do cliente-servidor SRP.
LoginModule do JAAS personalizado, ao lado do cliente, que comunica-se com o servidor de autenticação através de um org.jboss.security.srp.SRPServerInterface proxy. O cliente ativa a autenticação usando o SRP pela criação de uma entrada de configuração de logon que inclui o org.jboss.security.srp.jaas.SRPLoginModule. Este módulo suporta as seguintes opções de configuração:
- principalClassName
- Valor constante configurado para
org.jboss.security.srp.jaas.SRPPrincipal. - srpServerJndiName
- O nome do JNDI do objeto usado para comunicar-se com o servidor da autenticação do SRP. Caso ambas opções
srpServerJndiNameesrpServerRmiUrlforem especificadas, osrpServerJndiNameleve prioridade sobre osrpServerRmiUrl. - srpServerRmiUrl
- A sequência URL do protocolo RMI para a localização do
SRPServerInterfaceproxy usado para comunicar-se com o servidor de autenticação SRP. - externalRandomA
- Aviso que especifica se é que um componente aleatório da chave pública do cliente "A" deve vir do retorno de chamada do usuário. Isto pode ser usado para inserir um número qualquer criptográfico a partir de um token de hardware. O recurso é ativado, caso ele seja configurado para
true. - hasAuxChallenge
- O aviso que especifica se é que uma sequência será enviada ao servidor com um desafio adicional para validação do servidor. Caso a sessão do cliente suportar uma codificação de criptografia, a criptografia temporária será criada usando a chave privada da sessão e o objeto de desafio enviado com um
javax.crypto.SealedObject. O recurso será desativado, caso configurado paratrue. - multipleSessions
- O sinalizador especifica se é que o cliente gerado pode possuir sessões ativas múltiplas de logon. O recurso será ativado, caso ativado para
true.
InitialContext. Isto é útil caso a interface do servidor SRP não esteja disponível no InitialContext padrão.
SRPLoginModule e ClientLoginModule padrão podem ser configurados para permitir que credenciais sejam usadas para validação de acesso para os componentes do Java EE de segurança. Uma amostra de configuração de logon pode ser encontrada no Exemplo 13.1, “Entrada de Configuração de Segurança”.
Exemplo 13.1. Entrada de Configuração de Segurança
org.jboss.security.srp.SRPService MBean. O outro MBean é o org.jboss.security.srp.SRPVerifierStoreService.
org.jboss.security.srp.SRPService é responsável por expor uma versão RMI acessível do SRPServerInterface assim como uma atualização do cache da sessão de autenticação SRP.
- JndiName
- Especifica o nome pelo qual o SRPServerInterface proxy deve estar disponível. Esta é a localização onde o
SRPServicerealiza o bind no proxy do dinâmico serializável para oSRPServerInterface. O valor padrão ésrp/SRPServerInterface. - VerifierSourceJndiName
- Especifica o nome da implementação
SRPVerifierSourceque oSRPServicedeve usar. O padrão do nome JNDI de fonte ésrp/DefaultVerifierSource. - AuthenticationCacheJndiName
- Especifica o nome pelo qual a implementação da autenticação
org.jboss.util.CachePolicyusada para informação de autenticação de cache o bind é aplicado. O padrão do cache JNDI de autenticação ésrp/AuthenticationCache. - ServerPort
- O portal RMI para o
SRPRemoteServerInterface. O valor padrão é 10099. - ClientSocketFactory
- Nome da classe de implementação
java.rmi.server.RMIClientSocketFactorypersonalizada opcional usada durante a exportação doSRPServerInterface. O valor padrão éRMIClientSocketFactory. - ServerSocketFactory
- Nome da classe de implementação
java.rmi.server.RMIServerSocketFactorypersonalizada opcional usada durante a exportação doSRPServerInterface. O valor padrão éRMIServerSocketFactory. - AuthenticationCacheTimeout
- O intervalo da política de cache (em segundos). O valor padrão é 1800 (30 minutos).
- AuthenticationCacheResolution
- Especifica a resolução da política de cache (em segundos). Isto controla o intervalo entre as checagens para intervalos. O valor padrão é 60 (1 minuto).
- RequireAuxChallenge
- Configurado caso um cliente fornecer um desafio auxiliar como parte da fase de verificação. Isto fornece controle sobre a configuração
SRPLoginModuleusada pelo cliente independente da opçãouseAuxChallengeestar ativada ou não. - OverwriteSessions
- Especifica se é que uma autenticação do usuário com êxito para uma sessão existente deve ser substituída ou não na sessão atual. Isto controla o comportamento do cache da sessão SRP do servidor quando clientes não tiverem ativado a sessão múltipla por modo de usuário. Caso configurado para
false, a segunda tentativa de autenticação do usuário será concluída com êxito, no entanto a sessão SRP resultante não substituirá o estado da sessão SRP anterior. O valor padrão éfalse. - VerifierStoreJndiName
- Especifica a localização da implementação do armazenamento da informação de senha SRP que deve ser fornecida e disponibilizada através do JNDI.
org.jboss.security.srp.SRPVerifierStoreService é um serviço MBean de amostra que aplica o bind na implementação da interface SRPVerifierStore, que usa um arquivo dos objetos serializados como um armazenamento de persistência. Mesmo que não isto não seja realístico para um ambiente de produção, ele permite testes para o protocolo SRP e fornece uma amostra de solicitações para um serviço SRPVerifierStore.\n
SRPVerifierStoreService MBean incluem o seguinte:
- JndiName
- O nome JNDI pelo qual a implementação
SRPVerifierStoredeve estar disponível. O padrão ésrp/DefaultVerifierSource, caso não seja especificado. - StoreFile
- A localização do arquivo de armazenamento do objeto serializado do verificador de senha do usuário. Isto pode ser tanto um URL ou um nome de recurso a ser encontrado no classpath. O padrão é
SRPVerifierStore.ser, caso não seja especificado.
SRPVerifierStoreService MBean também suporta as operações addUser e delUser para adição e remoção de usuários. As assinaturas são as seguintes:
public void addUser(String username, String password) throws IOException; public void delUser(String username) throws IOException;
public void addUser(String username, String password) throws IOException;
public void delUser(String username) throws IOException;
13.1. Entendendo o Algoritmo Copiar o linkLink copiado para a área de transferência!
Nota
- O
SRPLoginModuleao lado do cliente restaura a partir do serviço de nomeação da instância SRPServerInterface para o servidor de autenticação remoto. - O
SRPLoginModuleseguinte ao lado do cliente solicita que os parâmetros SRP associem-se com o nome do usuário na tentativa do logon. Existe um número de parâmetros envolvidos no algoritmo SRP que devem ser escolhidos quando a senha do usuário é primeiro transformada na forma de verificador usada pelo algoritmo SRP. Ao invés da codificação rígida aos parâmetros (que poderia ser feita com um risco mínimo de segurança), a implantação do JBossSX permite que um usuário restaure esta informação como parte de seu protocolo Exchange. A chamadagetSRPParameters(username)restaura os parâmetros do SRP para o nome do usuário gerado. - O
SRPLoginModuleao lado do cliente inicia uma sessão SRP pela criação de um objetoSRPClientSessionusando o nome do usuário do logon, senha de texto simples e parâmetros SRP obtidos na etapa 2. O cliente então cria um número aleatório A que será usado para construir a chave de sessão SRP primária. Em seguida, o cliente inicializa ao lado do servidor da sessão SRP pela invocação do métodoSRPServerInterface.inite passa o nome do usuário e cliente gerados no número aleatórioA. O servidor retorna seu próprio número aleatórioB. Esta etapa corresponde à troca das chaves públicas. - O
SRPLoginModuleao lado do cliente obtém uma chave de sessão SRP privada que é gerada como um resultado de trocas de mensagens anteriores. Isto é salvo como um credencial privado noSubjectdo logon. A resposta do desafio do servidorM2a partir da etapa 4 é verificada pela invocação do métodoSRPClientSession.verify. Caso isto suceda, a autenticação mútua do cliente para o servidor, e do servidor para o cliente são completadas. OSRPLoginModuleao lado do cliente seguinte cria umM1de desafio para o servidor pela invocação do métodoSRPClientSession.response, passando o número aleatórioBdo servidor como um argumento. Este desafio é enviado ao servidor através do métodoSRPServerInterface.verifye a resposta do servidor é salva como umM2. Esta etapa corresponde a uma troca de desafios. Nessas alturas, o servidor verificou que o usuário é quem ele disse ser. - O
SRPLoginModuleao lado do cliente salva o nome do usuário do logon e o desafio doM1no mapa sharedState doLoginModule. Isto é usado como nome e credenciais do Principal peloClientLoginModuledo JBoss padrão. O desafio doM1é usado no lugar da senha como prova de identidade em quaisquer métodos de invocação nos componentes do Java EE. O desafio doM1é um hash forte de criptografia associado com a sessão SRP. Não é possível obter a senha do usuário através desta própria intercepção através de terceiros. - No final deste protocolo de autenticação, o SRPServerSession é posicionado no cache de autenticação do SRPService para uso subsequente pelo
SRPCacheLoginModule.
- A maneira pela qual o JBoss desanexa o protocolo de transporte do método a partir do recipiente pode permitir que um usuário rastreio o desafio
M1do SRP e use efetivamente o desafio para realizar solicitações como do nome do usuário associado. Os interceptores personalizados podem ser usados para prevenir o problema, pela criptografia do desafio usando a chave de sessão do SRP. - O SRPService mantém um cache de sessões SRP que entram em intervalo após um período configurável. Após elas entrarem no intervalo, qualquer acesso do componente Java EE falhará uma vez que não há mecanismo para renegociação transparente dos credenciais de autenticação SRP. Você deve tanto configurar o período para intervalo do cache bem longo ou manusear a re-autenticação em seu código na falha.
Nota
O SRPService suporta as durações do intervalo até 2,147,483,647 segundos ou aproximadamente 68 anos. - Por padrão, pode haver apenas uma sessão SRP para um nome de usuário gerado por padrão. A sessão é classificada como com estado, uma vez que a sessão SRP negociada produz uma chave de sessão privada que pode ser usada para criptografia e descriptografia entre o cliente e servidor. O JBoss suporta múltiplas sessões de SRP por usuário, no entanto não é possível criptografar dados com uma chave de sessão e descriptografá-la com outra.
org.jboss.security.srp.jaas.SRPCacheLoginModule, com o objetivo de usar a autenticação SPR de ponta-à-ponta. O SRPCacheLoginModule possui uma opção de configuração única nomeada cacheJndiName que determina a localização JNDI da instância CachePolicy de autenticação SRP. Isto deve corresponder ao valor de atributo AuthenticationCacheJndiName do SRPService MBean.
SRPCacheLoginModule autentica os credenciais do usuário pela obtenção do desafio do cliente a partir do objeto SRPServerSession no cache de autenticação e comparação do mesmo ao desafio passado como credenciais do usuário. A Figura 13.2, “SRPCacheLoginModule com o Cache de Sessão SRP” ilustra a operação da implantação do método SRPCacheLoginModule.login.
Figura 13.2. SRPCacheLoginModule com o Cache de Sessão SRP
13.2. Configuração da Informação de Senha Remota de Segurança Copiar o linkLink copiado para a área de transferência!
SRPVerifierStore que integra-se com seus armazenamentos de informação de segurança existentes. Informações sobre a interface SRPVerifierStore podem ser encontradas no Exemplo 13.2, “A interface SRPVerifierStore ”.
Nota
SRPVerifierStore não é recomendada para um ambiente de segurança de produção uma vez que isto requer todas as informações hash de senha a serem disponibilizadas como um arquivo de objetos serializados.
Exemplo 13.2. A interface SRPVerifierStore
SRPVerifierStore é fornecer acesso ao objeto SRPVerifierStore.VerifierInfo para o nome do usuário gerado. O método getUserVerifier(String) é chamado pelo SRPService no início de uma sessão SRP do usuário para obter os parâmetros necessários pelo algorítimo SRP. Os elementos dos objetos são os seguintes:
- user name
- O nome ou id do usuário usado para o logon.
- verifier
- O hash unidirecional de senha ou PIN que o usuário insere como prova de identidade. A classe
org.jboss.security.Utilpossui um métodocalculateVerifierque executa o algoritmo hash de senha. A senha resultante leva a forma deH(salt | H(username | ':' | password)), ondeHé a função hash de segurança SHA, conforme definido pelo RFC2945. O nome do usuário é convertido a partir da sequência a umbyte[], usando a codificação UTF-8. - salt
- Número alternado usado para aumentar a dificuldade do ataque de dicionário de força bruta na verificação do banco de dados de senha, no evento em que o banco de dados estiver comprometido. O valor deve ser gerado a partir de um algoritmo de número aleatório quando a senha de texto simples existente estiver com hash.
- g
- O gerador primitivo do algoritmo SRP. Ele pode ser um parâmetro fixo conhecido ao invés de uma configuração por usuário. A classe de utilidade
org.jboss.security.srp.SRPConffornece diversas configurações para og, incluindo o padrão útil obtido através doSRPConf.getDefaultParams().g(). - N
- Os módulos de segurança primordial do algoritmo SRP. Isto pode ser um parâmetro fixo bem conhecido ao invés de uma configuração por usuário. A classe da utilidade
org.jboss.security.srp.SRPConffornece diversas configurações para oN, incluindo um bom padrão que pode ser obtido através doSRPConf.getDefaultParams().N().
Procedimento 13.1. Integração do Armazenamento de Senha Existente
Crie o Armazenamento da Informação de Senha com Hash
Caso suas senhas já tenham sido armazenadas em um formulário com hash irreversível, este procedimento pode apenas ser feito baseando-se no usuário (por exemplo, como parte de um procedimento de atualização).Você pode implementar osetUserVerifier(String, VerifierInfo)como um métodonoOp, ou um método que lança uma exceção declarando que o armazenamento é de leitura apenas.Crie uma Interface SRPVerifierStore
Você deve criar uma implementação de interfaceSRPVerifierStorepersonalizada que entende como obter oVerifierInfoa partir do armazenamento criado.OverifyUserChallenge(String, Object)pode ser usado para integrar um token de hardware existente baseado em esquemas como SafeWord ou Radius no algoritmo SRP. Este método de interface é chamado apenas quando uma configuraçãoSRPLoginModulede cliente especifica a opçãohasAuxChallenge.Crie o JNDI MBean
Você deverá criar um MBean que expõe a interfaceSRPVerifierStoredisponível ao JNDI e expõe quaisquer parâmetros configuráveis requeridos.Oorg.jboss.security.srp.SRPVerifierStoreServicepermitirá que você implemente isto, embora você possa implementar também o MBean usando a implementação do arquivo de propriedades Java doSRPVerifierStore(refira-se à Seção 13.3, “Amostra da Senha Remota de Segurança”).
13.3. Amostra da Senha Remota de Segurança Copiar o linkLink copiado para a área de transferência!
SecurityConfig MBean. Uma implantação personalizada da interface SRPVerifierStore é também usada na amostra. A interface usa um armazenamento em memória que é gerado a partir do arquivo de propriedades Java, ao invés do armazenamento do objeto serializado conforme usado pelo SRPVerifierStoreService.
org.jboss.book.security.ex3.service.PropertiesVerifierStore. Segue abaixo os conteúdos do JAR que contém a amostra dos serviços EJB e SRP.
jboss-service.xml do security-ex3.sar está descrito no Exemplo 13.3, “O Descritor security-ex3.sar jboss-service.xml”.
Exemplo 13.3. O Descritor security-ex3.sar jboss-service.xml
ServiceConfig, o PropertiesVerifierStore e o SRPService MBeans. Perceba que o atributo JndiName do PropertiesVerifierStore é igual ao atributo VerifierSourceJndiName do SRPService. Além disso, o SRPService depende do PropertiesVerifierStore. Isto é solicitado uma vez que o SRPService precisa de uma implantação da interface SRPVerifierStore para acesso à informação da verificação da senha do usuário.
Exemplo 13.4. Configuração JAAS padrão ao lado do cliente.
SRPLoginModule com um valor de opção srpServerJndiName que corresponde ao valor do atributo SRPService JndiName do componente do servidor do JBoss (srp-test/SRPServerInterface). O ClientLoginModule deve também ser configurado com o valor password-stacking="useFirstPass" para propagar os credenciais de autenticação do usuário gerado pelo SRPLoginModule à camada de invocação EJB.
Exemplo 13.5. A configuração XMLLoginConfig ao lado do servidor
- A opção de configuração
cacheJndiName=srp-test/AuthenticationCacheinforma oSRPCacheLoginModulesobre a localização doCachePolicyque contém oSRPServerSessionpara usuários que foram autenticados em relação aoSRPService. Este valor corresponde aoSRPServicede valor do atributoAuthenticationCacheJndiName. - A configuração inclui um
UsersRolesLoginModulecom a opção de configuraçãopassword-stacking=useFirstPass. Você deve usar um segundo módulo de logon com oSRPCacheLoginModule, uma vez que o SRP é apenas uma tecnologia de autenticação. Para determinação de funções do principal que em troca determina as permissões associadas, um segundo módulo de logon deve ser configurado para aceitar os credenciais de autenticação validados peloSRPCacheLoginModule.
UsersRolesLoginModule aumenta a autenticação SRP pelo arquivo de propriedades baseado na autorização. As funções do usuário são obtidas a partir do arquivo roles.properties no EJB JAR.
examples/logs, o arquivo ex3-trace.log contém um rastro detalhado ao lado do cliente do algoritmo SRP. Os rastros apresentam passo-a-passo da construção das chaves públicas, desafios, chave de sessão e verificação.
Echo.echo()#2 falha com uma exceção de autenticação. O código do cliente é suspenso por 15 segundos após realizar a primeira chamada para demonstrar o comportamento da expiração do cache SRPService. O intervalo da política de cache SRPService é configurado para 10 segundos para forçar este problema. Você deve configurar o intervalo do cache corretamente ou manusear a re-autenticação na falha, conforme descrito na Seção 13.3, “Amostra da Senha Remota de Segurança”.
Capítulo 14. Gerenciador de Segurança do Java Copiar o linkLink copiado para a área de transferência!
- Gerenciador de Segurança do Java
- O Gerenciador de Segurança do Java é uma classe que gerencia o limite externo da área restrita da Máquina Virtual do Java (JVM), controlando como a execução do código com o JVM pode interagir com os recursos fora do JVM. Quando o Gerenciador de Segurança do Java é ativado, o Java API checa com o gerenciador de segurança pela aprovação antes de executar uma porção de operações potencialmente perigosas.
- Política de Segurança
- Um conjunto de permissões definidas para classes diferentes de código. O Gerenciador de Segurança compara ações solicitadas por aplicativos em relação à política de segurança. Caso uma ação seja permitida pela política, o Gerenciador de Segurança permitirá que a ação seja efetuada. Caso a ação não seja permitida pela política, o Gerenciador de Segurança irá negar aquela ação. A política de segurança pode definir permissões baseadas na localização do código ou na assinatura do código.
java.security.manager e java.security.policy.
Opções relacionadas ao Gerenciador de Segurança
- java.security.manager
- Usa um gerenciador de segurança, opcionalmente especificando qual gerenciador de segurança a ser usado. Caso nenhum argumento seja fornecido com esta opção, o gerenciador de segurança JDK padrão,
java.lang.SecurityManager, será usado. Forneça o classname inteiramente qualificado de uma subclasse dojava.lang.SecurityManagercom esta opção, caso deseje usar outra implementação de segurança. - java.security.policy
- Especifica um arquivo de política para argumentar ou substituir a política de segurança para a MV. Esta opção possui duas formas:
java.security.policy=policyFileURL- O arquivo de política referenciado policyFileURL irá argumentar a política de segurança padrão configurada pela MV.
java.security.policy==policyFileURL- O arquivo de política referenciado pelo policyFileURL irá substiruir a política de MV.
O valor policyFileURL pode ser um URL ou um caminho de arquivo.
14.1. Uso do Gerenciador de Segurança Copiar o linkLink copiado para a área de transferência!
jboss-as/bin/server.policy.cert é adicionado como ponto inicial.
O arquivo run.conf (Linux) ou run.conf.bat (Windows) é usado para configurar o Gerenciador de Segurança e a política de segurança. Este arquivo é encontrado no diretório jboss-as/bin.
run.conf global ou arquivo run.conf.bat a partir do jboss-as/bin/ para o perfil do servidor (por exemplo: jboss-as/server/production/run.conf) e realizar as alterações da configuração. O arquivo de configuração no perfil do servidor possui precedência sobre o arquivo run.conf / run.conf.bat global quando o perfil do servidor é iniciado.
Procedimento 14.1. Ativação do Gerenciador de Segurança
run.conf (Linux) ou run.conf.bat (Windows) no diretório do perfil do servidor, caso existir algum, ou no jboss-as/bin. Refira-se ao Arquivo de Configuração para maiores detalhes sobre a localização deste arquivo.
Especificação do diretório da página principal do JBoss.
Edite o arquivorun.conf(Linux) ourun.conf.bat(Windows). Adicione a opçãojboss.home.dir, especificando o caminho ao diretóriojboss-asde sua instalação.LinuxJAVA_OPTS="$JAVA_OPTS -Djboss.home.dir=/path/to/jboss-eap-5.1/jboss-as"
JAVA_OPTS="$JAVA_OPTS -Djboss.home.dir=/path/to/jboss-eap-5.1/jboss-as"Copy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsJAVA_OPTS="%JAVA_OPTS% -Djboss.home.dir=c:\path\jboss-eap-5.1\jboss-as"
JAVA_OPTS="%JAVA_OPTS% -Djboss.home.dir=c:\path\jboss-eap-5.1\jboss-as"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especificação do diretório de página principal
Adicione a opçãojboss.server.home.dir, especificando o caminho para seu perfil de servidor.LinuxJAVA_OPTS="$JAVA_OPTS -Djboss.server.home.dir=path/to/jboss-eap-5.1/jboss-as/server/production"
JAVA_OPTS="$JAVA_OPTS -Djboss.server.home.dir=path/to/jboss-eap-5.1/jboss-as/server/production"Copy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsJAVA_OPTS="%JAVA_OPTS% -Djboss.server.home.dir=c:\path\to\jboss-eap-5.1\jboss-as\server\production"
JAVA_OPTS="%JAVA_OPTS% -Djboss.server.home.dir=c:\path\to\jboss-eap-5.1\jboss-as\server\production"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especificação do Manuseador do Protocolo
Adicione a opçãojava.protocol.handler.pkgs, especificando o manuseador stub do JBoss.LinuxJAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.jboss.handlers.stub"
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.jboss.handlers.stub"Copy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsJAVA_OPTS="%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.jboss.handlers.stub"
JAVA_OPTS="%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.jboss.handlers.stub"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Especificando a política de segurança para uso
Adicione a variável$POLICY, especificando a política de segurança em uso. Adicione a definição da variável antes da linha que ativa o Gerenciador de Segurança.Exemplo 14.1. Use a política de segurança incluída na Plataforma
POLICY="server.policy.cert"
POLICY="server.policy.cert"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ativação do Gerenciador de Segurança
Descomente a linha seguinte pela remoção do#inicial:Linux#JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY"
#JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Windows#JAVA_OPTS="%JAVA_OPTS% -Djava.security.manager -Djava.security.policy=%POLICY%"
#JAVA_OPTS="%JAVA_OPTS% -Djava.security.manager -Djava.security.policy=%POLICY%"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:A Plataforma do Aplicativo do JBoss Enterprise está configurada para iniciar com o Gerenciador de Segurança ativado.
Opcional: Importação da chave de assinatura do JBoss da Red Hat
A política de segurança incluída concede permissões ao código assinado do JBoss. Você deverá importar a chave de assinatura do JBoss para o armazenamento da chavecacerts, caso você use a política incluída.O seguinte comando assume que oJAVA_HOMEda variável do ambiente seja configurado à localização do JDK suportada pela Plataforma do Aplicativo JBoss Enterprise 5. Você deve configurar oJAVA_HOMEquando instalar a Plataforma do Aplicativo Enterprise 5 pela primeira vez. Refira-se ao Installation Guide para maiores informações.Nota
Você pode usar o comandoalternativespara selecionar a partir dos JDKs instalados em seu sistema Linux, com o objetivo de garantir de que o JVM correto está instalado. Refira-se ao Apêndice A, Configuração do JDK padrão com a Utilidade/usr/sbin/alternativespara maiores informações.Execute o seguinte comando num terminal:Linuxsudo $JBOSS_HOME/bin/keytool -import -alias jboss -file JBossPublicKey.RSA \ -keystore $JAVA_HOME/lib/security/cacerts
[~]$ sudo $JBOSS_HOME/bin/keytool -import -alias jboss -file JBossPublicKey.RSA \ -keystore $JAVA_HOME/lib/security/cacertsCopy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsC:> $JBOSS_HOME\bin\keytool -import -alias jboss -file JBossPublicKey.RSA -keystore $JAVA_HOME\lib\security\cacerts
C:> $JBOSS_HOME\bin\keytool -import -alias jboss -file JBossPublicKey.RSA -keystore $JAVA_HOME\lib\security\cacertsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Os comandos acima devem ser inseridos em uma única linha num terminal, embora separados em linhas diferentes neste terminal.Nota
A senha padrão para o armazenamento da chave cacerts échangeit.Resultado:A chave usada para a assinatura do código da Plataforma do Aplicativo JBoss Enterprise está instalada.
14.2. Depuração dos Problemas da Política de Segurança Copiar o linkLink copiado para a área de transferência!
java.security.debug configura o nível de informação relacionada à segurança relatada.
java -Djava.security.debug=help produzirá um resultado de ajuda com todas as opções de depuração. A configuração à nível de depuração para all é útil quando a solucionando o problema de uma falha relacionada com a segurança, cuja causa é totalmente desconhecida. No entanto, isto produzirá muita informação para uso geral. O padrão geral de sensibilidade é access:failure.
Procedimento 14.2. Ativação da depuração geral
- Adicione a seguinte linha ao arquivo
run.conf(Linux) ourun.conf.bat(Windows):LinuxJAVA_OPTS="$JAVA_OPTS -Djava.security.debug=access:failure"
JAVA_OPTS="$JAVA_OPTS -Djava.security.debug=access:failure"Copy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsJAVA_OPTS="%JAVA_OPTS% -Djava.security.debug=access:failure"
JAVA_OPTS="%JAVA_OPTS% -Djava.security.debug=access:failure"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.2.1. Depuração do Gerenciador de Segurança Copiar o linkLink copiado para a área de transferência!
Nota
org.jboss.system.security.DebuggingJavaSecurityManager imprime o domínio de proteção correspondente a uma permissão com falha. Esta informação adicional é bastante útil quando depurando os problemas de permissão.
Procedimento 14.3. Ativação do Gerenciador de Segurança de Depuração
- Adicione a opção ao
$JBOSS_HOME/bin/run.conf(Linux) ou$JBOSS_HOME/bin/run.conf.bat. Consulte o Arquivo de Configuração para a localização deste arquivo.LinuxJAVA_OPTS="$JAVA_OPTS -Djava.security.manager=org.jboss.system.security.DebuggingJavaSecurityManager"
JAVA_OPTS="$JAVA_OPTS -Djava.security.manager=org.jboss.system.security.DebuggingJavaSecurityManager"Copy to Clipboard Copied! Toggle word wrap Toggle overflow WindowsJAVA_OPTS="%JAVA_OPTS% -Djava.security.manager=org.jboss.system.security.DebuggingJavaSecurityManager"
JAVA_OPTS="%JAVA_OPTS% -Djava.security.manager=org.jboss.system.security.DebuggingJavaSecurityManager"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Comente todas as referências
java.security.managerno arquivo. - Certifique-se de que o arquivo ainda contém uma opção
java.security.policyespecificando o arquivo da política para uso. - Ative a depuração geral seguindo as instruções no Procedimento 14.2, “Ativação da depuração geral”.
Nota
14.3. Gravação da Política de Segurança para a Plataforma do Aplicativo do JBoss Enterprise Copiar o linkLink copiado para a área de transferência!
jboss-as/bin/server.policy.cert é um exemplo da política de segurança para a Plataforma do Aplicativo JBoss Enterprise. Você pode utilizá-lo como base para sua própria política de segurança.
policytool, incluído com o JDK, fornece uma ferramenta gráfica para edição e gravação da política de segurança.
Importante
java.security.AllPermission: você pode potencialmente permitir alterações ao binário do sistema, incluindo o ambiente do período de rodagem JVM.
java.lang.RuntimePermissions específico do JBoss está descrito abaixo:
Permissões do Período de Rodagem específico do JBoss
org.jboss.security.SecurityAssociation.getPrincipalInfo- Fornece acesso aos métodos
org.jboss.security.SecurityAssociation getPrincipal()egetCredential(). O risco relacionado com o uso desta permissão do período de rodagem é a habilidade de verificar o chamador do segmento atual e credenciais. org.jboss.security.SecurityAssociation.getSubject- Fornece acesso ao método
org.jboss.security.SecurityAssociation getSubject(). org.jboss.security.SecurityAssociation.setPrincipalInfo- Fornece acesso aos métodos
org.jboss.security.SecurityAssociation setPrincipal(),setCredential(),setSubject(),pushSubjectContext()epopSubjectContext(). O risco de uso desta permissão do período de rodagem é a habilidade de configurar o chamador do segmento atual e credenciais. org.jboss.security.SecurityAssociation.setServer- Fornece acesso ao método
org.jboss.security.SecurityAssociation setServer. O risco de uso desta permissão do período de rodagem é a habilidade de ativar ou desativar o armazenamento múltiplo de segmentação do chamador da entidade de segurança do chamador e credenciais. org.jboss.security.SecurityAssociation.setRunAsRole- Fornece acesso aos métodos
org.jboss.security.SecurityAssociation pushRunAsRoleepopRunAsRole,pushRunAsIdentityepopRunAsIdentity. O risco de uso desta permissão do período de rodagem é a habilidade de alterar o chamador atual rodando como entidade de segurança da função. org.jboss.security.SecurityAssociation.accessContextInfo- Fornece acesso aos métodos
org.jboss.security.SecurityAssociation accessContextInfo, "Get"eaccessContextInfo, "Set", permitindo que você determine e obtenha a informação do contexto de segurança atual. org.jboss.naming.JndiPermission- Fornece permissões especiais aos arquivos e diretórios num caminho da árvore JNDI ou recursivamente a todos os arquivos e subdiretórios. Um JndiPermission consiste de um pathname e de um conjunto de permissões válidas relacionadas ao arquivo ou diretório.As permissões disponíveis incluem:
bind,rebind,unbind,lookup,list,listBindings,createSubcontexteall.Os pathnames terminando com/*indicam que as permissões especificadas são aplicadas a todos os arquivos e diretórios do pathname. Os pathnames terminando em/-indicam permissões a todos os arquivos e diretórios do pathname. Os pathnames que contém um token<<ALL BINDINGS>>especial combinando com qualquer arquivo em qualquer diretório. org.jboss.security.srp.SRPPermission- A classe de permissão personalizada para proteção de acesso à informação SRP confidencial como a chave de sessão privada e chave privada. Esta permissão não possui quaisquer ações definidas. O getSessionKey também fornece acesso à chave de sessão privada resultada a partir da negociação SRP. O acesso a esta chave permitirá que você criptografe e descriptografe as mensagens que foram criptografadas com a chave de sessão.
org.hibernate.secure.HibernatePermission- Esta classe de permissão fornece permissões básicas para proteção das sessões do Hibernate. O destino desta propriedade é o nome da entidade. As informações disponíveis incluem: insert , delete , update , read , * (all).
org.jboss.metadata.spi.stack.MetaDataStackPermission- Fornece uma classe de permissão personalizada para controle de como os chamadores interagem com a pilha dos metadados. As permissões disponíveis são:
modify(push/pop na pilha),peek(peek an pilha) e*(todos). org.jboss.config.spi.ConfigurationPermission- Protege a determinação das propriedades de configuração. Define apenas os nomes de destino da permissão e não as ações. Os destinos para esta propriedade incluem: <property name> - propriedade pela qual o código possui permissão para configuração; * - todas as propriedades.
org.jboss.kernel.KernelPermission- Protege o acesso à configuração do kernel. Isto define apenas os nomes do destino de permissão e nenhuma das ações. Os destinos para esta propriedade incluem: access - acesso à configuração do kernel, configure - configuração do kernel (o acesso é imperativo) e * - todos acima.
org.jboss.kernel.plugins.util.KernelLocatorPermission- Protege acesso ao kernel. Define apenas os nomes do destino de permissão e nenhuma ação. Os destinos para esta propriedade incluem: kernel - acesso ao kernel e * - acesso a todas as áreas.
Capítulo 15. Proteção da camada de transporte EJB RMI Copiar o linkLink copiado para a área de transferência!
Este capítulo descreve a configuração de dois planos diferentes para o RMI dos EJB3s sobre um transporte criptografado: RMI + SSL e RMI através dos HTTPS. O HTTPS é uma opção de transporte para o RMI quando a configuração do firewall previne o uso das portas RMI.
15.1. Visão Geral de Criptografia do SSL Copiar o linkLink copiado para a área de transferência!
15.1.1. Pares Chaves e Certificados Copiar o linkLink copiado para a área de transferência!
A Infra-estrutura da Chave Pública depende de uma corrente de confiança para estabelecer as credenciais de máquinas desconhecidas. O uso de chaves públicas não encripta apenas o tráfego entre máquinas, mas também trabalha para estabelecer a identidade da máquina de outra parte da conexão de rede. Uma "Confiança da Web" é usada para verificar a identidade dos servidores. Você pode desconhecer um servidor, mas caso sua chave pública é assinada por alguém de sua confiança, você estende aquela confiança ao servidor. As Autoridades de Certificado são entidades comerciais que verificam a identidade de clientes e emitem isto como certificados assinados. O JDK inclui um arquivo cacerts com os certificados de diversas Autoridades de Certificado - Certificate Authorities (CAs). Quaisquer chaves assinadas por estes CAs são automaticamente confiáveis. Neste caso, o certificado assinado da Autoridade de Certificado interna é normalmente instalada em clientes como parte da Construção Padrão Empresarial e todos os certificados assinados com aquele certificado serão confiáveis. Os certificados assinados CA são a melhor prática para cenários de produção.
cacerts dos clientes, você precisa expor um certificado para aquela chave no servidor e importar aquele certificado em qualquer cliente que conecta-se através do SSL.
keytool, uma ferramenta de linha de comando para geração de pares chaves e certificados. Os certificados gerados pelo keytool podem ser enviados para assinatura do CA ou podem ser distribuídos aos clientes como um certificado de auto-assinatura.
- Maiores informações sobre a geração de um certificado de auto-assinatura para uso de desenvolvimento e importação do mesmo certificado podem ser encontradas na Seção 15.2.1, “Geração de um certificado auto-assinado com o keytool”.
- A geração de um certificado e possuir o mesmo assinado por um CA para uso de produção vai além do descrito nesta edição. Por favor refira-se ao manpage em keytool para maiores informações sobre a execução desta tarefa.
15.2. Geração de chaves de criptografia e certificado Copiar o linkLink copiado para a área de transferência!
15.2.1. Geração de um certificado auto-assinado com o keytool Copiar o linkLink copiado para a área de transferência!
15.2.1.1. Geração de um par chave Copiar o linkLink copiado para a área de transferência!
localhost.keystore. Você precisará disponibilizar este armazenamento ao invocador EJB3 no servidor. O par chave na nossa amostra será salvo no armazenamento chave sob o alias 'ejb-ssl'. Nós precisaremos deste alias chave, e a senha do par chave que você fornecerá (se alguma), quando configurando o conector Remoto EJB3 no Crie um conector remoto de segurança para o RMI.
Procedimento 15.1. Gere o novo par chave e adicione-o ao "localhost.keystore" do armazenamento chave no diretório config do servidor do JBoss.
- O seguinte comando criará um par chave de uso com a criptografia SSL:
keytool -genkey -alias ejb-ssl -keystore localhost.keystore -storepass KEYSTORE_PASSWORD -keypass EJB-SSL_KEYPAIR_PASSWORD -dname "CN=SERVER_NAME,OU=QE,O=example.com,L=Brno,C=CZ"
keytool -genkey -alias ejb-ssl -keystore localhost.keystore -storepass KEYSTORE_PASSWORD -keypass EJB-SSL_KEYPAIR_PASSWORD -dname "CN=SERVER_NAME,OU=QE,O=example.com,L=Brno,C=CZ"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:Um novo par chave será adicionado ao
localhost.keystorede armazenamento chave sob o aliasejb-ssl.Os parâmetros para este comando podem ser encontrados no Parâmetroskeytool
Parâmetros keytool
- alias
- Um token alfanumérico usado para identificar o par chave com o armazenamento chave. O armazenamento chave pode conter as chaves múltiplas. O alias fornece um significado para exclusivamente identificar um par chave com um armazenamento chave. O alias para um par chave deve ser único com o armazenamento chave.
- keystore
- O par chave que será usado para armazenar o par chave. Isto pode ser um caminho de arquivo absoluto ou relativo.
- storepass
- A senha para um armazenamento chave. Caso o armazenamento chave existir, deverá existir também uma senha para o armazenamento chave. Caso a senha do armazenamento chave especificada não existir ainda, ela poderá ser criada e esta será a nova senha. Esta senha é necessária para acessar o armazenamento chave para recuperar ou armazenar chaves e certificados.
- keypass
- A senha para o novo par chave. Esta senha deve ser fornecida para uso de um par chave no futuro.
- dname
- Os detalhes de identificação do certificado.
- CN
- Nome Comum: o nome do servidor. Ele deve coincidir com o nome do servidor conforme retornado aos clientes numa pesquisa JNDI. Caso um cliente tente realizar uma conexão SSL no servidor usando um nome do JNDI e receber um certificado com um nome diferente, a conexão falhará.
- OU
- Unidade Organizacional: o nome da unidade organizacional que é responsável pelo servidor.
- O
- Organização: O nome da organização, às vezes expressado como um URL.
- L
- Localização: a localização do servidor.
- C
- País: duas letras de código do país
Nota
keytool adiciona o novo armazenamento chave chamado keystore, no diretório principal do usuário atual. Este arquivo de armazenamento chave é um arquivo oculto.
15.2.1.2. Exportação de um certificado auto-assinado Copiar o linkLink copiado para a área de transferência!
ejb-ssl a partir do armazenamento chave nomeado localhost.keystore.
Procedimento 15.2. Exportação de um certificado
- Emita o seguinte comando:
keytool -export -alias ejb-ssl -file mycert.cer -keystore localhost.keystore
keytool -export -alias ejb-ssl -file mycert.cer -keystore localhost.keystoreCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Insira a senha do armazenamento chaveResultado:
O certificado é exportado ao
mycert.cerdo arquivo.
15.2.2. Configure um cliente para aceitar um certificado do servidor auto-assinado Copiar o linkLink copiado para a área de transferência!
Procedimento 15.3. Importe o certificado ao "localhost.truststore" do armazenamento de confiança
- Emita o seguinte comando no cliente:
keytool -import -alias ejb-ssl -file mycert.cer -keystore localhost.truststore
keytool -import -alias ejb-ssl -file mycert.cer -keystore localhost.truststoreCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Entre a senha para este armazenamento de confiança caso ele já exista. Do contrário, insira e re-insira a senha para um novo armazenamento de confiança.
- Verifique os detalhes do certificado. Caso seja o correto, digite "sim" para importá-lo ao armazenamento de confiança.Resultado:
O certificado é importado ao armazenamento de confiança e uma conexão de segurança pode ser estabelecida com o servidor que usa este certificado.
Após importar o certificado do servidor de auto-assinatura a um armazenamento de confiança no cliente, você deverá instruir o cliente a usar este armazenamento de confiança. Para isto, passe a localização localhost.truststore ao aplicativo usando a propriedade javax.net.ssl.trustStore e a senha de armazenamento de confiança usando a propriedade javax.net.ssl.trustStorePassword. O Exemplo 15.1, “Invocação do aplicativo com.acme.Runclient com um armazenamento de confiança específico” é uma amostra de comando que invoca o com.acme.RunClient do aplicativo, um aplicativo hipotético que realiza chamadas de métodos remotas a um EJB no Servidor do Aplicativo JBoss. Este comando é executado a partir do root do diretório do pacote do aplicativo (o diretório contendo o com no com/acme/RunClient.class do caminho do arquivo).
Exemplo 15.1. Invocação do aplicativo com.acme.Runclient com um armazenamento de confiança específico
java -cp $JBOSS_HOME/client/jbossall-client.jar:. -Djavax.net.ssl.trustStore=${resources}/localhost.truststore \
-Djavax.net.ssl.trustStorePassword=TRUSTSTORE_PASSWORD com.acme.RunClient
java -cp $JBOSS_HOME/client/jbossall-client.jar:. -Djavax.net.ssl.trustStore=${resources}/localhost.truststore \
-Djavax.net.ssl.trustStorePassword=TRUSTSTORE_PASSWORD com.acme.RunClient
15.3. Configuração EJB3 RMI + SSL Copiar o linkLink copiado para a área de transferência!
Procedimento 15.4. Configure o RMI + SSL para uma Visão Geral do EJB3
- Geração de chaves de criptografia e certificado
- Configure um conector remoto de segurança para o RMI
- Anote os EJB3 beans para uso do conector RMI de segurança
O ejb3-connectors-jboss-beans.xml do arquivo num diretório deploy do perfil do Servidor do Aplicativo JBoss contém as definições do conector do JBoss Remoting para a invocação de método remoto EJB3.
Exemplo 15.2. Amostra do Conector EJB3 de Segurança
ejb3-connectors-jboss-beans.xml. Ambos os beans são solicitados para configurar um conector de segurança para o EJB3 usando o par chave criado no Procedimento 15.1, “Gere o novo par chave e adicione-o ao "localhost.keystore" do armazenamento chave no diretório config do servidor do JBoss.”.
keyPassword na configuração de amostra é a senha especificada do par chave quando o par chave foi criado.
Todos os EJB3 beans usam o conector RMI por padrão. Anote o bean com o @org.jboss.annotation.ejb.RemoteBinding para ativar a invocação remota de um bean através do SSL.
Exemplo 15.3. A anotação EJB3 bean para ativar a invocação remota de segurança
StatefulSSL do nome JNDI. A implementação proxy da interface remota, retornada a um cliente quando o bean é solicitado a partir do JNDI, comunica-se com o servidor através do SSL.
Nota
Você pode ativar ambas invocações do método remoto de segurança e insegurança. O Exemplo 15.4, “Anotação do EJB3 para invocação de segurança e sem segurança” demonstra as anotações para isto.
Exemplo 15.4. Anotação do EJB3 para invocação de segurança e sem segurança
Nota
0.0.0.0, significando "todas as interfaces" no Exemplo 15.4, “Anotação do EJB3 para invocação de segurança e sem segurança”. Altere isto para o valor da propriedade de sistema ${jboss.bind.address}.
StatefulNormal a partir do JNDI, o roxy retornado implementando a interface remota comunica-se com o servidor através do protocolo do soquete descriptografado. Caso o StatefulSSL for solicitado, o proxy retornado implementando a interface remota comunica-se com o servidor através do SSL.
15.4. EJB3 RMI através da Configuração HTTPS Copiar o linkLink copiado para a área de transferência!
Procedimento 15.5. Configure o EJB3 RMI através da Visão Geral HTTPS
- Gera as chaves de criptografia e certificados.
- Configura o RMI através do conector da web HTTPS.
- Configura Servlets.
- Configura o conector remoto de segurança para o RMI através do HTTPS.
- Configura os EJB3 beans para o transporte HTTPS.
- Configura clientes para o RMI através do HTTPS.
Procedimento 15.6. Configuração do RMI através do conector da web HTTPS.
- Edite o
jboss-as/server/$PROFILE/deploy/jbossweb.sar/server.xmldo arquivo e descomente o conector HTTPS.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Você criou um conector da web para aceitar as conexões SSL.
Procedimento 15.7. Configuração de Servlets
ServletServerInvoker.
- Crie um diretório nomeado
servlet-invoker.warnojboss-as/server/$PROFILE/deploy/. - Cire um diretório
WEB-INFno diretórioservlet-invoker.war. - Crie um arquivo nomeado
web.xmlnaquele diretórioWEB-INFcom o seguinte conteúdo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:Você criou um servlet para envio de solicitações SSL do recipiente da web a um chamador do servidor.
locatorUrl é usado para conectar o servlet ao conector remoto através do atributo InvokerLocator do conector remoto definido no Procedimento 15.8, “Configuração do conector remoto de segurança para RMI através do HTTPS” .
Procedimento 15.8. Configuração do conector remoto de segurança para RMI através do HTTPS
- Crie um arquivo nomeado
servlet-invoker-service.xmlnojboss-as/server/$PROFILE/deploy/, com o seguinte conteúdo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Você criou um conector remoto que pode receber solicitações a partir do servlet e chamar métodos de um EJB3.
Procedimento 15.9. Configuração dos EJB3 beans para transporte HTTPS
- Anote o bean para o RMI através do HTTPS:
Exemplo 15.5. Anotação de um EJB3 através do HTTPS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:O EJB3 está disponível para invocação remota através do HTTPS.
Você pode anotar opcionalmente o bean de invocação através do RMI através do HTTP. Este procedimento pode ser útil para testes, uma vez que isto permite que você passe chamadas RMI através de firewalls que bloqueiam portas RMI, mas que removem a camada extra da configuração de segurança.
Exemplo 15.6. Anotação de um bean para RMI através do HTTP
O cliente EJB deve usar as seguintes propriedades para a busca JNDI quando pesquisando por beans:
O acesso do cliente ao RMI através do HTTP(S)
- HTTPS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - HTTP
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
jboss-as/$PROFILE/deploy/http-invoker.sar/invoker.war/WEB-INF/jboss-web.xml .
15.5. Configuração EJB2 RMI + SSL Copiar o linkLink copiado para a área de transferência!
Procedimento 15.10. Configuração SSL para Visão Geral do EJB2
- Geração de chaves de criptografia e certificado
- Configuração do Chamador Unificado para o SSL
A invocação remota do EJB2 usa um chamador unificado único, que roda por padrão na porta 4446. A configuração do chamador unificado usado para a invocação remota do EJB2 está definida no arquivo $JBOSS_HOME/server/deploy/remoting-jboss-beans.xml de um perfil do Servidor do Aplicativo JBoss. Adicione o seguinte SSL Socket Factory bean e um SSL Domain bean neste arquivo.
Exemplo 15.7. Fábrica do Servidor SSL para o EJB2
$JBOSS_HOME/server/$PROFILE/conf/jboss-service.xml de um perfil do Servidor do Aplicativo JBoss:
Exemplo 15.8. Configuração SSLSocketBuilder
Atualize o código para refletir na informação abaixo, no arquivo deploy/remoting-jboss-beans.xml do perfil do Servidor do Aplicativo JBoss:
Exemplo 15.9. Transporte SSL para Beans
Capítulo 16. Mascarando senhas na Configuração XML Copiar o linkLink copiado para a área de transferência!
16.1. Visão Geral de Mascaramento da Senha Copiar o linkLink copiado para a área de transferência!
Nota
Procedimento 16.1. Visão geral de uma senha de texto simples
- Gera um par de chaves para uso da criptografia de senhas.
- Encripta a senha do armazenamento chave.
- Cria máscaras de senha.
- Substitui as senhas de texto simples pelas máscaras de senha.
16.2. Gera um armazenamento de chave e uma senha mascarada. Copiar o linkLink copiado para a área de transferência!
jboss num armazenamento de chave no jboss-as/bin/password/password.keystore.
Procedimento 16.2. Criação de um par de chaves e armazenamento de chave para mascaramento de senha.
- Altere o diretório para o diretório
jboss-as/bin/passworda partir da linha de comando. - Use o
keytoolpara gerar um par de chave com o seguinte comando:keytool -genkey -alias jboss -keyalg RSA -keysize 1024 -keystore password.keystore
keytool -genkey -alias jboss -keyalg RSA -keysize 1024 -keystore password.keystoreCopy to Clipboard Copied! Toggle word wrap Toggle overflow Importante:Você deverá especificar a mesma senha para o armazenamento da chave e o par de chave.
- Opcional:
Disponibilize o password.keystore resultante para leitura pelo processo do Servidor do Aplicativo JBoss para o proprietário apenas.
Isto é realizado nos sistemas baseados no Unix pelo uso do comando para alterar a propriedade do processo do Servidor do Aplicativo JBoss do proprietário e ochmod 600 password.keystorepara disponibilizar o arquivo para leitura apenas para o proprietário.Esta etapa é recomendada para aumentar a segurança do seu servidor.Perceba: a propriedade do processo do Servidor do Aplicativo JBoss não deve ser um acesso de logon de console interativo. Neste caso, você estará executando estas operações como outro usuário. A criação de senhas mascaradas requer acesso de leitura ao armazenamento da chave, de forma que você desejará completar a configuração das senhas mascaradas antes de restringir as permissões do arquivo de armazenamento de chave.
keytool.
16.3. Criptografia da senha do armazenamento da chave Copiar o linkLink copiado para a área de transferência!
password_tool. Esta ferramenta irá criptografar e armazenar sua senha de armazenamento da chave. A sua senha de armazenamento da chave estará, então, disponível à Ferramenta de Senha do JBoss para mascaramento das senhas e ao Servidor do Aplicativo JBoss para criptografia das mesmas no período de rodagem.
Procedimento 16.3. Criptografia da senha do armazenamento da chave
- Altere o diretório
jboss-as/bina partir da linha de comando. - Rode a ferramenta da senha usando o comando
./password_tool.shpara sistemas baseados no Unix oupassword_tool.batpara sistemas baseados no Windows.Resultado:A Ferramenta de Senha do JBoss será inicializada e relatará '
Keystore is null. Please specify keystore below:'. - Selecione o '
0: Encrypt Keystore Password' pressionando 0 e Enter.Resultado:A ferramenta de senha responde: '
Enter keystore password'. - Insira a senha de armazenamento de chave especificada no Procedimento 16.2, “Criação de um par de chaves e armazenamento de chave para mascaramento de senha.”.Resultado:
A ferramenta de senha responde: '
Enter Salt (String should be at least 8 characters)'. - Insira uma sequência aleatória de caracteres para fortalecer a criptografia.Resultado:
A ferramenta de senha responde: '
Enter Iterator Count (integer value)'. - Insira um número inteiro para fortalecer a criptografia.Resultado:
A ferramenta da senha responde: '
Keystore Password encrypted into password/jboss_keystore_pass.dat'. - Selecione '
5:Exit' para sair.Resultado:A ferramenta da senha finalizará com a seguinte mensagem: '
Keystore is null. Cannot store.'. Isto é normal. - Opcional:
Disponibilize para leitura o arquivo
password/jboss_keystore_pass.datresultante pelo processo Servidor do Aplicativo do JBoss do proprietário apenas.Nos sistemas baseados no Unix isto é concluído usando o comandochownpara alterar a propriedade do processo do Servidor do Aplicativo JBoss e ochmod 600 jboss-keystore_pass.datpara disponibilizar o arquivo para leitura pelo proprietário.Esta etapa é recomendada para aumentar a segurança de seu servidor. Perceba que se esta chave criptografada estiver comprometida, a segurança oferecida pela senha mascarada será significativamente reduzida. Este arquivo deve ser armazenado num sistema de arquivo de segurança.Nota: o processo proprietário do Servidor do Aplicativo JBoss não deve possuir acesso de logon de console interativo. Neste caso, você executará estas operações como outro usuário. A criação de senhas mascaradas requer acesso de leitura ao armazenamento da chave, portanto você deverá completar a configuração de senhas mascaradas antes de restringir as permissões do arquivo de armazenamento de chave.
Você deve apenas executar este procedimento de criptografia de senha do armazenamento de chave uma vez. Caso você insira a senha errada do keystore ou altere o armazenamento da chave um dia mais tarde, você deverá deletar o arquivo jboss-keystore_pass.dat e repetir este procedimento. Perceba que se alterar o armazenamento da chave, quaisquer senhas mascaradas que foram anteriormente geradas não funcionarão.
16.4. Criação de máscaras de senha Copiar o linkLink copiado para a área de transferência!
jboss-as/bin/password/jboss_password_enc.dat. Este arquivo é criptografado usando o par de chaves que você forneceu à ferramenta da senha, além de conter as senhas que você irá mascarar nos arquivos de configuração. As senhas são armazenadas e restauradas a partir deste arquivo pelo "domínio", um identificador único arbitrário que você especifica à Ferramenta da Senha quando armazenando a senha, e que você especifica como parte da anotação que substitui a senha de texto simples nos arquivos de configuração. Isto permite que o Servidor do Aplicativo JBoss recupere a senha correta a partir do arquivo no período de rodagem.
Nota
jboss-as/bin/password/password.keystore) e o arquivo de senha do armazenamento da chave criptografada para leitura para seu usuário e criptografe o arquivo de senhas jboss-as/bin/password/jboss_password_enc.dat (caso já exista) para leitura e gravação, enquanto executando esta operação.
Procedimento 16.4. Criação de máscaras de senha
Pré-requisitos:
- Altere o diretório
jboss-as/bina partir da linha de comando. - Rode a ferramenta da senha usando o comando
./password_tool.shpara sistemas baseados no Unix oupassword_tool.batpara sistemas baseados no Windows.Resultado:A Ferramenta de Senha do JBoss será inicializada e relatará '
Keystore is null. Please specify keystore below:'. - Selecione o '
1:Specify KeyStore' pressionando 1 e Enter.Resultado:A ferramenta de senha responde com o '
Enter Keystore location including the file name'. - Insira o caminho para o armazenamento de chave criado no Procedimento 16.2, “Criação de um par de chaves e armazenamento de chave para mascaramento de senha.”. Você pode especificar o caminho absoluto, ou o caminho relativo para o
jboss-as/bin. Isto deve serpassword/password.keystore, a não ser que você tenha executado uma instalação avançada e alterado os padrões conforme a Seção 16.6, “Alteração dos padrões da mascaramento da senha”.Resultado:A ferramenta de senha responde com '
Enter Keystore alias'. - Insira o alias da chave. Ele deve ser
jboss, a não ser que você tenha executado uma instalação e alterado os padrões conforme a Seção 16.6, “Alteração dos padrões da mascaramento da senha”.Resultado:Caso um armazenamento e um alias de chave sejam acessíveis, a ferramenta da senha responderá com algumas mensagens de AVISO log4j, uma linha '
Loading domains [', seguidos de máscaras de senha existentes e do menu principal. - Selecione '
2:Create Password' pressionando 2 e Enter.Resultado:A ferramenta da senha responde com: '
Enter security domain:'. - Insira o nome da máscara da senha. Ela é um nome único arbitrário que você usará para identificar a máscara da senha nos arquivos de configuração.Resultado:
A ferramenta da senha responde com: '
Enter passwd:'. - Insira a senha que você deseja aplicar a máscara.Resultado:
A ferramenta de senha responde com: '
Password created for domain:mask name'. - Repita o processo de criação da máscara para criar máscaras para todas as senhas pelas quais você desejar aplicar a máscara.
- Enecerre o programa selecionando '
5:Exit'.
16.5. Substitua as senhas de texto simples por suas máscaras de senha Copiar o linkLink copiado para a área de transferência!
Exemplo 16.1. Modelo geral de anotação da máscara de senha
<annotation>@org.jboss.security.integration.password.Password(securityDomain=MASK_NAME, methodName=setPROPERTY_NAME)</annotation>
<annotation>@org.jboss.security.integration.password.Password(securityDomain=MASK_NAME, methodName=setPROPERTY_NAME)</annotation>
deploy/messaging/messaging-jboss-beans.xml, como uma amostra concreta. Caso você tenha criado uma máscara de senha nomeada "messaging", o trecho do código do arquivo de configuração parecerá com o seguinte (antes e depois):
Exemplo 16.2. Configuração do JBoss Messaging Microcontainer Bean Antes
<property name="suckerPassword">CHANGE ME!!</property>
<property name="suckerPassword">CHANGE ME!!</property>
Exemplo 16.3. Configuração do JBoss Messaging Microcontainer Bean Depois
<annotation>@org.jboss.security.integration.password.Password(securityDomain=messaging, methodName=setSuckerPassword)</annotation>
<annotation>@org.jboss.security.integration.password.Password(securityDomain=messaging,
methodName=setSuckerPassword)</annotation>
16.6. Alteração dos padrões da mascaramento da senha Copiar o linkLink copiado para a área de transferência!
jboss-as/bin/password/password.keystore e do key alias jboss. Caso você armazene um par de chaves usados para mascaramento da senha em algum outro local ou sob um alias diferente, você precisará atualizar os perfis do servidor por uma nova localização ou alias de chave.
deploy/security/security-jboss-beans.xml do arquivo, sob cada um dos perfis do Servidor do Aplicativo JBoss inclusos.
Exemplo 16.4. Padrões de Mascaramento da Senha no security-jboss-beans.xml
Capítulo 17. Criptografia das Senhas de Fonte de Dados Copiar o linkLink copiado para a área de transferência!
*-ds.xml. Estes detalhes de conexão do banco de dados inclui senhas de texto limpo. Você pode aumentar a segurança de seu servidor pela substituição de senhas de texto limpo nos arquivos de fonte de dados com as senhas criptografadas.
SecureIdentityLoginModule está descrita na Seção 17.1, “Identidade com Proteção”.
JaasSecurityDomainIdentityLoginModule, está descrita na Seção 17.1, “Identidade com Proteção”.
17.1. Identidade com Proteção Copiar o linkLink copiado para a área de transferência!
org.jboss.resource.security.SecureIdentityLoginModule pode ser usada para ambas as senhas do banco de dados criptografadas e para fornecer uma versão descriptografada da senha quando a configuração da fonte de dados for solicitada pelo servidor. O SecureIdentityLoginModule usa uma senha de código rígido paras criptografar/descriptografar a senha de fonte de dados.
Procedimento 17.1. Visão Geral: Uso do SecureIdentityLoginModule para criptografar uma senha de fonte de dados
- Encripte a senha de fonte de dados.
- Crie uma política de autenticação com a senha criptografada.
- Configure a fonte de dados para uso da política de autenticação do aplicativo.
17.1.1. Criptografia da senha de fonte de dados Copiar o linkLink copiado para a área de transferência!
SecureIdentityLoginModule passando uma mensagem de texto não-criptografado. O SecureIdentityLoginModule é fornecido pelo jbosssx.jar.
Procedimento 17.2. Criptografia de uma senha de fonte de dados - versões de Plataforma 5.0 e 5.0.1
- Altere o diretório
jboss-as. - Invoque o SecureIdentityLoginModule pelo seguinte comando, fornecendo uma senha de texto não-criptografada como PASSWORD.Comando no Linux:
java -cp client/jboss-logging-spi.jar:common/lib/jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORD
java -cp client/jboss-logging-spi.jar:common/lib/jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORDCopy to Clipboard Copied! Toggle word wrap Toggle overflow Comando no Windows:java -cp client\jboss-logging-spi.jar;common\lib\jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORD
java -cp client\jboss-logging-spi.jar;common\lib\jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORDCopy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:O comando retornará uma senha criptografada.
Procedimento 17.3. Criptografia de uma senha de fonte de dados - versão da Plataforma 5.1 e mais recentes
- Altere o diretório
jboss-as. - Comando no Linux:
java -cp client/jboss-logging-spi.jar:lib/jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORD
java -cp client/jboss-logging-spi.jar:lib/jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORDCopy to Clipboard Copied! Toggle word wrap Toggle overflow Comando no Windows:java -cp client\jboss-logging-spi.jar;lib\jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORD
java -cp client\jboss-logging-spi.jar;lib\jbosssx.jar \ org.jboss.resource.security.SecureIdentityLoginModule PASSWORDCopy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:O comando retornará uma senha criptografada.
17.1.2. Criação de uma política de autenticação do aplicativo com a senha criptografada Copiar o linkLink copiado para a área de transferência!
conf/login-config.xml, onde as políticas de autenticação do aplicativo são definidas para aquele perfil. Adicione um novo elemento <application-policy> ao elemento <policy>, com o objetivo de criar uma política de autenticação para sua senha criptografada.
login-config.xml apresentado na política de autenticação do nome "EncryptDBPassword".
Exemplo 17.1. Amostra da política de autenticação do aplicativo com uma senha de fonte de dados criptografada
Opções do módulo SecureIdentityLoginModule
- nome do usuário
- Especifica o nome do usuário para uso quando estabelecendo uma conexão ao banco de dados.
- senha
- Fornece uma senha criptografada gerada na Seção 17.1.1, “Criptografia da senha de fonte de dados”.
- managedConnectionFactoryName
- jboss.jca:name
- Nomeia uma Interface do Diretório e Nomeação do Java - Java Naming and Directory Interface (JNDI) para esta fonte de dados.
- jboss.jca:service
- Especifica o tipo de transação.
Tipos de Transação
- NoTxCM
- Nenhum suporte de transação
- LocalTxCM
- Suporte de transação de recurso único
- TxCM
- Suporte de transação distribuída ou recurso único
- XATxCM
- Suporte de Transação Distribuída
17.1.3. Configura a fonte de dados para uso da política de autenticação do aplicativo. Copiar o linkLink copiado para a área de transferência!
*-ds.xml. Remova os elementos <user-name> e <password> deste arquivo e substitua-os por um elemento <security-domain>. Este elemento conterá o nome da política de autenticação do aplicativo segundo a Seção 17.1.2, “Criação de uma política de autenticação do aplicativo com a senha criptografada”.
Exemplo 17.2. Amostra do arquivo da fonte de dados usando a identidade protegida
17.2. Identidade configurada com a Senha baseada na Criptografia - Password Based Encryption (PBE) Copiar o linkLink copiado para a área de transferência!
org.jboss.resource.security.JaasSecurityDomainIdentityLoginModule é um módulo de logon para definição de forma estatística de uma fonte de dados usando uma senha que foi criptografada pelo JaasSecurityDomain. Segue abaixo o formato base64 da senha de fonte de dados gerado usando o PBEUtils:
Procedimento 17.4. Criptografia da senha com os PBEUtils - Plataformas de versão 5.0 e 5.0.1
- Execute o comando:
java -cp jboss-as/common/lib/jbosssx.jar org.jboss.security.plugins.PBEUtils \ salt count domain-password data-source-password
java -cp jboss-as/common/lib/jbosssx.jar org.jboss.security.plugins.PBEUtils \ salt count domain-password data-source-passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:A senha criptografada é exibida.
Procedimento 17.5. Criptografia da senha com PBEUtils - Platforma da versão 5.1
- Execute o comando:
java -cp jboss-as/lib/jbosssx.jar org.jboss.security.plugins.PBEUtils \ salt count domain-password data-source-password
java -cp jboss-as/lib/jbosssx.jar org.jboss.security.plugins.PBEUtils \ salt count domain-password data-source-passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow Resultado:A senha criptografada é exibida.
PBEUtils são os seguintes:
- salt
- O atributo Salt a partir do JaasSecurityDomain (Ele deve conter oito caracteres).
- contagem
- O atributo IterationCount a partir do domínio JaasSecurity.
- senha-domínio
- A senha de texto plano mapeada ao atributo KeyStorePass a partir do JaasSecurityDomain.
- senha-fonte-de-dados
- A senha de texto plano para a fonte de dados que deve ser criptografado com a senha JaasSecurityDomain.
Exemplo 17.3. Amostra do comando PBEUtils
java -cp jbosssx.jar org.jboss.security.plugins.PBEUtils abcdefgh 13 master password Encoded password: 3zbEkBDfpQAASa3H39pIyP
java -cp jbosssx.jar org.jboss.security.plugins.PBEUtils abcdefgh 13 master password
Encoded password: 3zbEkBDfpQAASa3H39pIyP
$JBOSS_HOME/server/$PROFILE/conf/login-config.xml.
$JBOSS_HOME/docs/examples/jca/hsqldb-encrypted-ds.xml ilustra a configuração da fonte de dados juntamente com a configuração JaasSecurityDomain para o keystore:
Atenção
Nota
java.security.InvalidAlgorithmParameterException: Parameters missing é exibido quando o seguinte MBean não for inicializado como serviço:
(jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword)
(jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword)
hsqldb-encrypted-ds.xml apresentado anteriormente.
<depends>jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword</depends>
<depends>jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword</depends>
Capítulo 18. Criptografia da Senha Keystore num Conector Tomcat Copiar o linkLink copiado para a área de transferência!
server.xml do Tomcat.
Procedimento 18.1. Criptografia da Senha Keystore do Recipiente Tomcat
Anexe o elemento conector
Adicione o elemento conector aoserver.xmlno$JBOSS_HOME/server/$PROFILE/deploy/jbossweb.sar.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configuração do JaasSecurityDomain MBean
Consulte o JaasSecurityDomain MBean no arquivo$JBOSS_HOME/server/$PROFILE/deploy/security-service.xml.Crie o arquivo caso ele ainda não exista. A amostra do código descreve o conteúdo solicitado quando o arquivo não existir. Caso você já tenha umsecurity-service.xml, anexe o bloqueio do elemento <mbean> ao arquivo.Copy to Clipboard Copied! Toggle word wrap Toggle overflow O Salt e IterationCount são variáveis que definem a intensidade de sua senha criptografada, de forma que você pode variar isto da maneira que é apresentada. Certifique-se de gravar novos valores e usá-los quando gerando a senha criptografada.Nota
O Salt deve possuir pelo menos oito caracteres.Geração de uma senha criptografada
A configuração <mbean> especifica que o keystore está armazenado no arquivojboss-as/server/$PROFILE/conf/localhost.keystore. O <mbean> também especifica que o arquivo de senha criptografado está armazenado no arquivojboss-as/server/$PROFILE/conf/keystore.password.Você deve criar um arquivolocalhost.keystore.Execute o seguinte comando no diretóriojboss-as/server/$PROFILE/conf.java -cp $JBOSS_HOME/lib/jbosssx.jar \org.jboss.security.plugins.FilePassword welcometojboss 13 unit-tests-server keystore.password
[conf]$ java -cp $JBOSS_HOME/lib/jbosssx.jar \org.jboss.security.plugins.FilePassword welcometojboss 13 unit-tests-server keystore.passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow Este comando usa um jbosssx.jar como classpath (-cp) e o puglin de segurança FilePassword para criação de um arquivokeystore.passwordcom a senha configurada paraunit-tests-server. Você deverá fornecer os parâmetros salt e interation configurados nos elementos <mbean> <attribute> do JaasSecurityDomain, com o objetivo de certificar-se de que tem permissão para criar um arquivokeystore.password.Você pode executar este comando no diretório/conf, de forma que o arquivokeystore.passwordé salvo a este diretório.Atualização do MBean do serviço Tomcat
Navegue ao$JBOSS_HOME/server/$PROFILE/deploy/jbossweb.sar/META-INF.Abra umjboss-service.xmle anexe a seguinte tag <depends> no final do arquivo. A adição da tag <depends> especifica que o Tomcat deve iniciar após ojboss.security:service=PBESecurityDomain.<depends>jboss.security:service=PBESecurityDomain</depends> </mbean> </server>
<depends>jboss.security:service=PBESecurityDomain</depends> </mbean> </server>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemplo 18.1. Definição do JaasSecurityDomain para pkcs12 keystores
18.1. Caso de Uso de Segurança Média Copiar o linkLink copiado para a área de transferência!
server.xml) ou deseja fazer uso de um JaasSecurityDomain pré-definido.
Procedimento 18.2. JaasSecurityDomain Pré-definido
Atualize o jboss-service.xml para adicionar um conector
Navegue ao$JBOSS_HOME/server/e adicione o bloqueio de código ao arquivo$PROFILE/deploy/jbossweb.sar/META-INFjboss-service.xml.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Adicione uma tag <depends> ao serviço Tomcat
Navegue ao$JBOSS_HOME/server/$PROFILE/deploy/jbossweb.sar.Abra oserver.xmle anexe o seguinte elemento <depends> no final do arquivo:<depends>jboss.security:service=SecurityDomain</depends> </mbean> </server>
<depends>jboss.security:service=SecurityDomain</depends> </mbean> </server>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Defina o JaasSecurityDomain MBean num arquivo *-service.xml
Por exemplo, osecurity-service.xmlno diretório implantar:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Nota
Capítulo 19. Uso do LdapExtLoginModule com o JaasSecurityDomain Copiar o linkLink copiado para a área de transferência!
Procedimento 19.1.
Define o JaasSecurityDomain MBean
Define o JaasSecurityDomain MBean usado para descriptografar a versão criptografada da senha. Você pode adicionar o MBean ao$JBOSS_HOME/server/$PROFILE/conf/jboss-service.xmlou ao descritor de implantação *-service.xmlna pasta$JBOSS_HOME/server/.$PROFILE/deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
O algoritmo criptografado padrão usado pela implementação JaasSecurityDomain éPBEwithMD5andDES. Outros algoritmos criptografados incluemDES,TripleDES,BlowfishePBEWithMD5AndTripleDES. Todos os algoritmos são simétricos. Você pode especificar um algoritmo criptografado anexando um elemento <attribute> com o atributoCypherElementconfigurado para um destes valores.Ajuste a senha, salt e contagem de interação
O Primeiro Passo contém uma configuração simples onde a senha solicitada, Salt e Contagem de Interação usados para criptografia ou descriptografia estão contidos na definição do MBean.Certifique-se de alterar os valores KeyStorePass, Salt e IterationCount adequados a sua implantação.
org.jboss.security.plugins.JaasSecurityDomain MBean.
encode64(String password) na página org.jboss.security.plugins.JaasSecurityDomain. Passe a versão de texto simples do password usado pelo LdapExtLoginModule para este método e o invoque. O valor de retorno deve ser a versão criptografada da senha codificada conforme Base64.
<module-option name="jaasSecurityDomain">jboss.security:service=JaasSecurityDomain,domain=jmx-console</module-option> <module-option name="bindCredential">2gx7gcAxcDuaHaJMgO5AVo</module-option>
<module-option name="jaasSecurityDomain">jboss.security:service=JaasSecurityDomain,domain=jmx-console</module-option>
<module-option name="bindCredential">2gx7gcAxcDuaHaJMgO5AVo</module-option>
Capítulo 20. Firewalls Copiar o linkLink copiado para a área de transferência!
| Porta | Tipo | Serviço |
|---|---|---|
| 1098 | TCP | org.jboss.naming.NamingService |
| 1099 | TCP | org.jboss.naming.NamingService |
| 4444 | TCP | org.jboss.invocation.jrmp.server.JRMPInvoker |
| 4445 | TCP | org.jboss.invocation.pooled.server.PooledInvoker |
| 4446 | TCP | org.jboss.invocation.unified.server.UnifiedInvoker |
| 4457 | TCP | Soquete do JBoss Messaging 1.x |
| 4712 | TCP | Soquete Gerenciador de Recuperação do JBossTS |
| 4713 | TCP | Gerenciador do Status de Transação do JBossTS |
| 8009 | TCP | org.jboss.web.tomcat.tc4.EmbeddedTomcatService |
| 8080 | TCP | org.jboss.web.tomcat.tc4.EmbeddedTomcatService |
| 8083 | TCP | org.jboss.web.WebService |
| 8093 | TCP | org.jboss.mq.il.uil2.UILServerILService |
| Porta | Tipo | Serviço |
|---|---|---|
| 1100 | TCP | org.jboss.ha.jndi.HANamingService |
| 1101 | TCP | org.jboss.ha.jndi.HANamingService |
| 1102 | UDP | org.jboss.ha.jndi.HANamingService |
| 1161 | UDP | org.jboss.jmx.adaptor.snmp.agent.SnmpAgentService |
| 1162 | UDP | org.jboss.jmx.adaptor.snmp.trapd.TrapdService |
| 1389 | TCP | ldaphost.jboss.org.LdapLoginModule |
| 3843[a]. | TCP | org.jboss.ejb3.SSLRemotingConnector |
| 3528 | TCP | org.jboss.invocation.iiop.IIOPInvoker |
| 3873 | TCP | org.jboss.ejb3.RemotingConnectors |
| 4447 | TCP | org.jboss.invocation.jrmp.server.JRMPInvokerHA |
| 4448 | TCP | org.jboss.invocation.pooled.server.PooledInvokerHA\n\t\n |
| 4448 | TCP | org.jboss.invocation.pooled.server.PooledInvokerHA\n\t\n |
| 7900 | TCP | |
| 45566[b] | UDP | org.jboss.ha.framework.server.ClusterPartition\n\t\n |
[a]
Apenas necessário caso o transporte SSL seja configurado para EJB3
[b]
Mais duas portas UDP adicionais anônimas, uma pode ser configurada usando o rcv_port e a outra não pode ser configurada.
| ||
Capítulo 21. Consoles e Invocadores Copiar o linkLink copiado para a área de transferência!
21.1. Console JMX Copiar o linkLink copiado para a área de transferência!
jmx-console.war encontrado no diretório deploy fornece uma visualização HTML no JMX Microkernel. Desta maneira, ele fornece acesso às ações administrativas tais como encerramento do servidor, interrupção dos serviços, implantação de novos serviços, etc. Ele deve ser protegido como outro qualquer aplicativo da web ou removido.
21.2. Console Admin Copiar o linkLink copiado para a área de transferência!
21.3. Invocadores HTTP Copiar o linkLink copiado para a área de transferência!
http-invoker.sar encontrado no diretório deploy é um serviço que fornece o acesso RMI/HTTP para EJBs e serviço Naming do JNDI. Isto inclui um servlet que processa postagens dos objetos org.jboss.invocation.Invocation com marshall, dos quais representam invocações que devem ser despachadas no MBeanServer. Isto permite acesso através dos MBeans que suportam a operação do invocador desanexado através das solicitações HTTP POST. A proteção deste ponto de acesso envolve a proteção do JMXInvokerServlet servlet encontrado no descritor http-invoker.sar/invoker.war/WEB-INF/web.xml. Por padrão, existe um mapeamento de segurança definido para cada caminho /restricted/JMXInvokerServlet. Remova os outros caminhos e configure o domínio de segurança http-invoker no descritor de implantação http-invoker.sar/invoker.war/WEB-INF/jboss-web.xml.
Nota
21.4. Invocador JMX Copiar o linkLink copiado para a área de transferência!
jmx-invoker-service.xml é um arquivo de configuração que expõe a interface JMX MBeanServer através de uma interface compatível usando o serviço invocador desanexado RMI/JRMP.
21.5. Acesso Remoto a Serviços, Invocadores Desanexados Copiar o linkLink copiado para a área de transferência!
Figura 21.1. Os componentes principais da arquitetura do invocador desanexada
Invoker ilustra a operação de invocação genérica.
Remote para ser compatível com o RMI, mas não significa que um invocador deve expor um stub de serviço RMI. O serviço invocador desanexado age como um transporte de fuga que aceita invocações representadas como um objeto org.jboss.invocation.Invocation sobre o transporte específico. O serviço invocador desempacota a invocação e a envia à destinação do serviço MBean representado pelo MBean de Destino na Figura 21.1, “Os componentes principais da arquitetura do invocador desanexada”. Além disso, ele empacota o valor de retorno ou exceção resultante do retorno de chamada enviado ao cliente.
Invocation é apenas uma representação do contexto da invocação do método. Ele inclui o nome do MBean de destino, o método, os argumentos do método, um contexto de informação associada com o proxy pela fábrica do proxy e um mapa arbitrário de dados associados com a invocação pelos interceptores do proxy do cliente.
- Criação do proxy dinâmico que implementa a interface do MBean de destino pelo qual deseja expor.
- Associa os interceptores do proxy do cliente com o manuseador do proxy dinâmico.
- Associa o contexto de invocação com o proxy dinâmico. Isto inclui o MBean de destino, o stub do invocador desanexado e o nome JNDI do proxy.
- Disponibiliza o proxy aos clientes pelo binding do proxy no JNDI.
- Definição de uma operação JMX coincidente com a assinatura:
public Object invoke(org.jboss.invocation.Invocation) throws Exception. - Criação de um mapeamento
HashMap<Long, Method>a partir dosjava.lang.reflect.Methods de interface exibidos à representação hash longa usando o métodoorg.jboss.invocation.MarshalledInvocation.calculateHash. - Implementa a operação JMX
invoke(Invocation)e usa o mapeamento hash da interface para transformar a longa representação hash do método invocado para ojava.lang.reflect.Methodda interface exposta. A reflexão é usada para executar a invocação atual no objeto associado com o serviço MBean que atualiza a interface exposta.
21.5.1. A Amostra do Invocador Desanexada, o Serviço do Invocador MBeanServer Copiar o linkLink copiado para a área de transferência!
org.jboss.jmx.connector.invoker.InvokerAdaptorService e sua configuração de acesso através do RMI/JRMP como uma amostra dos passos solicitados para fornecimento de acesso remoto a um serviço MBean.
Exemplo 21.1. O InvokerAdaptorService MBean
InvokerAdaptorService é um serviço MBean simples que existe para preenchimento da função do MBean de destino no invocador padrão desanexado.
InvokerAdaptorServiceMBean.
Exemplo 21.2. Bloco Um
InvokerAdaptorServiceMBean do InvokerAdaptorService possui um atributo ExportedInterface único e uma operação invoke(Invocation) única.
ExportedInterface- O atributo permite personalização do tipo de interface que o serviço expõe aos clientes. Ela deve ser compatível à classe
MBeanServerno que se diz respeito ao nome e assinatura do método. invoke(Invocation)- A operação é o ponto de entrada solicitado que os serviços MBean devem expor para participar do padrão do invocador desanexado. Esta operação é invocada pelos serviços do invocador desanexado que foram configurados para fornecer acesso ao
InvokerAdaptorService.
Exemplo 21.3. Bloco Dois
exportedInterface usando o método de utilidade org.jboss.invocation.MarshalledInvocation.calculateHash(Method).
java.lang.reflect.Method não serem serializadas, uma versão MarshalledInvocation da classe Invocation é usada para empacotar a invocação entre o cliente e o servidor. O MarshalledInvocation substitui as instâncias de Método pela sua representação hash correspondente. Ao lado do servidor, o MarshalledInvocation deve ser informado qual é o hash para o mapeamento do Método.
InvokerAdaptorService e sua representação de código hash. Isto é usado pelos invocadores desanexados para determinar qual é o ObjectName para o Invocation.
Invocation, seu armazenamento assim como seu hashCode uma vez que os ObjectNames são objetos relativamente caros para criação. O org.jboss.system.Registry é um mapa global como a construção que os invocadores usam para armazenar o código hash para mapeamentos do ObjectName.
Exemplo 21.4. Bloco Três
org.jboss.mx.server.registry.BasicMBeanRegistry, uma classe de implementação específica do JBoss JMX.
Exemplo 21.5. Bloco Quatro
ExposedInterface para o mapeamento do método caso o argumento da invocação for do tipo MarshalledInvocation. O mapeamento do método calculado no Exemplo 21.3, “Bloco Dois” é utilizado aqui.
ExposedInterface para o método correspondente da classe do MBeanServer. O InvokerServiceAdaptor descompila o ExposedInterface a partir da classe MBeanServer pela qual ele permite uma interface arbitrária. Isto é solicitado uma vez que a classe java.lang.reflect.Proxy pode apenas aplicar proxy nas interfaces. Além disso, isto permite também que você apenas exponha um sub-conjunto dos métodos MBeanServer e adicione transporte às execuções específicas tais como java.rmi.RemoteException às assinaturas do método ExposedInterface.
Exemplo 21.6. Bloco Cinco
InvokerAdaptorService MBeanServer pela qual ele foi implementado. A variável da instância do servidor é herdada a partir da super-classe ServiceMBeanSupport.
Nota
InvokerAdaptorService MBean não lida diretamente com quaisquer detalhes específicos de transporte. Existe um cálculo do hash de método para mapeamento do Método, mas isto é um detalhe independente de transporte.
InvokerAdaptorService pode ser usado para expor a mesma interface org.jboss.jmx.adaptor.rmi.RMIAdaptor através do RMI/JRMP, conforme visto na Conexão para JMX Usando RMI.
InvokerAdaptorService encontradas na configuração padrão da implementação jmx-invoker-adaptor-service.sar. O Exemplo 21.7, “Descritor da implantação jmx-invoker-adaptor-server.sar padrão” apresenta o descritor jboss-service.xml para esta implantação.
Exemplo 21.7. Descritor da implantação jmx-invoker-adaptor-server.sar padrão
org.jboss.invocation.jrmp.server.JRMPProxyFactory, é a fábrica proxy do serviço MBean que cria proxies para o protocolo RMI/JRMP. Conforme apresentado no Exemplo 21.7, “Descritor da implantação jmx-invoker-adaptor-server.sar padrão” a configuração deste serviço declara que o JRMPInvoker será usada como invocador desanexado, o InvokerAdaptorService é o mbean de destino pelo qual solicitações serão enviadas, que o proxy irá expor a interface RMIAdaptor. O proxy será vinculado ao JNDI sob o nome de jmx/invoker/RMIAdaptor, além de conter 3 interceptores: ClientMethodInterceptor, InvokerAdaptorClientInterceptor e InvokerInterceptor. A configuração do InvokerAdaptorService apenas determina a interface RMIAdaptor que o serviço está expondo.
InvokerAdaptorService através do RMI/JRMP é o invocador desanexado. O invocador desanexado que usaremos é o invocador RMI/JRMP usado pelos recipientes EJB para invocações remotas e principais, além de ser o serviço MBean org.jboss.invocation.jrmp.server.JRMPInvoker configurado no descritor conf/jboss-service.xml. Uma das naturezas desanexadas dos invocadores é que podemos usar a mesma instância de serviço. O JRMPInvoker age simplesmente como um ponto final do RMI/JRMP para todos os proxies independente da(s) interface(s) que os proxies expõem ou o serviço que os proxies utilizam.
Apêndice A. Configuração do JDK padrão com a Utilidade /usr/sbin/alternatives Copiar o linkLink copiado para a área de transferência!
/usr/sbin/alternatives é uma ferramenta para gerenciamento de pacotes de software diferentes que fornecem a mesma funcionalidade. O Red Hat Enterprise Linux usa o /usr/sbin/alternatives para garantir que apenas um Kit de Desenvolvimento do Java é configurado como o padrão do sistema de uma só vez.
Importante
/usr/sbin/alternatives contenha configurações em conflito. Refira-se ao Procedimento A.1, “Usando o /usr/sbin/alternatives para configurar o JDK padrão. ” para síntese do comando /usr/sbin/alternatives.
Procedimento A.1. Usando o /usr/sbin/alternatives para configurar o JDK padrão.
Torne-se usuário root.
O/usr/sbin/alternativesprecisa rodar com privilégios root. Use o comandosuou outro mecanismo para obter estes privilégios.Configure o
java.Insira o comando:/usr/sbin/alternatives --config javaEm seguida, siga as instruções para garantir que a versão correta dojavaé instalada. A Tabela A.1, “comandos alternativos dojava” apresenta as configurações de comando relevante para cada um dos JDKs diferentes.Expand Tabela A.1. comandos alternativos do java JDK comando alternativo OpenJDK 1.6 /usr/lib/jvm/jre-1.6.0-openjdk/bin/javaSun Microsystems JDK 1.6 /usr/lib/jvm/jre-1.6.0-sun/bin/javaConfigure o
javac.Insira o comando:/usr/sbin/alternatives --config javacSiga as instruções da tela para garantir que a versão correta dojavacé selecionada. A Tabela A.2, “comandos alternativos dojavac” apresenta as configurações de comando apropriadas para os diferentes JDKs.Expand Tabela A.2. comandos alternativos do javac JDK comando alternativo OpenJDK 1.6 /usr/lib/jvm/java-1.6.0-openjdk/bin/javacSun Microsystems JDK 1.6 /usr/lib/jvm/java-1.6.0-sun/bin/javacPasso adicional: Configure o
java_sdk_1.6.0.O Sun Microsystems JDK 1.6 um comando adicional a ser rodado:/usr/sbin/alternatives --config java_sdk_1.6.0Siga as instruções da tela para garantir que ojava_sdkcorreto é selecionado. Ele é/usr/lib/jvm/java-1.6.0-sun.
Apêndice B. Histórico de Revisão Copiar o linkLink copiado para a área de transferência!
| Histórico de Revisões | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Revisão 5.1-0.1.400 | 2013-10-31 | ||||||||||||||||
| |||||||||||||||||
| Revisão 5.1-0.1 | Fri Aug 31 2012 | ||||||||||||||||
| |||||||||||||||||
| Revisão 5.1-0 | Wed Sep 15 2010 | ||||||||||||||||
|
Contém problemas e melhorias relacionadas com a Certificação de Critério Comum para a Plataforma do Aplicativo JBoss Enterprise v5.1 e outras questões levantadas por clientes e da comunidade.
| |||||||||||||||||