Configurando a segurança do SSL no Apache ou Nginx
[Atualizado em 26-05-2015 – ‘Logjam’ Vulnerability CVE-2015-4000)]
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.
7
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.
Figura 1 – Teste de SSL padrão
Para mitigar a vulnerabilidade Logjam (CVE-2015-4000) recomenda-se utilizar um Unique Diffie Hellman Group com 2048 bits ou acima, além de substituir chaves DHE por ECDHE e desabilitar cifras EXPORT(CVE-2015-0204).
Execute o comando abaixo para gerar um novo Unique Diffie Hellman Group com 2048 bits
openssl dhparam -out dhparams.pem 2048
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 #Habilita o Unique Diffie Hellman Group 2048 bits (CVE-2015-4000) SSLOpenSSLConfCmd DHParameters "INFORME o CAMINHO DO ARQUIVO dhparams.pem CRIADO ANTERIORMENTE"
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"; #Habilita o Unique Diffie Hellman Group 2048 bits (CVE-2015-4000) ssl_dhparam INFORME o CAMINHO DO ARQUIVO dhparams.pem CRIADO ANTERIORMENTE
Observação
O TLS compression vem desabilitado por padrão no Nginx
Validando
Observe os resultados obtidos após o hardening do protocolo HTTPS
Figura 2 – Teste do Apache/Nginx após o hardening
Figura 3 – Validando as configurações de SSL na Qualys SSL Server Test
Testando o SSL/TLS
Disponibilizamos no Github o shellscript HTTPSScan capaz de identificar as seguintes vulnerabilidades SSL/TLS:
SSLv2 (CVE-2011-1473)
TLS CRIME (CVE-2012-4929)
RC4 (CVE-2013-2566)
Heartbleed (CVE-2014-0160)
Poodle (CVE-2014-3566)
FREAK (CVE-2015-0204)
Logjam (CVE-2015-4000)
Weak Ciphers
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-4000 – https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-4000
Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice – https://weakdh.org/imperfect-forward-secrecy.pdf
Logjam, FREAK and Upcoming Changes in OpenSSL – https://www.openssl.org/blog/blog/2015/05/20/logjam-freak-upcoming-changes/
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 – https://www.ibliss.digital/sigvu-sistema-integrado-de-gestao-de-vulnerabilidades//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/