Aplicación de una versión mínima de TLS 1.2 - AWS Command Line Interface

Python 2.7, 3.4 y 3.5 están obsoletas para la versión 1 de AWS CLI. Para obtener más información, consulte la sección de la versión 1 de AWS CLI de Acerca de las versiones de AWS CLI.

Aplicación de una versión mínima de TLS 1.2

Para aumentar la seguridad al comunicarse con los servicios de AWS, debe configurar la AWS Command Line Interface (AWS CLI) de modo que use TLS 1.2 o una versión posterior. Cuando se utiliza la AWS CLI, Python se usa para establecer la versión de TLS.

Según la versión de su AWS CLI, los pasos que realice para aplicar la versión mínima de TLS 1.2 varían.

Configuración de la versión 1 de la AWS CLI para aplicar una versión mínima de TLS 1.2

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).

Configuración de la versión 2 de la AWS CLI para aplicar una versión mínima de TLS 1.2

La versión 2 de la AWS CLI usa un script interno de Python que se compila con el fin de usar la versión mínima de TLS 1.2 cuando el servicio con el que se comunica lo admite. No se necesitan más pasos para aplicar este mínimo.