Java 2 Enterprise Edition Fundamentos básicos de Segurança



Documentos relacionados
Autenticação e Controle de Acesso

J550 Segurança e Controle de erros

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Java 2 Enterprise Edition Fundamentos básicos de Transações

Tutorial Módulo 06 - Segurança

Sistemas Distribuídos na WEB (Plataformas para Aplicações Distribuídas) Sumário. Java 2 Enterprise Edition. J2EE (Java 2 Enterprise Edition)

Stateful Session Beans

Java 2 Enterprise Edition Uma aplicação J2EE completa

Laboratório EJB e J2EE Uma aplicação completa

Autenticação e Autorização

Message Driven Beans. Apresentação. Introdução Implementação de MDBs Deployment no JBoss Java Messaging Service Exemplo

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. Servlets A,L,F,M

Enterprise Java Beans

AULA APLICAÇÕES PARA WEB SESSÕES E LOGIN E SENHA

J2EE. J2EE - Surgimento

Prática Sobre Servlets e JSP

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Java 2 Standard Edition. Fundamentos de. Objetos Remotos. Helder da Rocha

J530 - Enterprise JavaBeans. Introdução a EJB e Stateless. Session Beans. argonavis.com.br. Helder da Rocha (helder@acm.org)

Aula 03 - Projeto Java Web

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

Capítulo 4. Programação em ASP

J550. Apache Struts. Helder da Rocha

J530 - Enterprise JavaBeans. Relacionamentos em EJB com. CMP e BMP. argonavis.com.br. Helder da Rocha (helder@acm.org)

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

SIQ GQF Plugin s WEB (Aplicações WEB) Gestão da Qualidade de Fornecedores

JSF - Controle de Acesso FERNANDO FREITAS COSTA

Faculdade de Computação Programação para Internet Trabalho Servlets

J550. Model View Controller

Argo Navis J931 - Padrões de Design J2EE. Versão 2.0 (setembro de 2003) Objetivos

Java II. Sérgio Luiz Ruivace Cerqueira

TUTORIAL SPRING SECURITY PROGRAMAÇÃO COM FRAMEWORKS Responsáveis: Ana Luíza Cruvinel, Maikon Franczak e Wendel Borges

TUTORIAL JAVA AS - HTTP CLIENT COMPOSITION ENVIROMENT 7.1

J2EE. Exemplo completo Utilização Servlet. Instrutor HEngholmJr

Padrão Arquitetura em Camadas

Tencologia em Análise e Desenvolvimento de Sistemas Disciplina: WEB I Conteúdo: WEB Container Aula 04

Prática em Laboratório N.02 Criando um serviço Web via NetBeans

Sistemas Distribuídos

Java para Desenvolvimento Web

Web Technologies. Tópicos da apresentação

Guia de Fatores de Qualidade de OO e Java

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Aplicabilidade: visão geral

Configuração de Cliente de Web Service HTTPS

Java 2 Standard Edition Como criar classes e objetos

Segurança em Aplicações J2EE no Ambiente JBoss

Java 2 Enterprise Edition Serviços de Localização

Desenvolvimento de aplicações Web. Java Server Pages

WebWork 2. João Carlos Pinheiro.

J2EE TM Java 2 Plataform, Enterprise Edition

Programação de Computadores - I. Profª Beatriz Profº Israel

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

J550. Helder da Rocha

Java para WEB. Servlets

Implementando uma aplicação java segura utilizando JAAS. Introdução

Tecnologias Web. Java Enterprise Edition

Programação Web Aula 12 - Java Web Software

Manual do PolicyKit-kde. Daniel Nicoletti Tradução: Luiz Fernando Ranghetti

Curso de Java. Geração de Páginas WEB através de JSP. Todos os direitos reservados Klais

ROTEIRO PARA INSTALAÇÃO DO BITVISE, CONFIGURAÇÃO DE CHAVES SSH, DEFINIÇÃO DAS PORTAS PARA OS TÚNEIS SSH E CONFIGURAÇÃO DO THUNDERBIRD

Scriptlets e Formulários

UFG - Instituto de Informática

Argo Navis J931 - Padrões de Design J2EE. Introdução. Objetivos de aprender padrões J2EE. Conhecer padrões para uso na plataforma J2EE

Acesso a Bancos de Dados em Java (JDBC)

Relatório referente a compreensão da programação JSP. Realizado do dia de 22 abril de 2010 a 03 de maio de 2010.

Parte I. Demoiselle Mail

MANUAL DE INSTALAÇÃO JBOSS-JOSSO

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

Manual de Utilização do PLONE (Gerenciador de página pessoal)

JPA: Persistência padronizada em Java

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Persistência de Classes em Tabelas de Banco de Dados

JSP (Java Server Pages)

Manual Versão: 2.0 Autor: Alex Luciano Msn: Instalação

Desenvolvimento Web com Framework Demoiselle versão 1.0

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Sistemas Distribuídos na WEB (Plataformas para Aplicações Distribuídas)

Acessando um Banco de Dados

INTRODUÇÃO À TECNOLOGIA SERVLETS

Omega Tecnologia Manual Omega Hosting

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Serviço de Transação. Transação - Conceitos

Oracle WebLogic Server 11g: Conceitos Básicos de Administração

Transcrição:

Java 2 Enterprise Edition Fundamentos básicos de Segurança Helder da Rocha www.argonavis.com.br 1

Objetivos Este capítulo apresenta Noções básicas de segurança em J2EE Exemplos de aplicações Usos típicos de JAAS Controle de acesso em aplicações J2EE com A abordagem deste assunto neste curso é superficial. Para maiores detalhes consulte Livros-texto (MEJB contém versão original do exemplo mostrado usando outro modelo de autenticação; J2EE Tutorial mostra exemplo usando container do J2EE-RI) Código-exemplo (comentado) Capítulo 13 do curso J530 (www.argonavis.com.br) Aplicações exemplo do capítulo 15 (código) 2

Controle de acesso a autenticação em EJB A especificação EJB 2.0 define controle de acesso a métodos e autenticação de clientes Não abrange outros aspectos importantes de segurança, como criptografia e comunicação segura Autenticação depende de implementação no container Identidade é representada por objeto java.security.principal O controle de acesso declarado no ejb-jar.xml Declara-se papéis lógicos que podem ser mapeados a usuários e grupos: <security-role> Papéis são associados a métodos para determinar quem tem autorização para executar: <method-permission> Métodos podem ser executados em outros beans por um Principal diferente: <security-identity><run-as> 3

Controle de acesso no ejb-jar.xml <assembly-descriptor> <security-role> <role-name>bankcustomer</role-name> </security-role> <security-role> <role-name>bankadmin</role-name> </security-role> <method-permission> <unchecked /> <method> <ejb-name>customerejb</ejb-name> <method-name>getprimarykey</method-name> </method> </method-permission> <method-permission> <role-name>bankadmin</role-name> <method> <ejb-name>customerejb</ejb-name> <method-name>*</method-name> </method> <method-permission> </assembly-descriptor> Papéis lógicos participantes ejb-jar.xml Grupo de métodos não verificados Grupo de métodos de CustomerEJB que só podem ser chamados por usuários que assumem o papel de BankAdmin 4

JAAS A autenticação depende de infraestrutura do servidor e pode ser implementada com o Java Authentication and Authorization Service - JAAS JAAS é uma API para autenticação de usuários e autorização. A maior parte é implementada pelo servidor Principais 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.loginmodule 5

Implementação do JAAS no JBoss (JBossSX) A implementação do JAAS no JBoss consiste de JAASecurityManager Módulos de configuração do servidor (login-config.xml) e do cliente (auth.conf) Implementações de javax.security.auth.spi.loginmodule ClientLoginModule Implementação de LoginModule no cliente UsersRolesLoginModule Uma das implementações de LoginModule no servidor Par de arquivos de texto para definir usuários e grupos jboss.xml e jboss-web.xml Declaram domínio JAAS a ser usado através do elemento <security-domain> de jboss.xml e jboss-web.xml 6

Configuração do JBoss Para utilizar os domínios de segurança do JBoss é preciso realizar configurações no servidor e em cada aplicação No servidor Arquivo login-config.xml localizado no diretório $JBOSS_HOME/server/default/conf/ Criação de domínios de segurança e sua associação com módulos de login existentes Na aplicação Arquivo jboss.xml (e/ou jboss-web.xml, se autenticação ocorrer via Web Container) Declaração do domínio de segurança JAAS usado Em clientes standalone, criação de domínios de segurança 7

Domínio de segurança do servidor JBossSX Deve ser declarado em jboss.xml (ou jboss-web.xml) <jboss> <security-domain> java:/jaas/dominio-servidor</security-domain> <session> <ejb-name>securehelloejb</ejb-name> <jndi-name>login/hellohome</jndi-name> </session> </jboss> jboss.xml Deve coincidir com nome de um <application-policy> (que define o domínio) em login-config.xml <policy> (...) <application-policy name="dominio-servidor"> <authentication> <login-module code="myloginmodule".../> Se não houver domínio com este nome em login-config.xml, será usado o domínio default "other", previamente configurado para usar UsersRolesLoginModule (veja slide seguinte) 8

Serviço JBossSX com UsersRolesLoginModule Módulo simples que utiliza par de arquivos de texto É a configuração default em login-config.xml <policy> (...) <application-policy name="other"> <authentication> <login-module code="org.jboss.security.auth.spi.usersrolesloginmodule" flag="required" /> </authentication> </application-policy> </policy> Trecho de server/default/conf/login-config.xml users.properties (nome=senha) mickey=mouse niquel=nausea roles.properties (nome.grupo=role,...,role) mickey.roles=testrole, AdminRole niquel.roles=norole, MouseRole Use preferencialmente senha criptografada! Coloque no CLASSPATH do servidor (pode ser no EJB-JAR) 9

Domínio 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 também ter uma ou mais tabelas criadas com os dados de login (usuario, senha e grupo) O módulo requer três opções que são: nome do Datasource, query que retorne a senha, dado o userid e query que retorne um grupo, como "Roles" dado um userid <application-policy name="dominio-jdbc-servidor"> <authentication> <login-module code="org.jboss.security.auth.spi.databaseserverloginmodule"> <module-option name="dsjndiname">java:/defaultds</module-option> <module-option name="principalsquery"> select senha from usuarios where id=?</module-option> <module-option name="rolesquery"> select grupo, 'Roles' from grupos where id=?</module-option> <module-option name="unauthenticatedidentity">nobody</module-option> </login-module> </authentication> </application-policy> 10

Domínio de segurança do cliente JBossSX Coloque no Classpath do cliente standalone Arquivo de configuração (indica no mínimo a implementação de login module usada) arquivo de configuração (default) dominio-cliente { // JBoss LoginModule implementation org.jboss.security.clientloginmodule }; required; Informe ao cliente a localização do arquivo através da propriedade java.security.auth.login.config: > java Prog -Djava.security.auth.login.config=auth.txt JARs do JBossSX: jbosssx-client.jar (além dos outros JARs necessários para o cliente JBoss) 11

Domínio de clientes dentro de containers Para clientes que executam dentro do servidor (ex: servlets, JSP), chame o mesmo login module através de domínio definido na configuração do JBoss Ex: domínio declarado em login-config.xml: <application-policy name="dominio-cliente"> <authentication> <login-module code="org.jboss.security.clientloginmodule" flag="required"> </login-module> </authentication> </application-policy> 12

Cliente standalone padrão JAAS para login public class HelloClient { public static void main(string[] args) throws Exception { } } LoginContext loginctx = null; try { // Cria CallBackHandler CallbackHandler handler = new HelloCallbackHandler(); // Carrega configuração loginctx = new LoginContext("dominio-cliente", handler); // Faz o login loginctx.login(); Faz o login aqui } catch (LoginException e) { System.out.println("Login failed"); System.exit(1); } // Executa ação privilegiada propagando contexto de segurança Context ctx = new InitialContext(System.getProperties()); Object obj = ctx.lookup("securehelloejb"); HelloHome home = (HelloHome) PortableRemoteObject.narrow(obj, HelloHome.class); Hello hello = home.create(); System.out.println(hello.hello()); Encapsula dados de autenticação Dominio do cliente (veja slides anteriores) Chama métodos privilegiados 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; } public HelloCallbackHandler() { LoginDialog dialog = new LoginDialog("User Authentication Required"); this.username = dialog.getdata()[0]; this.password = dialog.getdata()[1]; GUI simples para entrada de texto Preenche array de callbacks 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 } 14

Exemplo JAAS: como executar Diretório cap15/exemplos/mejb Configuração Configure build.properties Edite usuários e grupos em lib/users.properties e lib/roles.properties Use targets do Ant > ant jboss.deploy (para instalar) > ant run.jboss.client (para rodar) Digite nome e senha compatíveis com arquivos de configuração Tente logar como usuário válido não autorizado (niquel) 15

Aplicação exemplo: ejb-jar.xml <ejb-jar> <enterprise-beans> <session> <ejb-name>securehelloejb</ejb-name> <home>examples.hellohome</home> <remote>examples.hello</remote> <ejb-class>examples.hellobean</ejb-class> <session-type>stateless</session-type> <transaction-type>container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <security-role> <role-name>testrole</role-name> </security-role> <method-permission> <role-name>testrole</role-name> <method> <ejb-name>securehelloejb</ejb-name> <method-name>*</method-name> </method> </method-permission> </assembly-descriptor> </ejb-jar> Todos os métodos acessíveis a TestRole Veja código exemplo em cap15/exemplos/mejb 16

Controle de acesso e autenticação em Servlets A especificação Servlet 2.3 permite a configuração de segurança em dois domínios Autenticação: o processo de verificação da identidade do usuário que solicita um recurso - quem é? Autorização: processo de verificação das permissões que um usuário autenticado possui - o que ele pode fazer? Os dois recursos podem ser configurados para cada contexto no web.xml definindo Login Configuration: configuração de métodos de autenticação utilizados Security Roles: perfis de usuário para autorização Security Constraint: URLs e métodos de acesso permitidos e perfis de segurança necessários para acessá-los 17

Configuração de Login em aplicações Web Escolha uma dentre quatro técnicas de autenticação BASIC: mostra uma janela do browser que recebe nome e senha. Os dados são enviados em conexão insegura FORM: igual a BASIC mas em vez de usar uma janela do browser, pemite o uso de um formulário HTML DIGEST: usa criptografia fraca para enviar os dados CLIENT-CERT: requer certificado X-509 para funcionar e usa criptografia forte (128-bit) BASIC, FORM e DIGEST são seguros se usados com SSL <login-config> <auth-method>form</auth-method> <form-login-config> <form-login-page>/form.html</form-login-page> <form-error-page>/erro.html</form-error-page> </form-login-config> </login-config> <login-config> <auth-method> BASIC </auth-method> </login-config> 18

Autorização: perfis de usuário - web.xml Uma vez definida a forma de autenticação, é preciso definir perfis de usuário habilitados a acessar os recursos A declaração de perfis de usuários é feita no web.xml usando <security-role>. A associação desses perfis com usuários reais é dependente de servidor <security-role> <role-name>administrador</role-name> </security-role> <security-role> <role-name>membro</role-name> </security-role> <security-role> <role-name>visitante</role-name> </security-role> 19

Web-Resource Collection no web.xml A coleção de recursos Web protegidos e os métodos de acesso que podem ser usados para acessá-los é definido em um bloco <web-resource-collection> definido dentro de <security-constraint> Inclui URL-patterns <url-pattern> que indicam quais os mapeamentos que abrangem a coleção Inclui um <http-method> para cada método permitido <security-constraint> <web-resource-collection> <web-resource-name>seção de Assinantes</web-resource-name> <url-pattern>/membros/*</url-pattern> <url-pattern>/preferencias/config.jsp</url-pattern> <http-method>get</http-method> <http-method>post</http-method> </web-resource-collection>... </security-constraint> 20

Security Constraint no web.xml O Web Resource Collection faz parte do Security Constraint que associa perfis de usuário (papéis lógicos) à coleção <security-constraint> <web-resource-collection> <web-resource-name>seção de Assinantes</web-resource-name> <url-pattern>/membros/*</url-pattern> <url-pattern>/preferencias/config.jsp</url-pattern> <http-method>get</http-method> <http-method>post</http-method> </web-resource-collection> <auth-constraint> <role-name>administrador</role-name> </auth-constraint> </security-constraint>... <security-constraint>... outras coleções e constraint... </security-constraint> 21

Form-based Login no web.xml Para autenticação por formulário, é preciso definir no <login-config> FORM como <auth-method> Adicionalmente, é informada a página que implementa o formulário. Esta página deve conter um elemento <FORM> HTML com algumas restrições Atributo ACTION de <FORM> deve conter: j_security_check Campo <INPUT> do nome deve conter: j_username Campo <INPUT> da senha deve conter: j_password <form action="j_security_check" method="post"> <p>digite seu nome de usuário: <input type="text" name="j_username"> <p>digite sua senha: <input type="password" name="j_password"> <input type="submit"> </form> 22

Como identificar o principal O principal (a pessoa que foi autenticada) é accessível dentro de EJBs e servlets/jsp através de seus contextos Ambos retornam javax.security.principal getname() de Principal retorna id do usuário logado EJBContext: getcallerprincipal() Principal usuario = ctx.getcallerprincipal(); String nome = usuario.getname(); ServletContext: getuserprincipal() Principal usuario = application.getuserprincipal(); String nome = usuario.getname(); 23

Como identificar o papel O papel (role) do usuário logado pode ser testado também através dos contextos de EJBs e Servlets usando métodos similares Nome do papel pode deve ser mapeado a outro nome (referência) no deployment descriptor EJBContext: boolean iscallerinrole(string role) if (ctx.getcallerinrole("admin")) { // dar acesso ao usuário } ServletContext: boolean isuserinrole(string role) if (application.getuserinrole("admin")) { } // dar acesso ao usuário 24

Configuração do JBoss Para executar os exercícios e os outros exemplos (deste e dos próximos capítulos) é preciso configurar a tabela com usuários e estabelecer um domínio de segurança no JBoss Roteiro Abra o arquivo login-config.xml e inclua as duas definições de domínio contidas no arquivo cap14/jaas.xml. Ele define um LoginModule para acesso JDBC. Rode ant create-table para criar as tabelas e povoá-las com os usuários e grupos necessários Reinicie o JBoss para que ele leia as configurações 25

Exercício 1. a) Crie uma aplicação contendo um session bean com dois métodos listarnomes() adicionarnome(string nome) 1. b) Crie dois papéis (roles): User e Admin e defina as permissões dos métodos Admin: pode listarnomes() e adicionarnome() User: pode listarnomes() 1. c) Implemente um cliente que faça o login e chame um dos dois métodos 1. d) Configure usuários do sistema, associe-os aos papéis existentes e rode a aplicação 26

Fontes [1] JBoss Group. JBoss User's Manual. Chapter 8: The JBoss Security Extension Framework. [2] Erik Jendrock. Security. Sun J2EE Tutorial. [3] Richard Monson-Haefel, Enterprise JavaBeans, 3rd. Edition, O'Reilly and Associates, 2001 [4] Ed Roman. Mastering EJB 2. 27

helder@argonavis.com.br argonavis.com.br Rev. 1.5 - Junho 2003 28