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


Tal vez pueda interesarte


Compartí este artículo