<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jeveaux.com &#187; Segurança</title>
	<atom:link href="http://jeveaux.com/category/seguranca/feed/" rel="self" type="application/rss+xml" />
	<link>http://jeveaux.com</link>
	<description>blog de um apaixonado por programação, videogame, leitura, ideias empreendedoras e agora tatuagem</description>
	<lastBuildDate>Tue, 05 Jul 2011 19:40:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Configurando SSL/TLS no JBoss/Tomcat</title>
		<link>http://jeveaux.com/2009/configurando-ssltls-no-jbosstomcat/</link>
		<comments>http://jeveaux.com/2009/configurando-ssltls-no-jbosstomcat/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:07:47 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[App Servers]]></category>
		<category><![CDATA[Certificado Digital]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=580</guid>
		<description><![CDATA[Segurança sempre soa como uma falácia na maioria dos projetos de software. É como aquele pessoal que não gosta ou não sabe testar: eles sabem que a coisa existe e que é preciso ou muito recomendável a usar, mas no &#8230; <a href="http://jeveaux.com/2009/configurando-ssltls-no-jbosstomcat/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Segurança sempre soa como uma falácia na maioria dos projetos de software. É como aquele pessoal que não gosta ou não sabe testar: eles sabem que a coisa existe e que é preciso ou muito recomendável a usar, mas no fim das contas dão de ombros e se funcionar funcionou.</p>
<p>Isso acontece muito quando o âmbito é segurança. Qual cliente ou usuário não se preocupa com segurança? Ao menos um controle de acesso com autenticação através de usuário e senha eles sempre exigem. E qualquer desenvolvedor que se preze se preocupa com isso.</p>
<p>Quando pensamos em segurança em aplicações Java temos que conhecer bem como funciona a arquitetura de segurança da plataforma Java, que é bem completa a útil. A divisão se dá em três &#8220;áreas&#8221; distintas, que são: <strong>JCA - Java Cryptography Architecture</strong> &#8211; Define classes e interfaces que são responsáveis por trabalhar com criptografia e descriptografia de dados e informações; <strong>JSSE - Java Secure Socket Extension</strong> &#8211; Usa a JCA para criar conexões seguras para troca de dados e informações; e <strong>JAAS - Java Authentication and Authorization Service</strong> &#8211; Responsável por autenticação e autorização nas aplicações Java. Neste post vou abordar somente um pouco do JSSE, <a href="http://www.jeveaux.com/blog/tag/jaas/">para saber mais sobre JAAS veja no arquivo do blog</a>.</p>
<p>O <strong>SSL</strong> (<em>Secure Socket Layer</em>) e o <strong>TLS</strong> (<em>Transport Layer Security</em>) são protocolos criptográficos usados para garantir a comunicação segura entre serviços de internet. Não vou entrar em detalhes sobre os protocolos e nem nas suas diferenças, <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">para maiores informações sugiro esta leitura</a>.</p>
<p>A necessidade fundamental de uma implementação com SSL é garantir a privacidade e integridade dos dados trafegados entre as aplicações que estão se comunicando. E isso é realizado através da autenticação das aplicações e da utilização de algoritmo criptográfico nos dados que estão sendo trafegados.</p>
<p>Dizer isso é meio <em>bonitinho</em> mas ninguém consegue compreender como isso ocorre de verdade, o que acontece por <em>&#8220;por baixo dos panos&#8221;</em>. Vamos imaginar um cliente utilizando um <em>browser</em> qualquer para acessar uma aplicação instalada num servidor JBoss, com certificado SSL implantado. Quando a comunicação entre eles é iniciada o servidor envia uma chave pública ao <em>browser</em>, que usa esta chave para criar uma chave privada temporária que é enviada de volta ao servidor. Desta forma as duas partes, servidor e <em>browser</em>, usarão estas chaves para estabelecer uma comunicação segura. Para saber mais sobre <a href="http://www.jeveaux.com/blog/2009/apresentacao-sobre-certificacao-digital/">chaves públicas, privadas, criptografia simétrica e assimétrica veja a minha apresentação sobre certificação digital</a>.</p>
<p>Vamos então por a mão na massa e configurar a aplicação.</p>
<p><span id="more-580"></span></p>
<h3>Criando as chaves</h3>
<p>Usaremos o keytool para criar um keystore e nele armazenar as chaves.</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">keytool <span style="color: #660033;">-genkey</span> <span style="color: #660033;">-keystore</span> jeve.keystore <span style="color: #660033;">-storepass</span> jevepass <span style="color: #660033;">-keypass</span> jevepass <span style="color: #660033;">-keyalg</span> RSA <span style="color: #660033;">-alias</span> jeve_key <span style="color: #660033;">-validity</span> <span style="color: #000000;">3650</span> <span style="color: #660033;">-dname</span> <span style="color: #ff0000;">&quot;cn=Jeveaux,ou=Jeveaux,c=Vitoria,s=ES,c=BR&quot;</span></div></td></tr></tbody></table></div>
<p>Detalhamento do comando:</p>
<ul>
<li><strong>keytool</strong>: comando</li>
<li><strong>-genkey</strong>: parrâmetro para criação das chaves</li>
<li><strong>-keystore</strong>: indica o caminho/nome do keystore (<em>jeve.keystore</em>)</li>
<li><strong>-storepass</strong>: indica a senha do keystore (<em>jevepass</em>)</li>
<li><strong>-keypass</strong>: indica a senha da chave (<em>jevepass</em>)</li>
<li><strong>-keyalg</strong>: indica o algoritmo de criptografia utilizado (<em>RSA</em>)</li>
<li><strong>-alias</strong>: indica o nome da chave a ser criada dentro do keystore (<em>jeve_key</em>)</li>
<li><strong>-validity</strong>: Validade do certificado em dias (<em>3650</em>)</li>
<li><strong>-dname &#8220;[...]&#8220;</strong>:  Informações do certificado (CN = nome comum, OU = unidade organizacional (departamento, divisão), O = nome da organização, L = nome da localidade (cidade), S = estado, C = código do país)</li>
</ul>
<p>Próximos passos, informar ao JBoss/Tomcat onde está o <em>keystore</em> e qual chave usar.</p>
<h3>Instalando as chaves</h3>
<p>Basicamente temos que copiar o arquivo do keystore, gerado no passo anterior, para o JBoss. O ideal seria em:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$</span>JBOSS_HOME<span style="color: #000000; font-weight: bold;">/</span>server<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>conf</div></td></tr></tbody></table></div>
<h3>Configurando o JBoss ou o Tomcat</h3>
<p>Trabalharemos agora no arquivo <em>server.xml</em> para configurar qual keystore usar. Este é um arquivo de configuração do Tomcat.</p>
<p>Se você estiver usando JBoss:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$</span>JBOSS_HOME<span style="color: #000000; font-weight: bold;">/</span>server<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>deploy<span style="color: #000000; font-weight: bold;">/</span>jbossweb.sar<span style="color: #000000; font-weight: bold;">/</span>server.xml</div></td></tr></tbody></table></div>
<p>Se estiver usando Tomcat:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$</span>TOMCAT_HOME<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>server.xml</div></td></tr></tbody></table></div>
<p>Procure por um comentário semelhante a este:</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">&lt;!-- Define a SSL HTTP/1.1 Connector on port 8443</span><br />
<span style="color: #808080; font-style: italic;">This connector uses the JSSE configuration, when using APR, the</span><br />
<span style="color: #808080; font-style: italic;">connector should be using the OpenSSL style configuration</span><br />
<span style="color: #808080; font-style: italic;">described in the APR documentation --&gt;</span></div></td></tr></tbody></table></div>
<p>Haverá um trecho do arquivo comentado logo abaixo, vamos retirar os comentários e ativar este trecho de código. Ajustando as propriedades adequadas chegaremos em algo próximo disso:</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Connector</span> <span style="color: #000066;">protocol</span>=<span style="color: #ff0000;">&quot;HTTP/1.1&quot;</span> <span style="color: #000066;">SSLEnabled</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">port</span>=<span style="color: #ff0000;">&quot;8443&quot;</span> <span style="color: #000066;">address</span>=<span style="color: #ff0000;">&quot;${jboss.bind.address}&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">maxThreads</span>=<span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #000066;">strategy</span>=<span style="color: #ff0000;">&quot;ms&quot;</span> <span style="color: #000066;">maxHttpHeaderSize</span>=<span style="color: #ff0000;">&quot;8192&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">emptySessionPath</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">scheme</span>=<span style="color: #ff0000;">&quot;https&quot;</span> <span style="color: #000066;">secure</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">clientAuth</span>=<span style="color: #ff0000;">&quot;false&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">keystoreFile</span>=<span style="color: #ff0000;">&quot;${jboss.server.home.dir}/conf/jeve.keystore&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">keystorePass</span>=<span style="color: #ff0000;">&quot;jevepass&quot;</span> sslProtocol = <span style="color: #ff0000;">&quot;TLS&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></td></tr></tbody></table></div>
<p>Os pontos mais importantes são: <em>port</em>, <em>keystoreFile</em> e <em>keystorePass</em>, que são responsáveis por, respectivamente, definir a porta para utilização do SSL, qual o arquivo contém as chaves e qual a senha do arquivo que contém as chaves.</p>
<p>Neste ponto já conseguimos utilizar a aplicação através do protocolo HTTPS, basta acessar:</p>
<div class="codecolorer-container html4strict vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">https://localhost:8443/aplicacao</div></td></tr></tbody></table></div>
<h3>Configurando a aplicação</h3>
<p>Até aqui a aplicação está disponível tanto através de HTTP quando através de HTTPS. Em algumas situações isso é desejado, em outras não. Existem casos onde precisaremos que algumas partes ou módulos da aplicação só funcionem com HTTPS e outras situações que toda a aplicação responda somente sob HTTPS, e ambas são possíveis de serem atendidas, veremos.</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>app-name<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user-data-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;transport-guarantee<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CONFIDENTIAL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/transport-guarantee<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/user-data-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Inserindo este trecho no seu <em>web.xml</em> nós faremos com que a aplicação inteira responda apenas sob protocolo HTTPS.</p>
<h3>Importando um certificado válido</h3>
<p>Tudo foi feito utilizando um certificado fictício e poderá correr assim durante o desenvolvimento, não há problema algum. Mas em produção este certificado terá o mesmo valor que uma nota de um cruzado novo. Então você, ou sua empresa, farão a aquisição de um certificado válido através de um autoridade certificadora e, quando isso ocorrer importaremos o certificado válido para nosso <em>keystore</em>, utilizando a mesma ferramenta que usamos para criar o certificado anterior <em>(keytool)</em> vejamos:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">keytool <span style="color: #660033;">-import</span> <span style="color: #660033;">-alias</span> jeve_key <span style="color: #660033;">-keystore</span> <span style="color: #007800;">$JBOSS_HOME</span><span style="color: #000000; font-weight: bold;">/</span>server<span style="color: #000000; font-weight: bold;">/</span>default<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>jeve.keystore <span style="color: #660033;">-trustcacerts</span> <span style="color: #660033;">-file</span> <span style="color: #007800;">$ENDERECO_DO_CERTIFICADO_VALIDO</span><span style="color: #000000; font-weight: bold;">/</span>certificado_valido.cer</div></td></tr></tbody></table></div>
<p>E pronto, certificado válido importado e comunicação segura garantida.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/configurando-ssltls-no-jbosstomcat/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Apresentação sobre Certificação Digital</title>
		<link>http://jeveaux.com/2009/apresentacao-sobre-certificacao-digital/</link>
		<comments>http://jeveaux.com/2009/apresentacao-sobre-certificacao-digital/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 23:06:13 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Palestras]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Assinatura Digital]]></category>
		<category><![CDATA[Certificação Digital]]></category>
		<category><![CDATA[Certificado Digital]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=553</guid>
		<description><![CDATA[Hoje foi um dia corrido de trabalho, como de costume, mas um pouco diferente. Fiz uma apresentação bem introdutória sobre Certificação Digital para um cliente. Gostei dela e resolvi divulga-la no meu slideshare.]]></description>
			<content:encoded><![CDATA[<p>Hoje foi um dia corrido de trabalho, como de costume, mas um pouco diferente. Fiz uma apresentação bem introdutória sobre <a href="http://www.slideshare.net/jeveaux/certificao-digital">Certificação Digital</a> para um cliente. Gostei dela e resolvi divulga-la no <a href="http://www.slideshare.net/jeveaux">meu slideshare</a>.</p>
<p style="text-align: center;"><iframe src="http://www.slideshare.net/slideshow/embed_code/1165336" width="425" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/apresentacao-sobre-certificacao-digital/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Um exemplo completo com JAAS</title>
		<link>http://jeveaux.com/2009/um-exemplo-completo-com-jaas/</link>
		<comments>http://jeveaux.com/2009/um-exemplo-completo-com-jaas/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 19:31:04 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[JAAS]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Realm]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=426</guid>
		<description><![CDATA[Devido ao um dos últimos posts deste blog, sobre utilização de JAAS com JDBC Realm e a grande procura por exemplos mais completos, com login e logout, por exemplo, resolvi melhorar um pouco a aplicação e disponibiliza-la para download. Desta &#8230; <a href="http://jeveaux.com/2009/um-exemplo-completo-com-jaas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Devido ao um dos últimos posts deste blog, sobre utilização de <a href="http://www.jeveaux.com/blog/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/" target="_blank">JAAS com JDBC Realm</a> e a grande procura por exemplos mais completos, com <em>login</em> e <em>logout</em>, por exemplo, resolvi melhorar um pouco a aplicação e disponibiliza-la para download.</p>
<p>Desta vez a aplicação está no <a href="http://github.com/jeveaux" target="_blank">meu github</a>, junto com a aplicação do primeiro post sobre JAAS. São elas:</p>
<ul>
<li><a href="http://github.com/jeveaux/project-to-learn-jaas/tree/master" target="_blank">project-to-learn-jaas</a></li>
<li><a href="http://github.com/jeveaux/project-to-learn-jaas-complete/tree/master" target="_blank">project-to-learn-jaas-complete</a></li>
</ul>
<p>As aplicações possuem um <em>README</em> e alguma explicação, qualquer dúvida fiquem a vontade para lançar perguntas nos comentários, as duas aplicações foram feitas de forma a simplificar o máximo possível a utilização e configuração dos recursos de JAAS.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/um-exemplo-completo-com-jaas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Autenticação e Autorização: JAAS com JDBC Realm</title>
		<link>http://jeveaux.com/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/</link>
		<comments>http://jeveaux.com/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 00:53:32 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[JAAS]]></category>
		<category><![CDATA[Realm]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=297</guid>
		<description><![CDATA[Recentemente ministrei um curso sobre Segurança em aplicações JavaEE, onde, grande parte do treinamento é a utilização e configuração do JAAS (Java Authentication and Authorization Service) abordando Basic e Form Authentication usando os realms: File, JDBC e LDAP. Aproveitando o &#8230; <a href="http://jeveaux.com/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Recentemente ministrei um curso sobre <strong>Segurança em aplicações JavaEE</strong>, onde, grande parte do treinamento é a utilização e configuração do JAAS <em>(Java Authentication and Authorization Service)</em> abordando <em>Basic</em> e <em>Form Authentication</em> usando os <em>realms</em>: <em>File</em>, <em>JDBC</em> e <em>LDAP</em>.</p>
<p>Aproveitando o embalo do treinamento e principalmente pela empolgação dos alunos da turma quando viram quão simples e fácil é usar o JAAS, vou mostrar a configuração de autenticação e autorização em uma aplicação JavaEE usando <em>Basic Authentication</em> e <em>JDBC Realm</em>.</p>
<p>O  JAAS <em>(Java Authentication and Authorization Service)</em> é a API padrão do Java para controle de acesso e autorização em aplicações JavaEE. Com JAAS é possível autenticar e validar usuários e certificados, bem como controlar a possibilidade de acesso e/ou utilização de recursos na aplicação (arquivos, diretórios, URLs, conteúdo, etc). Resumidamente o JAAS cuida de:</p>
<ul>
<li><strong>Autenticação:</strong> deve verificar se um usuário é ele mesmo através de validação de senhas e/ou certificados.</li>
<li><strong>Autorização:</strong> com base em um usuário identificado, as regras e controles de permissão e acesso serão aplicadas na aplicação/produto e seus recursos.</li>
</ul>
<p>O exemplo a seguir foi feito usando o Eclipse, Glassfish_v2 e MySQL, e não há nenhum segredo obscuro, simplesmente criaremos um <em>Dynamic Web Project</em> e usaremos o console do Glassfish para criar o <em>realm</em>.</p>
<p><span id="more-297"></span></p>
<h3>A infra-estrutura (servidor e banco de dados)</h3>
<p>O ponto chave para a configuração do <em>JDBC Realm</em> é o banco de dados (tabelas de usuário e grupos). Criaremos o <em>schema</em> com o SQL a seguir. Basicamente são apenas duas tabelas: <em>usertable</em> e <em>grouptable</em>.</p>
<p><a href="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/schema.png"><img class="aligncenter size-full wp-image-330" title="schema" src="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/schema.png" alt="schema" width="380" height="110" /></a></p>
<p>A configuração do <em>schema</em> no <em>realm</em> será feita adiante e este exemplo está simples desta forma apenas para ficar o mais claro possível na configuração do <em>realm</em>. Certamente no seu caso você já terá suas tabelas de usuários e grupos e para usá-los basta fazer a configuração do <em>realm</em> de acordo com a sua realidade, alterando os valores das propriedades de configuração.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> learn_jaas;<br />
<span style="color: #993333; font-weight: bold;">USE</span> learn_jaas;<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> usertable<span style="color: #66cc66;">&#40;</span>userid <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span> password <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> grouptable<span style="color: #66cc66;">&#40;</span>userid <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> groupid <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>userid<span style="color: #66cc66;">,</span> groupid<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> grouptable <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">CONSTRAINT</span> FK_USERID <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span>userid<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> usertable<span style="color: #66cc66;">&#40;</span>userid<span style="color: #66cc66;">&#41;</span>;<br />
COMMIT;</div></td></tr></tbody></table></div>
<p>E agora vamos inserir alguns usuários e grupos para os testes, conforme o SQL abaixo. Os usuários serão: <em>user</em>, <em>guest</em> e <em>admin</em> e os grupos serão: <em>user<strong>s</strong></em>, e <em>admin<strong>s</strong></em>. Reparem que os grupos estão no plural, enquanto os usuários estão no singular. Este é um importante detalhe, a seguir, na configuração das <em>roles</em> usaremos os grupos para aplicar as regras e não os usuários.</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> usertable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> grouptable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'users'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> usertable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'guest'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'guest'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> grouptable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'guest'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'users'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> usertable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> grouptable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'admins'</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Com o banco de dados pronto ainda precisamos de um passo antes do <em>realm</em>, precisaremos criar agora o <em>Connection Pool</em> e o <em>DataSource</em> para este banco de dados. O <em>JNDI</em> <em>Name</em> deste <em>DataSource</em> será usado na criação do <em>realm</em>, portanto, este passo é essencial para o funcionamento do exemplo. Entretanto, como o foco aqui não é a criação do <em>DataSource</em>, darei apenas o <em>JNDI Name</em> conforme usei no exemplo: <strong>learn-jaas-jdbc</strong>.</p>
<p>Agora só precisamos criar o <em>realm</em>, o nome usado para ele será <strong>learn-jaas-realm</strong>. No console do glassfish vamos em: <em>Configuration &gt;&gt; Securiy &gt;&gt; Realm &gt;&gt; New</em>. As propriedades deverão ser preenchidas de acordo com a imagem e a tabela abaixo (se o seu <em>schema</em> for diferente é só ajustar os valores):</p>
<p style="text-align: center;"><a href="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/glassfish-new-jdbc-realm.png" target="_blank"><img class="size-medium wp-image-320 aligncenter" title="glassfish-new-jdbc-realm" src="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/glassfish-new-jdbc-realm-300x176.png" alt="glassfish-new-jdbc-realm" width="300" height="176" /></a></p>
<p style="text-align: center;">
<table style="border: 1px dashed; height: 184px;" border="0" width="360" align="center">
<tbody>
<tr>
<td style="text-align: left;"><strong>Propriedade</strong></td>
<td><strong>Valor</strong></td>
</tr>
<tr>
<td>jaas-context</td>
<td>jdbcRealm</td>
</tr>
<tr>
<td>datasource-jndi</td>
<td>learn-jaas-jdbc</td>
</tr>
<tr>
<td>user-table</td>
<td>usertable</td>
</tr>
<tr>
<td>user-name-column</td>
<td>userid</td>
</tr>
<tr>
<td>password-column</td>
<td>password</td>
</tr>
<tr>
<td>group-table</td>
<td>grouptable</td>
</tr>
<tr>
<td>group-name-column</td>
<td>groupid</td>
</tr>
<tr>
<td>digest-algorithm</td>
<td>none</td>
</tr>
</tbody>
</table>
<h3>A aplicação</h3>
<p>Com a infra-estrutura necessária criada e funcionando, partiremos para a aplicação. Este será um ponto bem simples, a aplicação não terá nada além de 4 páginas <em>JSP</em>, <em>web.xml</em> e <em>sun-web.xml</em>. No Eclipse, criaremos um <em>Dynamic Web Project</em> usando o glassfish como servidor (JavaEE 5). As páginas citadas anteriormente ficarão dispostas conforme o projeto abaixo:</p>
<p><a href="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/project_jaas.png"><img class="aligncenter size-full wp-image-336" title="project_jaas" src="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/project_jaas.png" alt="project_jaas" width="325" height="300" /></a></p>
<p>Em cada página <em>index.jsp</em> dos diretórios <em>admin</em>, <em>public</em> e <em>users</em> há um dizer assim: <em>&#8220;Welcome Admin!&#8221;</em>; <em>&#8220;Welcome Guest!&#8221;</em>; <em>&#8220;Welcome User!&#8221;</em>; respectivamente. E em <em>/index.jsp</em> há apenas os links para as demais páginas. Estes diretórios serão protegidos posteriormente.</p>
<p>O próximo passo consiste na criação das <em>roles</em> em nossa aplicação. Este costuma ser o ponto onde os iniciantes se confundem muito, por isso houve aquela distinção entre os nomes dos usuários e os grupos anteriormente. A criação das <em>roles</em> é livre, podemos criá-las como bem entendermos, o único ponto de atenção aqui é que <strong>a <em>role</em> é associada ao grupo</strong>, ou seja, uma <em>role</em> será aplicada para todos os usuários de um determinado grupo.</p>
<p>Então, em <em>WEB-INF/sun-web.xml</em> criaremos as <em>roles</em> associadas com os seus respectivos grupos:</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>user-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>admins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>users<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>admin-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>admins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>guest-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>admins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>users<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>guests<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/group-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-role-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>As <em>roles</em> foram criadas com o sufixo <em>-role</em> apenas para ficar bem claro que são <em>roles</em> e não usuários ou grupos. Vejam que as <em>roles</em> estão associadas aos grupos e não aos usuários.</p>
<p>Este é um momento onde aplicaremos as regras hierárquicas e organizacionais da empresa, repare que o grupo <em>admins</em> aparece em todas as <em>roles</em>, afinal de contas, não queremos barrar ao administrador do sistema o acesso às páginas públicas ou de usuários, certo?</p>
<p>Próximo passo: Configuração do <em>web.xml</em>! A configuração da autenticação em si não passa de 4 linhas de xml, informaremos o tipo (método) de autenticação (pode ser <em>none</em>, <em>basic</em>, <em>form</em> e <em>digest</em>/<em>certificate</em>) e qual o nome do <em>realm</em> associado:</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;login-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;auth-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>BASIC<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/auth-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;realm-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>learn-jaas-realm<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/realm-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/login-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>O que precisaremos agora é, com base nas <em>roles</em>, criar as regras de acesso na aplicação. Elas podem ser feitas de várias formas e como podemos usar <em>URL Pattern</em> para definir onde a regra será aplicada, faremos isso por diretórios, combinando os diretórios com as <em>roles</em> (admin, user e guest):</p>
<div class="codecolorer-container xml vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>paginas admnistrativas<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/admin/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GET<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>POST<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>admin-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>paginas para usuários<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/users/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GET<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>POST<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>user-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>paginas para visitantes<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/public/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GET<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>POST<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http-method<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-resource-collection<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>guest-role<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/auth-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/security-constraint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Repare que o código ficou grande, mas é muito repetitivo. Os pontos de atenção são o elemento <em>url-pattern</em>, onde é gerada a regra para onde as restrições serão aplicadas e, principalmente, o elemento <em>role-name</em>, onde definimos qual a <em>role</em> está associada com aquela regra. Mais uma vez repare que a regra de acesso é associada à <em>role</em>, já a <em>role</em>, por sua vez está associada com um grupo, que por sua vez está associado com um usuário.</p>
<p>Agora é só fazer o deploy e executar o projeto. Lembre-se das senhas (ou consulte no banco de dados) e faça o teste de acesso em cada página.</p>
<p>Para facilitar disponibilizei o projeto para download, basta <a href="http://www.jeveaux.com/blog/wp-content/uploads/2009/01/project-to-lean-jaastar.gz">clicar aqui</a>. <em>(por algum motivo alheio a minha compreensão o wordpress não deixou o nome do arquivo igual ao original, então, baste colocar um ponto antes do &#8216;tar&#8217;, deve ficar project-to-learn-jass.tar.gz)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>Segurança: Ajax X Applets</title>
		<link>http://jeveaux.com/2007/seguranca-ajax-x-applets/</link>
		<comments>http://jeveaux.com/2007/seguranca-ajax-x-applets/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 13:10:51 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Applets]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[WTF]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2007/seguranca-ajax-x-applets/</guid>
		<description><![CDATA[Ontem recebi um link para um projeto nacional que tem tido muito sucesso, e estava lendo as informações no site e encontrei algo que é um perfeito exemplo de má interpretação de tecnologias, e isso me deixou bastante intrigado, é &#8230; <a href="http://jeveaux.com/2007/seguranca-ajax-x-applets/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ontem recebi um link para um projeto nacional que tem tido muito sucesso, e estava lendo as informações no site e encontrei algo que é um perfeito exemplo de má interpretação de tecnologias, e isso me deixou bastante intrigado, é uma questão sobre a camada de apresentação do projeto, que é feita em Ajax, até aí tudo bem certo? (afinal, o que de novo hoje em dia não usa Ajax?)</p>
<blockquote><p>Não, não quero colocar aqui o projeto e o link para o site pois não quero que esse post soe como uma crítica direto ao projeto, pois não é, é apenas uma crítica a forma em que uma questão em particular foi encarada, o que não tira os méritos do projeto.</p></blockquote>
<p>IMHO, o problema foi o modo com que isso foi exposto e, até de certa forma, usado como motivo para justificar a adoção ao Ajax. No site do projeto existem claramente duas seções: <strong>Ajax </strong>e <strong>Não Utiliza Applets</strong>. A categoria Ajax é simples e mostra algumas vantagens de se utilizar Ajax na  apresentação de aplicações Web. Já a categoria &#8220;Não Utiliza Applets&#8221; possui uma série de divagações das quais não concordei muito, e vou dizer o porque.</p>
<p>Começando:</p>
<blockquote><p>Applets &#8230; &#8230;. além de serem  mais lentos e inseguros&#8230;</p></blockquote>
<p>Lentos eu até concordo quando comparados com utilitários bem escritos com JavaScript, mas isso não quer dizer que sempre será mais lento, não é difícil escorregar e perder a linha gerando na aplicação vários (ou até dezenas) <em>Mega Bytes</em> de JavaScript que serão tão lentos quanto um applet para carregar e poderão sacrificar o cliente como qualquer aplicação desktop repleta de <em>memory leaks</em> (quem nunca viu o Firefox sugando seus ~400Mb++ de memória?).</p>
<p>E a segurança, a não ser que o cliente esteja utilizando uma versão antiga da JVM (cujos bug já são conhecidos e possuem correção, geralmente em versões mais novas) eu concordo que possa haver problemas com segurança, mas ainda não concordo que a segurança de um applet seja inferior à de algum componente escrito em JavaScript. Podemos começar falando de vulnerabilidade ao cliente, com o applet, ou o cilente tem a JVM ou não tem, portanto, ou o applet <strong>irá</strong> funcionar ou <strong>não irá</strong>, já com o JavaScript, o controle de funcionar ou não, não é como um ON/OFF, o usuário tem diversas formas de bloquear e desbloquear determinadas operações, sem contar as formas existentes de interferir no fluxo normal de processamento do JavaScript, com o <a href="https://addons.mozilla.org/en-US/firefox/addon/748">GraseMonkey</a>, por exemplo, é fácil escrever códigos que se integram (inicialmente à apresentação) ao código JavaScript de qualquer página. Sem contar as possíveis formas de se utilizar de <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a> para explorar falhas no DOM, HTML/Scripts injection, etc.</p>
<blockquote><p>Em relação ao Javascript, os applets são mais lentos de processar alem de possuir espaço muito delimitado na página onde se executam</p></blockquote>
<p>Essa parte de integração com os demais objetos da página realmente é um ponto fraco, muito fraco, quando utilizamos applets. Já a questão de velocidade de processamento, é fácil confundir o tempo de processamento gasto numa determinada funcionalidade com a quantidade de operações que cada funcionalidade realmente executa, mas como eu nunca fiz esse tipo de teste &#8211; de escrever um applet e um javascript que façam a mesma coisa &#8211; não irei muito além, apesar de não acreditar que possam haver diferenças tão grandes, afinal, tudo é executado no cliente, com os mesmos recursos.</p>
<blockquote><p>todos os recursos são feitos <strong>sem a utilização  de Applets</strong> <em>(com eufemismo &#8211; isso não tem no site :D)</em>, os sistemas são baseados principalmente no AJAX, o que garante velocidade e segurança, além de que não é necessária a instalação da JVM na máquina do cliente</p></blockquote>
<p>Pois é, antes que arremessem as pedras, não estou aqui defendendo o uso de applets frente a componentes Ajax, muito pelo contrário, eu já trabalhei bastante com applets e sei o quanto é chato, em todos os aspectos, e também já trabalhei, trabalho e pretendo trabalhar por um bom tempo com componentes Ajax bem escritos, a razão pela qual escrevi este post foi para, de certa forma, criticar o modo com que foi exposto o motivo para usar Ajax, não acho que seja necessário dizer: &#8220;- Uso Ajax pois Applets são lentos, inseguros, gordos e feios.&#8221;; afinal de contas, não é bem assim.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2007/seguranca-ajax-x-applets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

