Guia do Linux/Avançado/Apache/Uso de criptografia SSL
Uso de criptografia SSL
[editar | editar código-fonte]Esta seção é uma referência rápida para configuração e uso do módulo apache-ssl
com o servidor Apache
. Este módulo realiza a comunicação segura de dados (criptografada) via porta 443 (que é usada como padrão quando especificamos uma url iniciando com https://). A transmissão criptografada de dados é importante quanto temos dados confidenciais que precisamos transmitir como movimentação bancária, senhas, número de cartões de crédito, fazer a administração remota do servidor, etc. SSL significa Secure Sockets Layer (camada segura de transferência) e TLS Transport Layer Security (camada segura de Transporte).
A intenção aqui é fornecer explicações práticas para colocar um servidor Apache
com suporte a SSL funcionando no menor tempo possível. Detalhes sobre funcionamento de certificados, métodos de criptografia, assinatura, etc. deverão ser buscados na documentação deste módulo ou em sites especializados (é um assunto muito longo).
Servidor apache com suporte a ssl
[editar | editar código-fonte]Ao invés de utilizar o módulo mod_ssl
, você poderá usar o pacote apache-ssl
, ele nada mais é que um servidor Apache
com o suporte SSL já incluso e não interfere no servidor Apache
padrão, porque é executado somente na porta 443.
Se você tem um grande site com configurações de acesso personalizadas, ele trará mais trabalho de administração, pois as configurações e diretivas de restrições de acesso deverão ser copiadas para este servidor web. No entanto, ele é indicado para máquinas que serão servidores SSL dedicados ou quando não possui configurações especiais em seu servidor web principal.
Esta seção tem por objetivo a instalação do suporte ao módulo SSL (mod_ssl
) no servidor Apache
padrão.
Instalando o suporte a módulo SSL no Apache
[editar | editar código-fonte]Instale o pacote libapache-mod-ssl
. Após instala-lo, edite o arquivo /etc/apache/httpd.conf
adicionando a linha:
LoadModule ssl_module /usr/lib/apache/1.3/mod_ssl.so
Depois, gere um certificado digital ssl com o programa mod-ssl-makecert
. Ele será armazenado por padrão nos diretórios em /etc/apache/ssl.???
e seu uso explicado no resto desta seção.
Gerando um certificado digital
[editar | editar código-fonte]O certificado digital é a peça que garante a transferência segura de dados. Ele contém detalhes sobre a empresa que fará seu uso e quem o emitiu. Para gerar ou modificar um certificado digital, execute o comando mod-ssl-makecert e siga as instruções. O método de criptografia usado pelo certificado digital é baseado no conceito de chave pública/privada, a descrição sobre o funcionamento deste sistema de criptografia é feito em [ch-d-cripto.html#s-d-cripto-gpg Usando pgp (gpg
)para criptografia de arquivos, Seção 20.5].
OBS Não utilize acentos nos dados de seu certificado.
Exemplo de configuração do módulo mod-ssl
[editar | editar código-fonte]Abaixo uma configuração rápida para quem deseja ter um servidor com suporte a SSL funcionando em menor tempo possível (ela é feita para operar em todas as instalações e não leva em consideração o projeto de segurança de sua configuração atual do Apache
). Note que todas as diretivas relacionadas com o módulo mod_ssl
começam com o nome "SSL":
# Somente processa as diretivas relacionadas a SSL caso o módulo mod_ssl estiver # carregado pela diretiva LoadModule <IfModule mod_ssl.c> # É necessário especificar as portas que o servidor Web aguardará conexões (normais e # ssl). Listen 80 Listen 443 # Ativa o tratamento de conexões com o destino na porta 443 pela diretiva # VirtualHost abaixo <VirtualHost _default_:443> # Ativa ou desativa o módulo SSL para este host virtual SSLEngine on # Certificado do servidor SSLCertificateFile /etc/apache/ssl.crt/server.crt # Chave privada de certificado do servidor. SSLCertificateKeyFile /etc/apache/ssl.key/server.key # A linha abaixo força o fechamento de conexões quando a # conexão com o navegador Internet Explorer é interrompida. Isto # viola o padrão SSL/TLS mas é necessário para este tipo de # navegador. Alguns problemas de conexões de navegadores também # são causados por não saberem lidar com pacotes keepalive. SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown </VirtualHost> </IfModule> ################################################################################# # Adicionalmente poderão ser especificadas as seguintes opções para modificar # # o comportamento da seção SSL (veja mais detalhes na documentação do mod-ssl) # ################################################################################# # Formato e localização do cache paralelo de processos da seção. O cache de seção é # feito internamente pelo módulo mas esta diretiva acelera o processamento # de requisições paralelas feitas por modernos clientes navegadores. Por padrão # nenhum cache é usado ("none"). SSLSessionCache dbm:/var/run/ssl-cache # Localização do arquivo de lock que o módulo SSL utiliza para # sincronização entre processos. O padrão é nenhum. SSLMutex file:/var/run/ssl-mutex # Especifica o método de embaralhamento de dados que será utilizado # durante o inicio de uma seção SSL (startup) ou durante o processo # de conexão (connect). Podem ser especificados "builtin" (é muito rápido # pois consome poucos ciclos da CPU mas não gera tanta combinação aleatória), um # programa que gera números aleatórios (com "exec") ou os dispositivos aleatórios # /dev/random e /dev/urandom (com "file"). Por padrão nenhuma fonte # adicional de números aleatórios é usada. SSLRandomSeed startup builtin SSLRandomSeed connect builtin #SSLRandomSeed startup file:/dev/urandom 512 #SSLRandomSeed connect file:/dev/urandom 512 #SSLRandomSeed connect exec:/pub/bin/NumAleat # Tipos MIME para download de certificados AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl # Tempo máximo de permanência dos objetos do cache acima. O valor padrão é # 300 segundos (5 minutos). SSLSessionCacheTimeout 300 # Versão do protocolo SSL que será usada. Podem ser especificadas # SSLv2, SSLv3 TLSv1 ou all. O mais compatível com os navegadores atuais # é o "SSLv2". Por padrão "all" é usado. #SSLProtocol all #SSLProtocol -all SSLv3 # Registra detalhes sobre o tráfego neste arquivo. Mensagens de erro # também são armazenadas no arquivo de registro padrão do Apache SSLLog /var/log/apache/ssl-mod.log # Nível das mensagens de log registradas por SSLLog SSLLogLevel info
Algumas diretivas deste módulo podem fazer parte tanto da configuração global do servidor como diretivas de acesso (Directory, Location, .htaccess, veja a opção "Context" na documentação do mod_ssl
).
Autorizando acesso somente a conexões SSL
[editar | editar código-fonte]Existem casos que precisa restringir o uso de conexões normais e permitir somente conexões via SSL (como por exemplo, dentro da diretiva de acesso que controla seu acesso a uma página com listagem de clientes). A opção SSLRequereSSL é usada para tal e deve ser usada dentro das diretivas de controle acesso:
<Directory /var/www/secure/clientes> Options Indexes Order deny,allow Deny from evil.cracker.com SSLRequireSSL </Directory>
A diretiva acima requer que sejam feitas conexões SSL (porta 443 - https://) para acesso ao diretório /var/www/secure/clientes
, qualquer conexão padrão não criptografada (feita na porta 80) será rejeitada com o erro 403.
OBS: A diretiva SSLRequireSSL podia ser colocada entre as condicionais "IfModule mod_ssl.c" mas o servidor web permitiria conexões não criptografadas se por algum motivo esse módulo não estivesse carregado. Na configuração acima, ocorrerá um erro e impedirá o funcionamento do servidor web caso ocorra algum problema com o mod_ssl
.
Iniciando o servidor Web com suporte a SSL
[editar | editar código-fonte]Verifique se a configuração do Apache
está ok com apache -t. Caso positivo, reinicie o servidor usando um dos métodos descritos em [#s-s-apache-rodando Iniciando o servidor/reiniciando/recarregando a configuração, Seção 12.1.9]. O servidor web lhe pedirá a FraseSenha para descriptografar a chave privada SSL (esta senha foi escolhida durante o processo de criação do certificado).
Esta senha garante uma segurança adicional caso a chave privada do servidor seja copiada de alguma forma. Somente quem tem conhecimento da FraseSenha poderá iniciar o servidor com suporte a transferência segura de dados. Verifique se o virtual host está servindo as requisições na porta 443 com apache -S.
O único método para fazer o servidor web evitar de pedir a senha para descriptografar a chave privada é colocando uma senha em branco. Isto só é recomendado em ambientes seguros e o diretório que contém a chave privada deverá ter somente permissões para o dono/grupo que executa o servidor Web. Qualquer outra permissão poderá por em risco a segurança da instalação caso a chave privada seja roubada. Depois disso, execute o comando:
# entre no diretório que contém a chave privada cd /etc/apache/ssl.key # renomeie a chave privada para outro nome ren server.key server.key-Csenha openssl rsa -in server.key-Csenha -out server.key
Digite a senha quando pedido. A chave original (com senha) estará gravada no arquivo server.key-Csenha
e poderá ser restaurada se necessário. Reinicie o servidor Apache
, desta vez ele não pedirá a senha.
OBS1: Tire uma cópia de segurança da chave privada original antes de executar esta operação.
OBS2: Não se esqueça de ajustar as permissões de acesso no diretório /etc/apache/ssl.key
caso não utilize senha para proteger seu certificado digital.