Configurando a segurança do SSL no Apache ou Nginx

Artigo originalmente publicado por Alexos em iBliss Segurança e Inteligência

[Atualizado em 04-03-2015 – ‘FREAK’ Vulnerability CVE-2015-0204)]

Após a divulgação de diversas falhas em algoritmos e no protocolo SSL/TLS é necessário adequar o ambiente para atender requisitos mínimos de segurança. Este artigo apresentará como configurar o HTTPS nos servidores Apache e Nginx buscando prevenir contra ataques a esse protocolo.

Todas as configurações foram testadas no Debian Wheezy 7.0.3 com Apache 2.2.22-13 e Nginx 1.6.2 e usando os navegadores Chrome,Firefox e Internet Explorer.

Utilize o comando abaixo para gerar uma chave em compliance com o Certification Authority/Browser(CA/B) Forum, onde foi definido que a partir de 1º janeiro de 2014 alguns browsers podem rejeitar certificados com chave menor que 2048 bits.

openssl genrsa -out site.key 2048

A figura 1 mostra o teste realizado antes das configurações observe que por padrão o servidor já utiliza cifras fortes.

ssl padrão

Figura 1 – Teste de SSL padrão

Hardening Apache SSL

Ative os módulos headers e rewrite

a2enmod headers && a2enmod rewrite

Configure o vhost de acesso HTTP forçando o redirecionamento para o HTTPS usando as seguintes linhas:

<VirtualHost *:80>
...
#Habilite o redirect para sites no mesmo dominio
ServerSignature On
RewriteEngine On
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 2
...
</VirtualHost>

Configure o vhost de acesso HTTPS adicionando as linhas referentes ao Apache SSL Hardening, todas elas estão comentadas.

## Hardening Apache SSL ##

#Desabilita o SSLv2 usando somente o TLS 1.2 ( FIPS 140-2 standard compliance ) 
SSLProtocol ALL -SSLv2 -SSLv3

#As preferencias do servidor irao prevalecer na escolha da cifra durante o SSLv3 ou TLSv1 handshake
SSLHonorCipherOrder On

#Desabilita a compressao de requisicoes SPDY e TLS (CVE-2012-4929)
SSLCompression off

#Habilita o HSTS (HTTPS Strict Transport Security) header para forcar o uso do protocolo HTTPS, permitindo tambem que o navegador do cliente relembre essa requisicao em futuras conexoes durante 6 meses.
Header add Strict-Transport-Security "max-age=15768000"

#Caso queira habilitar o HSTS para todos os subdominios
#Strict -Transport -Security: max-age=15768000 ; includeSubDomains

#Define as cifras disponiveis durante o SSL handshake compatível com os principais navegadores
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder on

Após a configurar o apache é necessário reiniciá-lo para aplicar todas as modificações

apache2ctl restart



Hardening Nginx SSL

Configure o vhost de acesso HTTP forçando o redirecionamento para o HTTPS usando o parâmetro return como no exemplo abaixo

server {
...
listen 80; ## listen for ipv4; this line is default and implied
return 301 https://$host$request_uri;
…
}

Configure o vhost de acesso HTTPS adicionando as linhas referentes ao NGIX SSL Hardening, todas estão comentadas.

#As preferencias do servidor irao prevalecer na escolha da cifra durante o SSLv3 ou TLSv1 handshake.
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;

#Desabilita o SSLv2 e SSLv3 usando somente o TLS ( FIPS 140-2 standard compliance )
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

#Define as cifras disponiveis durante o SSL handshake compatível com os principais navegadores
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

#Habilita o HSTS (HTTPS Strict Transport Security) header para forcar o uso do protocolo HTTPS, permitindo tambem que o navegador do cliente relembre essa requisicao em futuras conexoes durante 6 meses.
add_header Strict-Transport-Security "max-age=15768000";

Observação
O TLS compression vem desabilitado por padrão no Nginx

Validando
Observe os resultados obtidos após o hardening do protocolo HTTPS

apache sslFigura 2 – Teste do Apache após o hardening

nginx sslFigura 3 – Teste do Nginx após o hardening

ssl testFigura 4 – Validando as configurações de SSL na Qualys SSL Server Test

Conclusão

As configurações apresentadas previnem contra algumas das vulnerabilidades publicadas criando uma camada de segurança durante conexões seguras usando o protocolo HTTPS estando em conformidade com diversos padrões de segurança do mercado.

Conheça os serviços de diagnósticos de segurança da iBliss Segurança e Inteligência

Conheça o serviços de configuração segura – Baseline da iBliss Segurança e Inteligência

Referências

CVE-2015-0204 – https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0204

Tracking the FREAK Attack – https://freakattack.com/

‘FREAK’ — New SSL/TLS Vulnerability Explained – http://thehackernews.com/2015/03/freak-openssl-vulnerability.html

POODLE attacks on SSLv3 – https://www.imperialviolet.org/2014/10/14/poodle.html

This POOFLE Bites: Exploiting The SSL 3.0 Fallback[PAPER]https://www.openssl.org/~bodo/ssl-poodle.pdf

O mito do cadeado de segurança – http://www.ibliss.com.br/blog/o-mito-do-cadeado-de-seguranca/

CAB Forum Baseline Requirementes – https://www.cabforum.org/Baseline_Requirements_V1.pdf

TLS Session Renegotiation Vulnerability – http://www.rapid7.com/db/vulnerabilities/tls-sess-renegotiation

RFC-6797 – HTTP Strict Transport Security (HSTS) – http://tools.ietf.org/html/rfc6797

Nginx HTTPSSLModule – http://wiki.nginx.org/HttpSslModule

Apache Module mod_ssl – http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

Configuring Apache, Nginx, and OpenSSL for Forward Secrecy – https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy

Qualys SSL Server Test – https://www.ssllabs.com/ssltest/

Author: alexos