Title: Seguran
1Segurança em Java
- Carlos Bazilio
- Depto de Ciência e Tecnologia
- Pólo Universitário de Rio das Ostras
- Universidade Federal Fluminense
2Seguranç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)
3Criptografia Assimétrica
4Assinatura Digital
5Assinatura 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
6Assinatura em Mensagem sem Privacidade
7Assinatura em Mensagem com Privacidade
8(No Transcript)
9Autoridade 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/)
10Autoridade Certificadora
11Certificados
- 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
12Certificados
- 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
13Cadeia 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
14Listando Certificados
- Certificados podem fazer parte do SO, dos
navegadores ou de Java - No Firefox
- Tools gt Options gt Advanced gt View Certificates
- No IE
- Tools gt Internet Options gt Content gt Certificates
- Windows
- Start gt Control Panel gt Internet Options gt
Content gt Certificates - Em Java
- WinNT\Profiles\ltusuáriogt\.keystore (certificados)
- ltJavagt\jre\lib\security\cacerts (autoridades
certificadoras)
15Impressão Digital de Certificados
- 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
16Keystores
- 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
17Seguranç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
18Keytool
- 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/ja
vase/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)
19Gerando Chaves com o Keytool
- ltJAVA_HOMEgt/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
20Gerando Requisição de Certificado para CA
- ltJAVA_HOMEgt/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
21Importando o Resultado de uma Requisição
- Suponha que a resposta seja recebida num arquivo
chamado resposta.cer - ltJAVA_HOMEgt/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
22Exportando um Certificado
- ltJAVA_HOMEgt/bin/keytool -exportcert -alias
siriusca file minha_chave_ca.cer - Exporta a entrada autenticada pela CA para o
arquivo minha_chave_ca.cer
23Exemplos 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
24SSL
- 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
25SSL 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
26SSL 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
27SSL no Tomcat
- ltJAVA_HOMEgt/bin/keytool genkey alias tomcat
keyalg RSA - Este comando irá gerar o arquivo .keystore no
diretório ..\Documents and Settings\usuário\.keys
tore - 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
28SSL 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
29SSL 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
lttomcatgt/conf/server.xml
30SSL no Tomcat
- No arquivo server.xml devemos retirar o
comentário do conector 8443 e modificá-lo da
seguinte forma
ltConnector 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"/gt
- Após atualizar o arquivo, basta reiniciar o
Tomcat e digitar o seguinte endereço no browser
https//localhost8443/
31Autenticação no Tomcat
- Aplicações web são hospedadas no Tomcat no
diretório lttomcatgt/webapps - Usualmente, a configuração de uma aplicação
reside num arquivo denominado descritor de
implantação lttomcatgt/webapps/app/WEB-INF/web.xml - Dentro do elemento raiz ltwebapp /gt 2 elementos
são importantes - ltlogin-config /gt indica o tipo de autenticação
utilizada - ltsecurity-constraint /gt indica que parte da
aplicação deve ser resguardada e quem tem acesso
32Autenticação Básica no Tomcat
ltweb-appgt ... ltlogin-configgt ltauth-methodgtBASI
Clt/auth-methodgt ltrealm-namegtÁrea de
Testeslt/realm-namegt lt/login-configgt lt/web-appgt
- Indica que a aplicação exige um tipo básico de
autenticação - O elemento ltlogin-config /gt deve ser colocado
dentro do elemento ltwebapp /gt - 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 lttomcatgt/conf/tomcat-u
sers.xml
33Autenticação de Resumo no Tomcat
- Cliente
- 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)
Servidor 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
34Autenticação de Resumo no Tomcat
- Modificação do arquivo web.xml
ltweb-appgt ... ltlogin-configgt ltauth-methodgtDIGE
STlt/auth-methodgt ltrealm-namegtÁrea de
Testeslt/realm-namegt lt/login-configgt lt/web-appgt
35Autenticação de Formulário no 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.
36Autenticação de Formulário no Tomcat
lthtmlgt ltheadgt lttitlegtFormulário de
Loginlt/titlegt lt/headgt ltbodygt lth1gtPor favor,
autentique-selt/h1gt ltform action"j_security_che
ck" method"post"gt Usuário ltinput type"text"
name"j_username" /gtltbr /gt Senha ltinput
type"password" name"j_password" /gtltbr
/gt ltinput type"submit" value"Envie"
/gt lt/formgt lt/bodygt lt/htmlgt
37Autenticação de Formulário no Tomcat
- Modificação do arquivo web.xml
ltweb-appgt ... ltlogin-configgt ltauth-meth
odgtFORMlt/auth-methodgt ltrealm-namegtTestes de
Formuláriolt/realm-namegt ltform-login-configgt
ltform-login-pagegt/login.htmllt/form-login-pagegt
ltform-error-pagegt/erro.htmllt/form-error-pa
gegt lt/form-login-configgt
lt/login-configgt lt/web-appgt
38Autenticação SSL de 2 vias no Tomcat
ltlogin-configgt ltauth-methodgtCLIENT-CERTlt/auth-met
hodgt ltrealm-namegtÁrea de Testeslt/realm-namegt lt/lo
gin-configgt
- 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 ltuser-data-constraint /gt (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
39Autenticação no Tomcat
- Para indicarmos que partes da aplicação devem ser
resguardadas utilizamos o elemento
ltsecurity-constraint /gt, sub-elemento de ltweb-appgt
ltsecurity-constraintgt ltweb-resource-collectiongt
ltweb-resource-namegtÁrea Seguralt/web-resource-name
gt lturl-patterngt/seg/lt/url-patterngt lthttp-meth
odgtGETlt/http-methodgt lthttp-methodgtPOSTlt/http-met
hodgt lt/web-resource-collectiongt ltauth-constraint
gt ltrole-namegttomcatlt/role-namegt lt/auth-constrai
ntgt lt/security-constraintgt
40Autenticação no Tomcat
- Descrição dos sub-elementos de ltsecurity-constrain
t /gt - lturl-pattern /gt indica o subdiretório raiz à
partir do qual a autenticação é exigida - lthttp-method /gt indica sobre qual método http a
autenticação é exigida - ltauth-constraint /gt indica que papéis
(sub-elemento ltrole-name /gt) de usuários têm
acesso ao conteúdo indicado em lturl-pattern /gt - Observe que os elementos ltsecurity-constraint /gt,
lturl-pattern /gt, lthttp-method /gt e ltrole-name /gt
podem ocorrer de forma repetida isto facilita a
configuração de porções da aplicação que possuem
regras de autenticação similares
41Configuração da Aplicação para HTTPS
- Para que os dados entre cliente e servidor sejam
enviados de forma segura, criamos o elemento
ltuser-data-constraint /gt como sub-elemento de
ltsecurity-constraint /gt
ltsecurity-constraintgt ... ltuser-data-constraintgt
lttransport-guaranteegt CONFIDENTIAL lt/trans
port-guaranteegt lt/user-data-constraintgt lt/securit
y-constraintgt
42Configuração da Aplicação para 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
43Autenticação usando SGBD via JDBC no Tomcat
- Copiar driver JDBC para a pasta lttomcatgt/lib/ e
reiniciar o Tomcat - Criar 2 tabelas no SGBD escolhido
44Autenticação usando SGBD via JDBC no Tomcat
- Há 2 opções de configuração da aplicação
- lttomcatgt/conf/server.xml (configuração global)
o elemento xml fornecido à seguir deve ser
colocado dentro do elemento ltEngine /gt - lttomcatgt/webapps/app/META-INF/context.xml
(configuração local) o elemento xml fornecido à
seguir deve ser colocado dentro do elemento
ltContext /gt
45Autenticação usando SGBD via JDBC no Tomcat
- Exemplo utiliza o MySQL
- Descrição dos atributos à seguir
46Autenticação usando SGBD via JDBC no Tomcat
47Referências
- http//jf.eti.br/autenticando-aplicacao-web-com-to
mcat-5-e-banco-de-dados/ - Tutorial de configuração do Tomcat com SGBDs