Desativando RC4 no Conjunto de Cifras SSL de um Servidor Apache

17

Por favor, veja as seções EDIT na minha própria resposta; eles contêm uma explicação para esse enigma .

Estou tentando desativar o RC4 para um servidor Apache 2.2.9 em execução no CentOS 6.5 VPS e não consigo obter êxito.

Um certificado validado pela empresa adquirido recentemente está instalado e as conexões SSL estão funcionando bem, mas eu queria configurar as coisas da melhor maneira possível, para "fortalecer a segurança", como alguns tutoriais colocam.

Verificando a configuração com o Qualys SSL Labs, a página de resultados mostra "Este servidor aceita a cifra RC4, que é fraca. Grade limitada a B."

No entanto, eu coloquei isso no ssl.conf:

 SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3

Salvei o script fornecido na resposta a esta pergunta em um arquivo chamado test-ssl-ciphers.sh e alterei o endereço IP para um endereço de loopback. Este é o resultado de ./test-ssl-ciphers.sh | grep -i "RC4":

Testing ECDHE-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDHE-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing AECDH-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing ECDH-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDH-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing PSK-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-MD5...NO (no ciphers available)
Testing EXP-ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-KRB5-RC4-SHA...NO (no ciphers available)
Testing EXP-KRB5-RC4-MD5...NO (no ciphers available)

Cada uma dessas linhas contém "NÃO", o que, de acordo com o script, significa que o servidor não suporta a combinação de cifras especificada.

Além disso, o comando grep -i -r "RC4" /etc/httpdfornece apenas o arquivo ssl.conf mencionado acima.

Além disso, a execução openssl ciphers -Vno meu conjunto de cifras não mostra nenhuma cifra RC4, o que faz sentido, dada a sequência de configuração.

Estou, portanto, de alguma forma perdida, por que os sites de verificação SSL estão me dizendo que "o servidor aceita RC4". Eles até listam as seguintes cifras como sendo aceitas:

TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA

Alguém tem uma explicação possível? O que estou fazendo de errado? Talvez haja outro lugar em que esse suporte ao RC4 ou "aceitação" seja configurado?

Obrigado.

[ EDIT ] Usando um CentOS 6.6 em uma máquina virtual em casa, executei o script novamente no meu VPS usando seu nome de domínio em vez do endereço de loopback. Essa configuração implica que a lista de cifras é fornecida pela instância openssl na VM: Eu ainda não tenho o RC4 entre as cifras que produzem YES.

AbVog
fonte

Respostas:

16

Ao instalar o certificado renovado, descobri que o problema foi causado pela especificação (para o domínio e para cada subdomínio) no ISPConfig de todo o conjunto de dados necessários para HTTPS: certificado, chave privada, cadeia de CA etc.

Em outras palavras, a remoção do conjunto de dados levou ao teste Qualys para classificar o domínio A e, ao mesmo tempo, remover os avisos sobre o RC4. Retornar os detalhes leva a que os avisos voltem e a nota seja limitada em B novamente, o que não deixa margem para dúvidas quanto ao elo de causalidade.

É como se a apresentação dos detalhes de cada vhost de alguma forma tivesse criado um novo ambiente no qual alguns padrões substituíssem o conjunto de cifras que eu especifiquei no ssl.conf. Esquisito.

A solução é adicionar a especificação SSLCipherSuite na área de texto Diretivas Apache para cada vhost. É isso que tenho na configuração que me dá uma nota A:

SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
# Compression is disabled by default on my distribution (CentOS 6)
# SSLCompression off 
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

EDIT (16/05/2017): Uma descoberta adicional sobre este problema: a especificação de SSLCipherSuiteé obrigatória. Não consigo entender por que essa diretiva específica, embora especificada no nível do servidor, não se aplica automaticamente às configurações de host virtual . Estou executando o Apache 2.2.15 no CentOS 6.9.

EDIT (2018-06-18): Mais informações. Acabei de descobrir que a SSLCipherSuitediretiva pode ser especificada uma única vez e se aplicará a todos os hosts virtuais: no arquivo de configuração mod_ssl base (no CentOS 6, o arquivo é encontrado em /etc/httpd/conf.d/ssl.conf), basta especificar a diretiva fora de o host virtual padrão. A documentação do Apache 2.2 indica que o valor padrão desta diretiva é SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP. Eu acho que é daí que a cifra RC4 vem: na ausência de qualquer especificação, o que era o meu caso, uma vez que nenhuma especificação estava no contexto "global", o valor padrão se aplica. Esse entendimento termina o que tem sido um mistério para mim. Ironicamente, estou prestes a mudar para o CentOS 7 quando encontrar essa explicação! HTH.

AbVog
fonte
6
SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3
                                                                    ^^^^^^^

Péssima ideia. Desativar todas as cifras SSLv3 resulta na desativação das cifras utilizáveis ​​com TLS1.0 e TLS1.1 e deixa apenas algumas cifras recém-introduzidas com TLS1.2 (se o servidor suportar TLS1.2)

Estou, portanto, de alguma forma perdida, por que os sites de verificação SSL estão me dizendo que "o servidor aceita RC4". Eles até listam as seguintes cifras como sendo aceitas:

Verifique se os testes locais e externos acessam o mesmo servidor (endereço IP). Já vi muitos sites example.comem um host diferente www.example.come, portanto, os testes diferem.

Steffen Ullrich
fonte
Sim, o domínio raiz e seus subdomínios estão no mesmo VPS. Há um endereço IP associado ao VPS e eu uso o ISPConfig para gerenciá-lo. Obrigado.
AbVog
Use SSLLabs . Compare o IP que eles mostram com o IP que seu sistema possui. Verifique se você não possui outro proxy (CDN) reverso ou CDN à frente que possa afetar o resultado.
Steffen Ullrich
"Desativar todas as cifras SSLv3 resulta na desativação das cifras utilizáveis ​​com TLS1.0 e TLS1.1 e deixa apenas algumas cifras recém-introduzidas com TLS1.2 (se o servidor suportar TLS1.2)" Então, qual é a solução adequada?
Rohn Adams 01/01
@RohnAdams: se o objetivo é desativar o RC4, a parte '! RC4' está correta. O problema foi o bloqueio excessivo usando adicionalmente '! SSLv3'. Quanto às cifras úteis a serem usadas, consulte Mozilla Cipher Generator .
Steffen Ullrich
2

Os laboratórios SSL da Qualys parecem muito sensíveis aos hosts padrão etc. Verifique se TODOS os seus HTTPS VirtualHosts nesse endereço IP usam exatamente as mesmas configurações (além dos arquivos de certificado), tive um problema semelhante em que alguns dos testes da Qualys foram testados no meu VirtualHost e alguns dos testes pareciam pegar um VirtualHost padrão. Meu vhost alvo tinha apenas uma única cifra ativada, mas Qualys estava encontrando uma lista muito maior no vhost padrão.

Eu também achei um script mais bonito aqui que dá informações mais completas sobre os testes de SSL.

Geoff
fonte
2

Estava apenas procurando por um desses sites. Com base na resposta da @ AbVog, descobri que minhas diretivas estavam apenas dentro do vhost padrão. Quando mudei as diretrizes para o contexto global, tudo estava bem.

Como um aparte, eu também encontrei https://cipherli.st/, que tem uma boa lista de configurações de SSL para vários pacotes diferentes. A recomendação atual para o apache da seguinte maneira:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

# Requires Apache >= 2.4
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 
boyvinall
fonte
0

No meu Fedora 25 com cifras Apache / 2.4.25 são tratadas pelas políticas de criptografia (consulte / etc / cryptopolicies / backends). A configuração padrão tem o RC4 completamente desativado, portanto, não é necessário adulterar cifras na configuração do Apache. Exceto por garantir que você use o ssl.conf mais recente, pois ele não está instalado por padrão, mas é deixado como ssl.conf.rpmnew no diretório conf.d.

Para configurar o SSL, eu apenas precisei especificar os certificados, ServerName e DocumentRoot. Para o Squirrelmail, é isso.

SSLCertificateFile /etc/letsencrypt/live/mail.xxxx.dk/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.xxxx.dk/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mail.xxxx.dk/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/mail.xxxx.dk/fullchain.pem
ServerName mail.xxxx.dk:443
DocumentRoot "/usr/share/squirrelmail"
John Damm Sørensen
fonte