Aplicación de una versión de TLS mínima para la AWS CLI - AWS Command Line Interface

Esta documentación es para la versión 1 de AWS CLI. Para obtener documentación relacionada con la versión 2 de AWS CLI, consulte la Guía del usuario de la versión 2.

Aplicación de una versión de TLS mínima para la AWS CLI

Cuando se utiliza la AWS Command Line Interface (AWS CLI), el protocolo de seguridad de la capa de transporte (TLS) desempeña un papel crucial a la hora de proteger la comunicación entre la AWS CLI y los Servicios de AWS. Para aumentar la seguridad al comunicarse con los servicios de AWS, debe usar TLS 1.2 o una versión posterior.

La AWS CLI y el Servicio de AWS pueden intercambiar datos de forma segura con el protocolo TLS que proporciona cifrado, autenticación e integridad de los datos. Al utilizar el protocolo TLS, la AWS CLI garantiza que sus interacciones con los Servicios de AWS estén protegidas frente el acceso no autorizado y las filtraciones de datos, lo que mejora la seguridad general de su ecosistema AWS.

El modelo de responsabilidad compartida, y de AWS se aplica a la protección de datos de AWS Command Line Interface. Como se describe en este modelo, AWS es responsable de proteger la infraestructura global que ejecuta toda la Servicios de AWS. Usted es responsable de mantener el control sobre el contenido alojado en esta infraestructura. Usted también es responsable de las tareas de administración y configuración de seguridad para los Servicios de AWS que utiliza. Para obtener más información sobre la protección de datos, consulte Protección de datos en la AWS CLI.

Para asegurarse de que la versión 1 de la AWS CLI no use ninguna versión de TLS anterior a TLS 1.2, es posible que tenga que volver a compilar OpenSSL para que aplique este mínimo y, a continuación, deba volver a compilar Python para que use el OpenSSL recién creado.

Determinación de los protocolos admitidos actualmente

Primero, cree un certificado autofirmado con el fin de usarlo para el servidor de prueba y Python SDK mediante OpenSSL.

$ openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365

A continuación, cree un servidor de prueba mediante OpenSSL.

$ openssl s_server -key key.pem -cert cert.pem -www

En una nueva ventana de terminal, cree un entorno virtual e instale el SDK para Python.

$ python3 -m venv test-env source test-env/bin/activate pip install botocore

Cree un script de Python denominado check.py que use la biblioteca HTTP subyacente del SDK.

$ import urllib3 URL = 'https://localhost:4433/' http = urllib3.PoolManager( ca_certs='cert.pem', cert_reqs='CERT_REQUIRED', ) r = http.request('GET', URL) print(r.data.decode('utf-8'))

Ejecute el nuevo script.

$ python check.py

Muestra detalles sobre la conexión realizada. Busque «Protocol:» en la salida. Si el resultado es «TLSv1.2» o posterior, el SDK predeterminado es TLS v1.2 o posterior. Si se trata de una versión anterior, debe volver a compilar OpenSSL y Python.

Sin embargo, aunque la instalación de Python se establezca de forma predeterminada en TLS v1.2 o posterior, es posible que Python renegocie a una versión anterior a TLS v1.2 si el servidor no admite TLS v1.2 o posterior. Para comprobar que Python no renegocia automáticamente a versiones anteriores, reinicie el servidor de prueba con lo siguiente.

$ openssl s_server -key key.pem -cert cert.pem -no_tls1_3 -no_tls1_2 -www

Si está utilizando una versión anterior de OpenSSL, es posible que la opción -no_tls_3 no esté disponible. Si este es el caso, elimine la opción, porque la versión de OpenSSL que está utilizando no admite TLS v1.3. A continuación, vuelva a ejecutar el script de Python.

$ python check.py

Si su instalación de Python no renegocia correctamente las versiones anteriores a TLS 1.2, debería recibir un error de SSL.

$ urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='localhost', port=4433): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)')))

Si puede establecer una conexión, debe volver a compilar OpenSSL y Python para deshabilitar la negociación de protocolos anteriores a TLS v1.2.

Compilar OpenSSL y Python

Para asegurarse de que el SDK o la AWS CLI no negocien a nada anterior a TLS 1.2, debe volver a compilar OpenSSL y Python. Para ello, copie el siguiente contenido con el fin de crear un script y ejecútelo.

#!/usr/bin/env bash set -e OPENSSL_VERSION="1.1.1d" OPENSSL_PREFIX="/opt/openssl-with-min-tls1_2" PYTHON_VERSION="3.8.1" PYTHON_PREFIX="/opt/python-with-min-tls1_2" curl -O "https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz" tar -xzf "openssl-$OPENSSL_VERSION.tar.gz" cd openssl-$OPENSSL_VERSION ./config --prefix=$OPENSSL_PREFIX no-ssl3 no-tls1 no-tls1_1 no-shared make > /dev/null sudo make install_sw > /dev/null cd /tmp curl -O "https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tgz" tar -xzf "Python-$PYTHON_VERSION.tgz" cd Python-$PYTHON_VERSION ./configure --prefix=$PYTHON_PREFIX --with-openssl=$OPENSSL_PREFIX --disable-shared > /dev/null make > /dev/null sudo make install > /dev/null

Se compila una versión de Python que tiene un OpenSSL enlazado estáticamente que no negocia automáticamente a nada anterior a TLS 1.2. Esto también instala OpenSSL en el directorio /opt/openssl-with-min-tls1_2 directorio e instala Python en el directorio /opt/python-with-min-tls1_2. Después de ejecutar este script, confirme la instalación de la nueva versión de Python.

$ /opt/python-with-min-tls1_2/bin/python3 --version

Se debería imprimir lo siguiente.

$ Python 3.8.1

Para confirmar que esta nueva versión de Python no negocia a una versión anterior de TLS 1.2, vuelva a ejecutar los pasos de Determinación de los protocolos admitidos actualmente usando la versión de Python recién instalada (es decir, /opt/python-with-min-tls1_2/bin/python3).