Autenticação e Controle de Acesso

  • View
    346

  • Download
    8

Embed Size (px)

Text of Autenticação e Controle de Acesso

  • 1. J530 - Enterprise JavaBeansAutenticao e Controle de Acesso Helder da Rocha (helder@acm.org)argonavis.com.br 1

2. Controle de acesso a autenticao A especificao EJB define controle de acesso a mtodos e autenticao de clientes No abrange outros aspectos importantes de segurana, como criptografia e comunicao seguraAutenticao depende de implementao no container Identidade representada por objeto java.security.PrincipalO controle de acesso feito de forma declarativa Declara-se papis lgicos que podem ser mapeados a usurios e grupos: Papis so associados a mtodos para determinar quem tem autorizao para executar: Mtodos podem ser executados em outros beans por um Principal diferente: 2 3. Exemplo de controle de acesso BankCustomer Papis lgicos participantes BankAdmin ejb-jar.xml Grupo de mtodos CustomerEJB no verificados getPrimaryKey BankAdmin Grupo de mtodos de CustomerEJB CustomerEJB que s podem ser chamados por * usurios que assumem o papel de BankAdmin 3 4. JAAS A autenticao depende de infraestrutura do servidor e pode ser implementada com o Java Authentication and Authorization Service - JAAS JAAS uma API para autenticao de usurios e autorizao. A maior parte implementada pelo servidorPrincipais classes javax.security.auth.Subject javax.security.Principal javax.security.auth.callback.Callback javax.security.auth.callback.CallbackHandler javax.security.auth.login.Configuration javax.security.auth.login.LoginContext javax.security.auth.spi.LoginModule4 5. Implementao do JAAS no JBoss (JBossSX) A implementao do JAAS no JBoss consiste de JAASecurityManager Mdulos de configurao do servidor (login-config.xml) e do cliente (auth.conf) Implementaes de javax.security.auth.spi.LoginModuleClientLoginModule Implementao de LoginModule no clienteUsersRolesLoginModule Uma das implementaes de LoginModule no servidor Par de arquivos de texto para definir usurios e gruposjboss.xml e jboss-web.xml Declaram domnio JAAS a ser usado atravs do elemento de jboss.xml e jboss-web.xml5 6. Configurao do JBoss Para utilizar os domnios de segurana do JBoss preciso realizar configuraes no servidor e em cada aplicao No servidor Arquivo login-config.xml localizado no diretrio $JBOSS_HOME/server/default/conf/ Criao de domnios de segurana e sua associao com mdulos de login existentesNa aplicao Arquivo jboss.xml (e/ou jboss-web.xml, se autenticao ocorrer via Web Container) Declarao do domnio de segurana JAAS usado Em clientes standalone, criao de domnios de segurana6 7. Domnio de segurana do servidor JBossSX Deve ser declarado em jboss.xml (ou jboss-web.xml) java:/jaas/dominio-servidor SecureHelloEJB login/HelloHome jboss.xmlDeve coincidir com nome de um (que define o domnio) em login-config.xml (...) Se no houver domnio com este nome em login-config.xml, ser usado o domnio default "other", previamente configurado para usar UsersRolesLoginModule (veja slide seguinte) 7 8. Servio JBossSX com UsersRolesLoginModule Mdulo simples que utiliza par de arquivos de texto a configurao default em login-config.xml (...) Trecho de server/default/conf/login-config.xml users.properties (nome=senha) mickey=mouse niquel=nausearoles.properties (nome.Grupo=Role,...,Role) mickey.Roles=TestRole, AdminRole niquel.Roles=NoRole, MouseRoleUse preferencialmente senha criptografada! Coloque no CLASSPATH do servidor (pode ser no EJB-JAR)8 9. Domnio usando banco de dados Pode-se guardar nome, senha e grupo em banco de dados. Para isto, preciso configur-lo no JBoss (login-config.xml) com DatabaseServerLoginModule preciso tambm ter uma ou mais tabelas criadas com os dados de login (usuario, senha e grupo)O mdulo requer trs opes que so: nome do Datasource, query que retorne a senha, dado o userid e query que retorne um grupo, como "Roles" dado um userid java:/DefaultDS select senha from usuarios where id=? select grupo, 'Roles' from grupos where id=? nobody 9 10. Domnio de segurana do cliente JBossSX Coloque no Classpath do cliente standalone Arquivo de configurao (indica no mnimo a implementao de login module usada) arquivo de configurao (default) dominio-cliente { // JBoss LoginModule implementation org.jboss.security.ClientLoginModule };required;Informe ao cliente a localizao do arquivo atravs da propriedade java.security.auth.login.config: > java Prog -Djava.security.auth.login.config=auth.txtJARs do JBossSX: jbosssx-client.jar (alm dos outros JARs necessrios para o cliente JBoss) 10 11. Domnio de clientes dentro de containers Para clientes que executam dentro do servidor (ex: servlets, JSP), chame o mesmo login module atravs de domnio definido na configurao do JBoss Ex: domnio declarado em login-config.xml: 11 12. Cliente standalone padro JAAS para login public class HelloClient { public static void main(String[] args) throws Exception { LoginContext loginCtx = null; Encapsula dados de try { autenticao // Cria CallBackHandler CallbackHandler handler = new HelloCallbackHandler(); // Carrega configurao loginCtx = new LoginContext("dominio-cliente", handler); // Faz o login Dominio do cliente Faz o login aqui loginCtx.login(); (veja slides anteriores) } catch (LoginException e) { System.out.println("Login failed"); System.exit(1); } // Executa ao privilegiada propagando contexto de segurana Context ctx = new InitialContext(System.getProperties()); Object obj = ctx.lookup("SecureHelloEJB"); HelloHome home = (HelloHome) PortableRemoteObject.narrow(obj, HelloHome.class); Hello hello = home.create(); Chama mtodos System.out.println(hello.hello()); privilegiados } }12 13. JAAS CallbackHandler import javax.security.auth.*; import javax.security.auth.callback.*; import javax.security.auth.login.*; public class HelloCallbackHandler implements CallbackHandler { private String username; private String password;GUI simples para entrada de textopublic HelloCallbackHandler() { LoginDialog dialog = new LoginDialog("User Authentication Required"); this.username = dialog.getData()[0]; Preenche array de callbacks this.password = dialog.getData()[1]; } recebido com nome e senha lidos public void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof NameCallback) { NameCallback nc = (NameCallback) callbacks[i]; nc.setName(username); } else if (callbacks[i] instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback) callbacks[i]; pc.setPassword( this.preparePassword(password) ); } else throw new UnsupportedCallbackException(callbacks[i], "Error"); } } private char[] preparePassword(String word) { return word.toCharArray(); // ou rotina de criptografia } }13 14. Exemplo JAAS: como executar Diretrio cap13/exemplos/mejb Configurao Configure build.properties Edite usurios e grupos em lib/users.properties e lib/roles.propertiesUse targets do Ant> ant jboss.deploy (para instalar) > ant run.jboss.client (para rodar)Digite nome e senha compatveis com arquivos de configurao Tente logar como usurio vlido no autorizado (niquel) 14 15. Aplicao exemplo: ejb-jar.xml SecureHelloEJB examples.HelloHome examples.Hello examples.HelloBean Stateless Container Todos os mtodos acessveis a TestRole TestRole TestRole SecureHelloEJB * Veja cdigo exemplo em cap13/exemplos/mejb 15 16. Propagao da identidade do principal A identidade do principal propagada nas chamadas feitas no contexto do mtodo chamado pelo cliente Este o comportamento default, que tambm pode ser declarado explicitamente no DD ... ...Uma exceo ser provocada caso o mtodo chame algum mtodo que o perfil associado com o principal no tenha autorizao para executar 16 17. Troca de identidade Para executar mtodos privilegiados, um bean pode trocar de identidade A nova identidade ser propagada em todos os seus mtodos e nos mtodos chamados por eles ... admin ... 17 18. Autorizao: controle programtico No h vantagens em se controlar o acesso aos recursos apenas via cdigo Controle de acesso no tarefa do bean provider (programador), mas do assembler ou deployerPor outro lado, o controle declarativo muitas vezes insuficiente, por exemplo Um mtodo que acessvel por um grupo precisa identificar membros desse grupo para limitar acesso a certas partes do cdigo Mtodos que podem ser acessados por vrios grupos, mas de acordo com certos algoritmos 18 19. Mtodos de EJBContext Para controle de acesso no cdigo, h dois mtodos em EJBContext (disponvel para todos os beans)getCallerPrincipal(): retorna javax.security.Principalque identifica o usurio que est logado. Use getName() no objeto retornado para recuperar o nome (String) isCallerInRole(String role): retorna true se usurio logado faz parte do papel passado como argumento. O nome passado pode no ser o mesmo usado no deployment descriptor, mas um alias. String loggedUser = ctx.getCallerPrincipal().getName(); if( !ctx.isCallerInRole("administrador")) { if (!loggedUser.equals(userid)) { throw new AcessoIlegalException("..."); } }19 20. Alias para papis no DD Permite que component assembler ou deployer utilize nome usado pelo programador no cdigo-fonte e associe ao nome do papel declarado no deployment descriptor ... admin administrador ... A declarao do obrigatria sempre que houver controle de acesso no cdigo (mesmo se o nome usado no cdigo for igual ao declarado no DD)if(!ctx.isCallerInRole("administrador")) { if (!loggedUser.equals(userid)) { throw new Exception("..."); } admin } ... 20 21. Configurao do JBoss Para executar os exerccios e os outros exemplos (deste e dos prximos captulos) preciso configurar a tabela com usurios e estabelecer um domnio de segurana no JBoss Roteiro Abra o arquivo login-config.xml e inclua as duas definies de domnio contidas no arquivo cap13/jaas.xml. Ele define um LoginModule para acesso JDBC. Rode ant create-table para criar as tabelas e povo-las com os usurios e grupos necessrios Reinicie o JBoss para que ele leia as configuraes 21 22. Exer