You are on page 1of 22

Implementando uma aplicao java segura utilizando JAAS.

Introduo
Neste documento mostrarei como desenvolver uma simples aplicao utilizando JAAS (Java Authentication and Authorization Service) e um pouco de JQuery para realizar a validao de alguns campos. As tecnologias utilizadas sero: JDK 5.0 Update 22 e NetBeans 6.5.1 www.sun.com.br MySql 5.0 http://dev.mysql.com/downloads TomCat 6.0.18 (Instalado juntamente com o NetBeans)

Let's go..
Com seu JDK e NetBeans j instalado , vamos comear criando um novo projeto clicando com o boto direito na aba lateral projetos e em seguida selecionando Java Web e depois Aplicao Web ou ento atravs do menu Arquivo e Novo Projeto. Ento de um nome a sua aplicao, com a inicial maiscula preferencialmente e clique em Prximo.

Se preferir altere o Caminho do contexto que ser o nome que ser exibido na URL quando executar sua aplicao.

E clique em Finalizar. Ento voc ter um projeto ao menos parecido com este...

Ento vamos dar uma organizada na disposio dos diretrios para que possamos dar andamento no projeto. Crie trs (3) diretrios dentro de Pginas Web com os nomes: jsp, admin e user, por fim mova a pgina index.jsp, que foi gerad aautomaticamente pela IDE, para o diretrio jsp. Obs: No tente ainda executar seu projeto, configuraremos o web.xml em instantes. Veja o que fizemos at agora:

Agora criaremos algumas outras pginas, clicando sobre o diretrio de destino e selecionando Novo JSP. Crie as pginas de forma que fiquem desta maneira:

Dentro do diretrio WEB-INF voc encontrar um arquivo chamado web.xml, ele responsvel pelo mapeamento dos recursos de toda sua aplicao, e como alteramos o local da pgina index.jsp precisamos alterar tambm seu mapa. Veja:

Ento execute seu projeto, para conferir se tudo est funcionando corretamente, em caso positivo, voc ver o to famoso Hello World ! em seu browser padro.

Agora, um pouco de JAAS


O JAAS ou Java Authentication and Authorization Service composto de um conjunto de API's para distinguir definitivamente a camada de segurana da camada de aplicao, retirando assim a responsabilidade do desenvolvedor de manter filtros e ou quaisquer outros mtodos de forma programtica.

Diz-se que este um tipo de segurana declarativa, pois, so apenas declaradas as restries no arquivo web.xml de sua aplicao e no server.xml do servidor web, que em nosso caso o Apache Tomcat. Para economizar um pouco de digitao, vou usar uma referncia muito boa retirada do site http://jspbrasil.com.br/mostrar/28 , do autor Gleydson Lima (gleydson@jeebrasil.com.br). Segue o trecho com fonte em itlico...
Conceitos Importantes Para o bom entendimento da segurana no J2EE necessrio que conheamos alguns conceitos importantes. Os conceitos mais importantes so o de role, user, group e realm. Role: Um role um nvel de permisso. Usurios podem ter roles diferentes e com acessos diferentes. Por exemplo, um sistema de gesto da empresa poderia ter os roles: Funcionrio Gerente Diretor Fornecer Cada ator interage com o sistema com nveis de permisses diferentes. Um Gerente e o Diretor tm acesso ao mdulo de folha de pagamento, no entanto o Fornecedor e Funcionrio no. Um role representa, em nveis prticos, o papel que o usurio tem no domnio da empresa. Provavelmente, no domnio do negcio o funcionrio no tem acesso a folha de pagamento da empresa. Isso deve se refletir no sistema. User: Um usurio representa uma entidade com acesso ao sistema. O nvel de acesso desse usurio vai depender do seu role. O usurio claudio pode ter o role Gerente e o usurio marcos o role Funcionrio. Assim, no acesso ao sistema, o usurio claudio quando tentar acesso o mdulo de folha de pagamento no ser barrado pelo servidor de aplicaes, permitindo assim que ele possa acessa-lo. Porm, se o usurio marcos tentar realizar a mesma operao o servidor de aplicaes ir emitir um erro de segurana e no permitir que se tenha acesso ao mdulo. Group: Um grupo associado com um conjunto de roles e todo usurio que membro do grupo automaticamente herda os roles associados. Por exemplo, podemos criar um grupo denominado Gerencia. Os roles pertencentes ao grupo Gerencia sero Gerente e Diretor. Se colocarmos o usurio carlos pertencente ao grupo Gerencia, ele herdaria automaticamente todas as permisses do role Gerente e Diretor. Realm: Um conjunto completo de usurios, roles e groups normalmente armazenados em algum banco de dados. Existem vrios tipos de Realm. Podermos guardar as informaes de segurana em um servidor de diretrios LDAP ou NIS, em arquivos de configuraes ou em um banco de

dados. Roles Os roles so nveis de permisso que normalmente so associados com partes de URL que possuem acessos diferentes. Por exemplo, podemos dar acesso a URL http://www.empresa.com.br/folha-pagamento para somente usurios que possuam o role de diretor e http://www.empresa.com.br/contra-cheque para usurios que possuam o role de funcionrio. Dessa forma os usurios que possuem o role funcionrio no possui acesso rea de diretor. Por exemplo, podemos definir esses roles no arquivo web.xml da aplicao, como mostra o exemplo abaixo: <security-role> <description>Diretor da Empresa</description> <role-name>diretor</role-name> </security-role> <security-role> <description>Funcionrio da Empresa</description> <role-name>funcionario</role-name> </security-role> Agora precisamos fazer um mapeamento de usurios com os roles, normalmente em nvel de descritores isso feito em deployment descriptores especficos do servidor, no caso do tomcat o conf/tomcat-users.xml. <?xml version='1.0'?> <tomcat-users> <user username='gleydson' password='abced' roles='diretor,funcionario'/> <user username='jose' password='qwert' roles='funcionario'/> </tomcat-users> Note que um usurio pode ter vrios roles, dessa forma este usurio ter acesso rea de funcionrio e diretor. Referenciando um role existente possvel adicionar links de roles, como mostrado abaixo:

<security-role-ref> <role-name>empregado <role-link>funcionario </security-role-ref> Dessa forma o role empregado passa um link para o role funcionario. Configurando o acesso a recursos Web A configurao da segurana declarativa ser dada no deployment descriptor (web.xml) da aplicao e basicamente por trs tags XML: <login-config>: Configura qual ser o modo de requisitar a autenticao ao usurio e de qual realm o servidor de aplicaes ir buscar informaes. <security-constraint>: Usada para configurar os acessos a um conjunto de recursos atravs de mapeamento de URL. <security-role>: Representa um conjunto definido de grupos de realm. Security Constraints As security constraints determina quem autorizado a acessar um conjunto de padres de URL juntamente com seus mtodos de acesso (POST ou GET). Caso voc defina um security constraint para uma determinada URL o container s permitir acesso a essa URL atravs de um usurio autenticado e com o role especfico. Caso um outro usurio no autenticado tente acessar o contedo, o servidor ir tentar autenticar este usurio. Autenticao de Usurios Existem basicamente cinco tipos de autenticao de usurios como listado abaixo: Nenhuma: Usurio no autenticado. HTTP Basic Authentication (<auth-method>BASIC</auth-method>): Este mtodo de autenticao faz com que o browser solicite usurio e senha para autenticao atravs de um formulrio proprietrio do prprio browser. Form-based Authentication (<auth-method>FORM</auth-method>): Este mtodo permite ao usurio mostrar uma pgina JSP que ser o formulrio de autenticao como tambm uma pgina padro de erros. <!-- LOGIN AUTHENTICATION --> <login-config> <auth-method>FORM</auth-method> <realm-name>default</realm-name> <form-login-config> <form-login-page>login.jsp</form-login-page> <form-error-page>error.jsp</form-error-page> </form-login-config> </login-config>

Toda s vezes que os recursos configurados forem acessados e houver a necessidade de autenticao o formulrio login.jsp ser exibido. Client-certificate authentication (<auth-method>CLIENT-CERT</auth-method>): Este o mtodo mais seguro de autenticao usando SSL e esquemas de troca de certificados para autenticao. Digest Authentication(<auth-method>DIGEST</auth-method>): O mtodo DIGEST parecido com o BASIC e FORM, porm as informaes de password so enviadas criptografadas atravs de algum algoritmo de hashing. Dessa forma a senha trafega criptografada mesmo em canais no seguros. Exemplo de uma configurao de web.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com./dtd/web-app_2_3.dtd">... <display-name>J2EEBrasilApp</display-name> <servlet> <servlet-name>index</servlet-name> <display-name>index</display-name> <jsp-file>/index.jsp</jsp-file> </servlet> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- REGRAS DE SEGURANA --> <security-constraint> <web-resource-collection> <web-resource-name>WRCollection</web-resource-name> <url-pattern>/sistema/contra-cheque/</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <role-name>funcionario</role-name> </auth-constraint>

<user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>WRCollection</web-resource-name> <url-pattern>/sistema/folha-pagamento/</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <role-name>diretor</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <!-- MTODO DE LOGIN --> <login-config> <realm-name></realm-name> <auth-method>BASIC</auth-method> </login-config> <!-- ROLES DE SEGURANA --> <security-role> <role-name>diretor</role-name> </security-role>

<security-role> <role-name>funcionario</role-name> </security-role>

Nuss... Quanta informao no ? Voltando a nosso projeto, decidi criar um JDBCRealm para coisa ficar mais interessante ao invs de guardar as informaes em arquivos no servidor. Vamos comear criando o banco que iremos utilizar, utilize seu editor preferido para realizar esta tarefa, vou mostrar um exemplo de desenho de BD que fiz, no sou muito bom com isso, mas, funcionou...
create table usuarios( usu_login varchar(20) primary key, usu_pass varchar(50) not null, usu_nome varchar(50) not null, usu_email varchar(100) not null ) engine= InnoDB; create table papeis( pap_descricao varchar(20) not null, primary key (pap_descricao) ) engine= InnoDB; create table usupap( usu_login varchar(20) not null, pap_descricao varchar(20) not null, primary key (usu_login, pap_descricao), foreign key (usu_login) references usuarios (usu_login), foreign key (pap_descricao) references papeis (pap_descricao) ) engine= InnoDB; /*Senha = MD5(admin).*/ insert into usuarios values ('admin','21232f297a57a5a743894a0e4a801fc3','ADMINISTRADOR','adm@adm.com'); /*Senha = MD5(user).*/ insert into usuarios values ('user','ee11cbb19052e40b07aac0ca060c23ee','USUARIO','user@user.com'); insert into papeis values('manager'); insert into papeis values('user'); insert into usupap values('admin','manager'); insert into usupap values('user','user');

Neste momento, voc j tem as tabelas criadas e dois papis j pr-

definidos, manager obrigatrio na maioria das verses do Tomcat (acho que li isto em algum lugar...) e user que nosso usurio comum e tambm dois usurios admine user com seus respectivos papis e senhas. Neste caso cada usurio tem apenas um papel, mas poderiam ter quantos fossem necessrios, mas para nossa ilustrao, um para cada j o bastante. Agora no NetBeans selecione a aba Servios e em seguida o item Servidores, clique com o boto direito do mouse sobre Apache Tomcat e selecione Editar server.xml. Adicione este trecho seu arquivo server.xml. Ateno a connectionURL pois ela pode variar dependendo da sua configurao. OBS: Localize uma tag <Realm.. , deve ser abaixo da mesma.
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" digest="MD5" connectionURL="jdbc:mysql://localhost:3306/securedb" connectionName="root" connectionPassword="" userTable="usuarios" userNameCol="usu_login" userCredCol="usu_pass" userRoleTable="usupap" roleNameCol="pap_descricao"/>

Mais informaes em: http://tomcat.apache.org/tomcat-5.5-doc/realm-howto.html Reinicie o servidor, isto pode ser feito atravs do boto Reiniciar servidor na parte lateral esquerda da aba inferior do prprio NetBeans. Veja:

A partir de agora caso seja solicitado identificao para que possa efetuar a construo ou execuo do projeto, voc deve inserir admin para usurio e senha, j que este o role administrador do Tomcat, como definimos no banco de dados. Usaremos o mtodo FORM para a autenticao ento temos que editar nossa pgina de login para que fique dentro do padro exigido para tal.

No sou muito bom com design e esse tambm no nosso foco (ainda bem...), ento constru uma pgina o mais simples possvel. Veja:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> body { margin:0; padding:0; background:#ccc; text-align:center; } label{ display: block; text-align:left; } #pagina { width: 180px; margin: 200px auto; padding: 10px; text-align:left; / } #fields { padding: 5px; text-align:center; } #butEnviar{ margin-left:125px; } </style> <title>Login</title> </head> <body> <div id="pagina"> <div id="fields"> <form action="j_security_check" method="post"> <label>Usu&aacute;rio</label> <input id="j_username" name="j_username" type="text"> <label >Senha</label> <input id="j_password" name="j_password" type="password"> <br> <input id="butEnviar" type="submit" value="Enviar"> </form> </div> </div> </body> </html>

Bonita no ... importante saber que as propriedades marcadas em vermelho tem que ter esse nome obrigatoriamente. E tambm criaremos uma pgina de login.
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> body { margin:0; padding:0; text-align:center; / } #pagina { width: 100%; margin:0 auto; padding: 10px; text-align:left; } #msg { text-align:center; color:red; } </style> <title>Erro</title> </head> <body> <div id="pagina"> <div id="msg"> <h1>Voc&ecirc; n&atilde;o tem permiss&atilde;o para acessar este recurso.</h1> </div> </div> </body> </html>

As pginas com restrio de acesso podem ser formatadas da forma que voc achar melhor so elas: restricted.jsp (poderia ser uma pgina de administrao) e a outra allowed.jsp (destinada a um usurio especfico). Bem, at aqui j criamos o banco de usurios e permisses, configuramos

o servidor, criamos as pginas de login e erro e j sabemos quem pode acessar qual pgina... ns sabemos mas a aplicao no, ento vamos voltar ao nosso arquivo web.xml. Suas configuraes devem ser muito parecidas a esta:
<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/jsp/login.jsp</form-login-page> <form-error-page>/jsp/error.jsp</form-error-page> </form-login-config> </login-config> <security-role> <role-name>manager</role-name> </security-role> <security-constraint> <web-resource-collection> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>manager</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>user</role-name> </security-role> <security-constraint> <web-resource-collection> <url-pattern>/user/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint>

Defimos ento que o mtodo de autenticao ser o FORM, que somentes os usurios com role manager podero acessar as pginas do diretrio /admin e que somente os usurios com role user podem acessar o diretrio /user e seu contedo. Criei uma pgina de login apenas com dois links um para a pgina contida no diretrio admin e outro para a pgina do diretrio user.

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> body { margin:0; padding:0; text-align:center; } #pagina { width: 100px; margin: 200px auto; padding: 10px; text-align:left; } #msg { text-align:center; } </style> <title>Index</title> </head> <body> <div id="pagina"> <div id="msg"> <a href="../admin/restricted.jsp"> <h1>Administrador</h1> </a> <a href="../user/allowed.jsp"> <h1>Usu&aacute;rio</h1> </a> </div> </div> </body> </html>

A permisso mantida na sesso ento para alternar entre os tipos manager e user voc tem duas alternativas: criar um logoutinvalidando a sesso ou reiniciar seu browser. Ento vamos l... Selecione pra onde voc deseja ir:

Selecionei administrador e ento fui redirecionado para apgina de login.

Digitei o usurio e senha corretamente e...

E estamos na pgina de administrao. Se tivssemos inserido um usurio e senha vlidos porem sem o nvel de acesso necessrio veramos isso.

Ou se insirido usurio ou senha invlidos....

Ento seriamos redirecionados a pgina de erro...

Bom acho que isso, fizemos algo bem simples, mas atendendo o proposto, daqui em diante depende de sua necessidade e imaginao. Obrigado...

Resolvemos um problema, mas, temos outro. Rastreando minha interface de rede local e executando nossa aplicao de login veja o que encontrei...

E@@YSOJ_J/i ##{,POST /admin/j_security_check HTTP/1.1 Host: localhost:8084 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090920 Firefox/ 3.5.3 (Swiftfox) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost:8084/admin/restricted.jsp Cookie: JSESSIONID=48F5BD75426390B0C427E8CBB97D97ED Content-Type: application/x-www-form-urlencoded Content-Length: 33 j_username=admin&j_password=admin EpV@@""Xgd ##W8SELECT usu_pass FROM usuarios WHERE usu_login = 'admin' E@@AQ"Xg" ##>defsecuredbusuariosusuariosusu_passusu_pass2! 21232F297a57a5a743894a0e4a801fc3

isso mesmo que voc esta pensando, estes so seu dados de login, usurio e senha em texto plano e encriptada.... Serei bem rpido nesta parte. A pergunta: O que precisamos para estabelecer uma conexo segura para transferir os dados de nosso login ? A resposta: SSL (https). Faremos aqui uma simulao simples, comece com este comando:
keytool -genkey -keystore sample.keystore -storepass samplepwd -keypass samplepwd -keyalg RSA -alias sample_key -validity 360 -dname "cn=SampleGroup,ou=Sample,c=Bebedouro,s=SP,c=BR"

Ele cria um storage com uma chave que usaremos em nosso certificado para possibilitar a execuo de uma conexo https.

Agora voc tera que editar o arquivo sever.xml do Tomcat adicionando estas linhas:
<Connector protocol="HTTP/1.1" SSLEnabled="true" port="8443" maxThreads="100" strategy="ms" maxHttpHeaderSize="8192" emptySessionPath="true" scheme="https" secure="true" clientAuth="false" keystoreFile=seucaminho/sample.keystore" keystorePass=" samplepwd" sslProtocol = "TLS" />

E por fim adicione isto ao web.xml da sua aplicao:


<security-constraint> <web-resource-collection> <web-resource-name>app-name</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>

Note que informamos que todas as pginas de nossa aplicao utilizaro conexo segura, eta no uma prtica muito performtica levando em considerao o trfego de rede, ento tente aplicar isso somente onde realmente necessrio. Quando executar sua aplicao possvel que seja solicitado para que adicione um exceo de segurana em relao ao certificado que criamos, j que ele no assinado por uma entidade certificadora. Depois de adicionada a exceo, observe que o canto da barra de navegao do browser muda de formato, veja:

E o rastreio de pacotes usando o Wireshark....

E@@9F. U &.j&'Mp:JM ).aQVOm~tt0kt >n<Bk>"]5H242g(BGvU'(w E }:t,Z$]MB}TWIDr=}H0D%@M{[V+QZ_ZDb`331~zlQRr(wQ`XH3WwJ`=|MJm.qjF9<^yi~$4H`6Sot`n(|lz>g9K#4M^BD ?D47 a' hPp)~/4d~05p=4C.j(6O"i8{3a3I-W$ %dbP\NFefM5I7L<{(Z_!_~J^oiaLM&b-kRoN~xUpMPbE:c$_I26w?Gne//KoB2>

E?W@@" "X3 &.k&.kcommit EsW@@z"+"Xg &.k&.k;SELECT pap_descricao FROM usupap WHERE usu_login = 'admin' EP@@@"X"j &.k&.kDdefsecuredbusupapusupappap_descricaopap_descricaoPmanager E?W@@"j"X3 &.k&.kcommit E?Q@@A]"X"u3 &.k&.k E@@9 .UHh &.k&.jQWHTLE_W*+.1nXS\j^g`d5R}[(E:%&cJAb9$IZ ]E{!%J4|H]+ (Qvv:6ZCxyJf9b.b<@&#F)80WV!mcy-5 J no vemos nossa senha...

FIM

Principais referncias
- http://www.paulovittor23.org/2007/10/16/conhecendo-a-seguranca-declarativa-do-java-jaas-parte-1/ - http://jspbrasil.com.br/mostrar/28 Leandro Alves ::: Java Development ::: Bacharel em Sistemas de Informao ::: Ps graduando em Desenvolvimento de Sistemas para Web leandroalvesbsi@gmail.com

You might also like