Segurança em Java
description
Transcript of Segurança em Java
Segurança em JavaSegurança em Java
Carlos Bazilio
Depto de Ciência e TecnologiaPólo Universitário de Rio das Ostras
Universidade Federal Fluminense
SegurançaSegurança
• Alguns conceitos:– Criptografia simétrica x assimétrica (método que
utiliza a mesma chave – simétrica - ou chaves diferentes – assimétrica - na cifração e decifração)
– Criptografia de chave pública– Assinatura Digital– Autoridade Certificadora (CA – Entidade responsável
por garantir a validade das chaves públicas)– Certificado (chave pública + chave de uma CA)– Keystores (BD de chaves criptográficas)
Criptografia AssimétricaCriptografia Assimétrica
Assinatura DigitalAssinatura Digital
Assinatura DigitalAssinatura Digital
• Idéia básica, supondo que se deseja enviar um documento de forma segura:– Você assina o documento usando alguma de suas
chaves privadas– Envia o documento assinado para o destinatário– Disponibiliza ao destinatário sua chave pública– O destinatário usa sua chave pública para se
certificar que foi você quem a assinou• Como o destinatário se certifica que a chave
pública é autêntica?– Usualmente, a chave pública é disponibilizada
juntamente com a chave de alguma Autoridade Certificadora (CA), o que chamamos de certificado
Assinatura em Mensagem Assinatura em Mensagem sem Privacidadesem Privacidade
Assinatura em Mensagem Assinatura em Mensagem com Privacidadecom Privacidade
Autoridade CertificadoraAutoridade Certificadora
• Uma Autoridade Certificadora é uma entidade, pública ou privada, que estabelece previamente a identidade do futuro portador do certificado digital (pessoa física ou jurídica), por meio dos documentos necessários, e emite esse certificado (Definição da ICP: https://www.icpbrasil.gov.br)
• Exemplo: VeriSign (http://www.verisign.com.br/)
Autoridade CertificadoraAutoridade Certificadora
CertificadosCertificados
• Um certificado digital é um documento eletrônico, assinado digitalmente por uma terceira parte confiável, que associa uma entidade (pessoa, processo, servidor) a uma chave pública
• Na prática, o certificado digital funciona como uma carteira de identidade virtual que permite a identificação segura de uma mensagem ou transação na rede
CertificadosCertificados
• Um certificado contém:– Uma chave pública– Informações do dono do certificado: nome,
organização, cidade, país, etc– Uma assinatura digital da certificadora– Informações da certificadora
• Um receptor pode checar um certificado analisando sua assinatura digital com a chave pública da certificadora
• Esta chave também pode estar armazenada num certificado, o qual cria uma recorrência
Cadeia de CertificadosCadeia de Certificados
• Relação de confiança entre autoridades certificadoras (CA)
• Também chamada de hierarquia de certificados• Em termos práticos, a confiança numa CA
implica na confiança nas CAs acima hierarquicamente dessa
Listando CertificadosListando Certificados
• Certificados podem fazer parte do SO, dos navegadores ou de Java
• No Firefox:– Tools > Options > Advanced > View Certificates
• No IE:– Tools > Internet Options > Content > Certificates
• Windows:– Start > Control Panel > Internet Options > Content > Certificates
• Em Java:– WinNT\Profiles\<usuário>\.keystore (certificados)– <Java>\jre\lib\security\cacerts (autoridades certificadoras)
Impressão Digital de Impressão Digital de CertificadosCertificados
• Fingerprints Certificates• Quando uma cadeia segura não é encontrada, a
impressão digital do certificado pode ser calculada
• Cada impressão digital é um pequeno número que única e confiavelmente identifica um certificado (tecnicamente, é um valor hash)
• Daí basta comparar a impressão digital calculada com uma fornecida pelo proprietário do certificado
KeystoresKeystores
• Bancos de dados protegidos por senha que armazenam chaves privadas e seus correspondentes certificados
• Um keystore pode ter diversas entradas, cada entrada identificada por um alias
• Certificados em keystores são chamados de certificados confiáveis (trusted certificates)
• O JDK disponibiliza uma ferramenta chamada keytool para manipulação de keystores
Segurança em JavaSegurança em Java
• Inclui um vasto conjunto de APIs, ferramentas e implementações
• Estas APIs compreendem:– Criptografia (JCA)– Infra-estrutura de chave pública (PKI)– Comunicação segura (JSSE)– Autenticação e controle de acesso (JAAS)– Assinatura digital de XML
• Como na maioria da arquitetura Java, estas APIs são generalizadas de forma a se trabalhar com versões de diferentes fabricantes
KeytoolKeytool
• Ferramenta utilizada para gerenciar um keystore (base de dados de chaves criptográficas, cadeias de certificados e certificados confiáveis)
• Esta é distribuída junto com o kit de desenvolvimento Java – JDK (http://java.sun.com/javase/6/docs/technotes/tools/windows/keytool.html)
• Com ela podemos:– Criar chaves privadas e os correspondentes certificados
públicos– Gerar solicitações de certificados, os quais podem ser enviados
às autoridades certificadoras– Importar certificados emitidos pelas certificadoras– Gerenciar o Keystore
• Estas atividades também podem ser realizadas pela API da linguagem (pacote java.security)
Gerando Chaves com o Gerando Chaves com o KeytoolKeytool
<JAVA_HOME>/bin/keytool –genkey –alias sirius –keyalg RSA
• A execução deste comando irá gerar um arquivo denominado “.keystore” em seu diretório home (ex.: “..\Documents and Settings\bazilio\.keystore”);
• Outras opções podem ser consultadas através do comando “keytool –help”;
Gerando Requisição de Gerando Requisição de Certificado para CACertificado para CA
<JAVA_HOME>/bin/keytool –certreq –alias sirius –file pedido.csr
• Este comando gera uma requisição de certificado a ser enviada para um CA e coloca num arquivo denominado “pedido.csr” (CSR – Certification Signing Request)
• A resposta da CA será um certificado, assinado por ela, autenticando a chave pública fornecida anteriormente (gerada pelo comando keytool do slide anterior)
• Essa resposta usualmente é off-line e pode ser retornado uma cadeia de certificados
Importando o Resultado de Importando o Resultado de uma Requisiçãouma Requisição
• Suponha que a resposta seja recebida num arquivo chamado “resposta.cer”
<JAVA_HOME>/bin/keytool –importcert –alias siriusca –file resposta.cer
• Este comando cria um certificado confiável no keystore com os dados do arquivo “resposta.cer” e associa ao alias “siriusca”
Exportando um CertificadoExportando um Certificado
<JAVA_HOME>/bin/keytool -exportcert -alias siriusca –file minha_chave_ca.cer
• Exporta a entrada autenticada pela CA para o arquivo “minha_chave_ca.cer”
Exemplos em JavaExemplos em Java
• Geração de Assinatura Digital– Geração das chaves– Geração da assinatura digital usando a chave
privada– Exportação da chave pública e da assinatura
para arquivos
• Verificação da Assinatura Digital– Importação da chave pública– Verificação da autenticidade da assinatura
SSLSSL
• SSL (Secure Socket Layer) é uma tecnologia que permite servidores web e navegadores se comunicarem de forma segura
• Com SSL, as mensagens trafegadas são cifradas e decifradas no lado do cliente e no lado do servidor
• Quando um cliente inicia uma comunicação com um servidor através de uma conexão segura, este envia um certificado “se identificando”
• A tecnologia também permite que o servidor requisite um certificado do cliente (autenticação do cliente), embora isto seja pouco comum
SSL no TomcatSSL no Tomcat
• Configurar conexões seguras no Tomcat só faz sentido quando este está executando como um servidor stand-alone
• Quando é utilizado um servidor como Apache ou IIS para recebimento das requisições, este servidor faria o processo de cifragem/decifragem
• Assim, o Tomcat só teria o papel de ser um contêiner para servlets/jsps
SSL no TomcatSSL no Tomcat
• Para oferecermos conexões seguras no Tomcat precisamos de um certificado, o qual será enviado por ele no início de uma conexão segura
• Para tal podemos utilizar a ferramenta keytool• Neste caso, o parâmetro alias precisa ser
“tomcat” e a senha padrão esperada pelo Tomcat é “changeit”
• Ambas as senhas do keystore e do certificado precisam ter o mesmo valor
SSL no TomcatSSL no Tomcat
<JAVA_HOME>/bin/keytool –genkey –alias tomcat –keyalg RSA
• Este comando irá gerar o arquivo .keystore no diretório “..\Documents and Settings\usuário\.keystore”
• Observe, entretanto, que um certificado gerado com a ferramenta keytool não deveria ter a mesma confiabilidade de um certificado emitido por uma CA
• Esses certificados são chamados de self-signed• Os navegadores normalmente alertam o usuário
no recebimento de um certificado como esses, o qual poderia ser enviado por um servidor web não confiável
SSL no TomcatSSL no Tomcat
• Como o processo de cifragem/decifragem é caro, deve ser utilizado de forma inteligente
• Ou seja, só este tipo de conexão deve ser definida para partes do site que transmitem dados confidenciais, e não para todo o site
• Estas páginas passarão a ser acessadas usando https
• A porta TCP padrão de conexões https é 443• O Tomcat utiliza a porta 8443
SSL no TomcatSSL no Tomcat
• A versão corrente do Tomcat trabalha com keystores no formato JKS (Java Keystore), PKCS11 e PKCS12 (Public Key Cryptography Standards 11 e 12)– http://en.wikipedia.org/wiki/PKCS
• Após a geração do certificado, precisamos configurar o Tomcat para permitir conexões seguras
• Para tal, modificaremos o arquivo de configuração “<tomcat>/conf/server.xml”
SSL no TomcatSSL no Tomcat
• No arquivo server.xml devemos retirar o comentário do conector 8443 e modificá-lo da seguinte forma:
<Connector port="8443" minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="c:\Java\Tomcat6\.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS"/>
• Após atualizar o arquivo, basta reiniciar o Tomcat e digitar o seguinte endereço no browser: https://localhost:8443/
Autenticação no TomcatAutenticação no Tomcat
• Aplicações web são hospedadas no Tomcat no diretório: <tomcat>/webapps
• Usualmente, a configuração de uma aplicação reside num arquivo denominado descritor de implantação: <tomcat>/webapps/app/WEB-INF/web.xml
• Dentro do elemento raiz <webapp /> 2 elementos são importantes:– <login-config />: indica o tipo de autenticação
utilizada– <security-constraint />: indica que parte da aplicação
deve ser resguardada e quem tem acesso
Autenticação Básica no Autenticação Básica no TomcatTomcat
• Indica que a aplicação exige um tipo básico de autenticação• O elemento <login-config /> deve ser colocado dentro do elemento
<webapp />• Ainda deverá ser fornecido as partes da aplicação que deverão se
resguardadas e que conteúdos (slides à seguir)• Os métodos possíveis de autenticação são: BASIC, DIGEST,
FORM e CLIENT-CERT• A autenticação básica solicita apenas um usuário e senha válidos
no servidor (tomcat) – por exemplo, através do arquivo <tomcat>/conf/tomcat-users.xml
<web-app>...<login-config>
<auth-method>BASIC</auth-method><realm-name>Área de Testes</realm-name>
</login-config></web-app>
Autenticação de Resumo Autenticação de Resumo no Tomcatno Tomcat
• ClienteCliente
• 1. Cliente solicita um recurso protegido
• 3. O usuário insere o nome e a senha dele
• 4. A máquina do cliente cria um hash das informações: (nome + senha + url + método http + nonce)
ServidorServidor
2. O servidor cria o nonce aleatório e o envia ao cliente
5. O servidor valida o hash criando seu próprio para verificar se ele corresponde ao do cliente
6. Envia o recurso requisitado ao cliente ou uma página de erro
Autenticação de Resumo Autenticação de Resumo no Tomcatno Tomcat
• Modificação do arquivo web.xml
<web-app>...<login-config>
<auth-method>DIGEST</auth-method><realm-name>Área de Testes</realm-name>
</login-config></web-app>
Autenticação de Formulário Autenticação de Formulário no Tomcatno Tomcat
• Personalização da autenticação através do fornecimento de uma página de login/senha própria;
• Além disso, também deve ser fornecida uma página erro;
• A construção do formulário deverá conter campos com nome padrão, já que é o Tomcat que valida o usuário:– j_security_check para o nome da ação;– j_username para o nome do usuário;– j_password para senha.
Autenticação de Formulário Autenticação de Formulário no Tomcatno Tomcat
<html><head>
<title>Formulário de Login</title></head><body>
<h1>Por favor, autentique-se:</h1><form action="j_security_check" method="post">Usuário: <input type="text" name="j_username" /><br />Senha: <input type="password" name="j_password"
/><br /><input type="submit" value="Envie" />
</form></body>
</html>
Autenticação de Formulário Autenticação de Formulário no Tomcatno Tomcat
• Modificação do arquivo web.xml
<web-app> ... <login-config>
<auth-method>FORM</auth-method><realm-name>Testes de Formulário</realm-name><form-login-config>
<form-login-page>/login.html</form-login-page> <form-error-page>/erro.html</form-error-page> </form-login-config> </login-config></web-app>
Autenticação SSL de 2 vias Autenticação SSL de 2 vias no Tomcatno Tomcat
<login-config><auth-method>CLIENT-CERT</auth-method><realm-name>Área de Testes</realm-name>
</login-config>
• Neste método, ambos servidor e cliente precisam apresentar certificados válidos para autenticação
• Além desta configuração precisamos realizar outros 2 passos para completar esta configuração:– Definir o elemento <user-data-constraint /> (a ser visto a seguir)
para alguma porção da sua aplicação (configuração para HTTPS)
– Prover algum certificado válido, no lado do cliente, para testes
Autenticação no TomcatAutenticação no Tomcat
• Para indicarmos que partes da aplicação devem ser resguardadas utilizamos o elemento <security-constraint />, sub-elemento de <web-app>
<security-constraint><web-resource-collection>
<web-resource-name>Área Segura</web-resource-name>
<url-pattern>/seg/*</url-pattern><http-method>GET</http-method><http-method>POST</http-method>
</web-resource-collection><auth-constraint>
<role-name>tomcat</role-name></auth-constraint>
</security-constraint>
Autenticação no TomcatAutenticação no Tomcat
• Descrição dos sub-elementos de <security-constraint />:– <url-pattern />: indica o subdiretório raiz à partir do qual a
autenticação é exigida– <http-method />: indica sobre qual método http a autenticação é
exigida– <auth-constraint />: indica que papéis (sub-elemento <role-
name />) de usuários têm acesso ao conteúdo indicado em <url-pattern />
• Observe que os elementos <security-constraint />, <url-pattern />, <http-method /> e <role-name /> podem ocorrer de forma repetida; isto facilita a configuração de porções da aplicação que possuem regras de autenticação similares
Configuração da Aplicação Configuração da Aplicação para HTTPSpara HTTPS
• Para que os dados entre cliente e servidor sejam enviados de forma segura, criamos o elemento <user-data-constraint /> como sub-elemento de <security-constraint />
<security-constraint>...<user-data-constraint>
<transport-guarantee>CONFIDENTIAL
</transport-guarantee></user-data-constraint>
</security-constraint>
Configuração da Aplicação Configuração da Aplicação para HTTPSpara HTTPS
• As opções para a tag transport-guarantee são:– CONFIDENTIAL: os dados devem ser
transmitidos sem interceptação– INTEGRAL: os dados devem ser transmitidos
sem interceptação e preservando a integridade (similar ao resumo)
– NONE: nenhuma garantia é exigida.
• Tanto CONFIDENTIAL quanto INTEGRAL resultam no uso de SSL
Autenticação usando Autenticação usando SGBD via JDBC no TomcatSGBD via JDBC no Tomcat• Copiar driver JDBC para a pasta
<tomcat>/lib/ e reiniciar o Tomcat
• Criar 2 tabelas no SGBD escolhido:
Autenticação usando Autenticação usando SGBD via JDBC no TomcatSGBD via JDBC no Tomcat• Há 2 opções de configuração da
aplicação:– <tomcat>/conf/server.xml (configuração
global): o elemento xml fornecido à seguir deve ser colocado dentro do elemento <Engine />
– <tomcat>/webapps/app/META-INF/context.xml (configuração local): o elemento xml fornecido à seguir deve ser colocado dentro do elemento <Context />
Autenticação usando Autenticação usando SGBD via JDBC no TomcatSGBD via JDBC no Tomcat• Exemplo utiliza o MySQL
• Descrição dos atributos à seguir
Autenticação usando Autenticação usando SGBD via JDBC no TomcatSGBD via JDBC no Tomcat
ReferênciasReferências
• http://jf.eti.br/autenticando-aplicacao-web-com-tomcat-5-e-banco-de-dados/– Tutorial de configuração do Tomcat com
SGBDs