Este artículo explica cómo analizar las suites de cifrado y protocolos SSL/TLS soportados por un servidor Web, desde línea de comandos, utilizando la herramienta "cipherscan" desarrollada y mantenida por la Fundación Mozilla.
Existen muchas herramientas online para diagnosticar y verificar el nivel de seguridad ofrecido en la implementación de SSL/TLS de un servidor Web, por ejemplo el Test SSL de Qualys. Sin embargo, es importante disponer de una herramienta de línea de comandos para llevar a cabo la misma tarea, especialmente si necesitamos verificar el nivel de seguridad de SSL/TLS de servidores Web no accesibles desde Internet. A tal fin, dí con la herramienta cipherscan (creada por la Fundación Mozilla), la cual sirve para listar todas las suites de cifrado soportadas por un servidor HTTPS y su ordenamiento, al igual que analizar y verificar la información de certificados, opciones de TLS, OCSP Stapling y más.
cipherscan
es un wrapper del comando openssl s_client
, sin embargo utiliza una versión personalizada de openssl
mantenida por Peter Mosmans. Esta incluye un número de parches no presentes en la versión oficial que dan soporte a algoritmos de hashing y cifrado inseguros y obsoletos (ChaCha20, Poly1305 y otros) para agregar características adicionales a s_client
. Esto es necesario para justamente poder testear si un servidor target los soporta.
Instalación
Para instalar correctamente cipherscan
en Debian, es necesario clonar la última versión estable desde GitHub y luego compilar la versión de openssl
de Peter Mosmans.
Antes de comenzar, instalar git
:
# apt-get install git
Luego descargar cipherscan
:
# git clone https://github.com/mozilla/cipherscan.git
La versión de openssl
de Peter Mosmans incluida en el paquete no funciona, con lo cual es necesario compilarla manualmente.
Cambiar al directorio cipherscan
y borrar los binarios de OpenSSL:
# cd cipherscan/ # rm openssl openssl-darwin64
Crear un nuevo directorio de instalación de OpenSSL:
# mkdir pmopenssl # cd pmopenssl
Descargar la última versión de OpenSSL de Peter Mosmans:
# git clone https://github.com/PeterMosmans/openssl.git --depth 1 -b 1.0.2-chacha # cd openssl
Configurarlo con las siguientes opciones:
./Configure zlib no-shared experimental-jpake enable-md2 enable-rc5 \ enable-rfc3779 enable-gost enable-static-engine linux-x86_64
Finalmente compilar y verificar el funcionamiento de todas las suites:
make depend make make report
No instalar esta versión de OpenSSL porque es insegura. Sólo será utilizada localmente por cipherscan
para poder verificar el soporte de protocolos inseguros y obsoletos.
Cambiar al directorio base de instalación de cipherscan
y enlazar al binario recién compilado:
root@debian:~/tools/cipherscan/pmopenssl/openssl# cd ../.. root@debian:~/tools/cipherscan# ln -s pmopenssl/openssl/apps/openssl openssl
Por último, puede ser necesario instalar algunos paquetes de Python necesarios para cipherscan
:
root@debian:~/tools/cipherscan# apt-get install python-pip root@debian:~/tools/cipherscan# pip install six
Funcionamiento
Para listar los protocolos, suites de cifrado soportadas y su ordenamiento, y opciones de SSL/TLS, simplemente se debe especificar un target:
root@debian:~/tools/cipherscan# ./cipherscan testing.linuxito.com ....................................... Target: testing.linuxito.com:443 prio ciphersuite protocols pfs curves 1 ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1 2 ECDHE-RSA-AES256-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1 3 ECDHE-RSA-AES256-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1 4 DHE-RSA-AES256-GCM-SHA384 TLSv1.2 DH,2048bits None 5 DHE-RSA-AES256-SHA256 TLSv1.2 DH,2048bits None 6 DHE-RSA-AES256-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 7 DHE-RSA-CAMELLIA256-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 8 AES256-GCM-SHA384 TLSv1.2 None None 9 AES256-SHA256 TLSv1.2 None None 10 AES256-SHA TLSv1,TLSv1.1,TLSv1.2 None None 11 CAMELLIA256-SHA TLSv1,TLSv1.1,TLSv1.2 None None 12 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1 13 ECDHE-RSA-AES128-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1 14 ECDHE-RSA-AES128-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1 15 DHE-RSA-AES128-GCM-SHA256 TLSv1.2 DH,2048bits None 16 DHE-RSA-AES128-SHA256 TLSv1.2 DH,2048bits None 17 DHE-RSA-AES128-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 18 DHE-RSA-SEED-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 19 DHE-RSA-CAMELLIA128-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 20 AES128-GCM-SHA256 TLSv1.2 None None 21 AES128-SHA256 TLSv1.2 None None 22 AES128-SHA TLSv1,TLSv1.1,TLSv1.2 None None 23 SEED-SHA TLSv1,TLSv1.1,TLSv1.2 None None 24 CAMELLIA128-SHA TLSv1,TLSv1.1,TLSv1.2 None None 25 ECDHE-RSA-RC4-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1 26 RC4-SHA TLSv1,TLSv1.1,TLSv1.2 None None 27 ECDHE-RSA-DES-CBC3-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1 28 EDH-RSA-DES-CBC3-SHA TLSv1,TLSv1.1,TLSv1.2 DH,2048bits None 29 DES-CBC3-SHA TLSv1,TLSv1.1,TLSv1.2 None None Certificate: untrusted, 2048 bits, sha256WithRSAEncryption signature TLS ticket lifetime hint: 300 NPN protocols: None OCSP stapling: not supported Cipher ordering: client Curves ordering: server - fallback: no Server supports secure renegotiation Server supported compression methods: NONE TLS Tolerance: yes Intolerance to: SSL 3.254 : absent TLS 1.0 : absent TLS 1.1 : absent TLS 1.2 : absent TLS 1.3 : absent TLS 1.4 : absent
Es interesante examinar el ordenamiento de las suites y preferencia de las mismas. En este caso se observa que se soportan suites inseguras (por ejemplo aquellas que utilizan SHA-1, RC4, etc.) Notar que se incluye información del certificado, como su algoritmo de firma y validez, además del soporte de suites SSL/TLS y otras opciones.
A quienes no cuenten con conocimientos suficientes sobre seguridad informática, esta salida tal vez les resulte poco esclarecedora. Por ello el paquete también incluye una herramienta para generar un reporte sobre lo que está bien, y qué cambios es necesario implementar para mejorar la seguridad del servidor en cuestión.
Correr el script analyze.py
con la opción -t
:
root@debian:~/tools/cipherscan# ./analyze.py -t testing.linuxito.com testing.linuxito.com:443 has bad ssl/tls Things that are bad: * remove cipher ECDHE-RSA-RC4-SHA * remove cipher RC4-SHA * don't use an untrusted or self-signed certificate Changes needed to match the old level: * remove cipher ECDHE-RSA-RC4-SHA * remove cipher RC4-SHA * enable SSLv3 * use a certificate with sha1WithRSAEncryption signature * use DHE of 1024bits and ECC of 160bits * consider enabling OCSP Stapling * enforce server side ordering Changes needed to match the intermediate level: * remove cipher DHE-RSA-CAMELLIA256-SHA * remove cipher CAMELLIA256-SHA * remove cipher DHE-RSA-SEED-SHA * remove cipher DHE-RSA-CAMELLIA128-SHA * remove cipher SEED-SHA * remove cipher CAMELLIA128-SHA * remove cipher ECDHE-RSA-RC4-SHA * remove cipher RC4-SHA * consider enabling OCSP Stapling * enforce server side ordering Changes needed to match the modern level: * remove cipher ECDHE-RSA-AES256-SHA * remove cipher DHE-RSA-AES256-GCM-SHA384 * remove cipher DHE-RSA-AES256-SHA256 * remove cipher DHE-RSA-AES256-SHA * remove cipher DHE-RSA-CAMELLIA256-SHA * remove cipher AES256-GCM-SHA384 * remove cipher AES256-SHA256 * remove cipher AES256-SHA * remove cipher CAMELLIA256-SHA * remove cipher ECDHE-RSA-AES128-SHA * remove cipher DHE-RSA-AES128-GCM-SHA256 * remove cipher DHE-RSA-AES128-SHA256 * remove cipher DHE-RSA-AES128-SHA * remove cipher DHE-RSA-SEED-SHA * remove cipher DHE-RSA-CAMELLIA128-SHA * remove cipher AES128-GCM-SHA256 * remove cipher AES128-SHA256 * remove cipher AES128-SHA * remove cipher SEED-SHA * remove cipher CAMELLIA128-SHA * remove cipher ECDHE-RSA-RC4-SHA * remove cipher RC4-SHA * remove cipher ECDHE-RSA-DES-CBC3-SHA * remove cipher EDH-RSA-DES-CBC3-SHA * remove cipher DES-CBC3-SHA * disable TLSv1.1 * disable TLSv1 * consider enabling OCSP Stapling * enforce server side ordering
La salida presenta las modificaciones necesarias para alcanzar diferentes niveles de seguridad entre inseguro (old), intermedio (intermediate) y seguro (modern), de acuerdo al tipo de clientes que accedan al servidor (muchas veces es necesario habilitar protocolos y suites inseguros para dar soporte a navegadores obsoletos/desactualizados).
Del reporte anterior se observa que lo más grave es contar con soporte para las suites ECDHE-RSA-RC4-SHA
y RC4-SHA
, por soportar RC4 (vulnerable a múltiples ataques). Sin embargo también se observa que, para alcanzar al nivel modern, se requiere deshabilitar un número importante de suites.
Tener en cuenta que a mayor seguridad (menor cantidad de suites intermedias soportadas), menor soporte para clientes. Esto significa que, al deshabilitar ciertas suites, se puede dejar sin soporte a muchos clientes (especialmente dispositivos móviles). Por ello, antes de realizar modificaciones es recomendable saber cuáles son las suites más utilizadas por los cliente en nuestro servidor Web.
Referencias