Application d’une version minimale de TLS pour l’AWS CLI - AWS Command Line Interface

Cette documentation concerne uniquement la version 1 de l’AWS CLI. Pour la documentation relative à la version 2 de l’AWS CLI, consultez le Guide de l’utilisateur de la version 2.

Application d’une version minimale de TLS pour l’AWS CLI

Lorsque vous utilisez l’AWS Command Line Interface (AWS CLI), le protocole TLS (Transport Layer Security) joue un rôle crucial dans la sécurisation des communications entre AWS CLI et Services AWS. Pour augmenter la sécurité lors de la communication avec les services AWS, vous devez configurer l’utilisation de TLS 1.2 ou version ultérieure.

L’AWS CLI et le Service AWS peuvent échanger des données en toute sécurité, grâce au protocole TLS qui assure le chiffrement, l’authentification et l’intégrité des données. En tirant parti du protocole TLS, l’AWS CLI garantit que vos interactions avec les Services AWS sont protégées contre les accès non autorisés et les violations de données, améliorant ainsi la sécurité globale de votre écosystème AWS.

Le modèle de responsabilité partagée AWS s’applique à la protection des données dans AWS Command Line Interface. Comme décrit dans ce modèle, AWS est responsable de la protection de l’infrastructure globale sur laquelle l’ensemble du Services AWS s’exécute. La gestion du contrôle de votre contenu hébergé sur cette infrastructure relève de votre responsabilité. Vous êtes également responsable des tâches de configuration et de gestion de la sécurité des Services AWS que vous utilisez. Pour plus d’informations sur la protection des données, consultez Protection des données dans l’AWS CLI.

Pour vous assurer que l’AWS CLI version 1 n’utilise pas de version TLS antérieure à TLS 1.2, vous devrez peut-être recompiler OpenSSL pour appliquer ce minimum, puis recompiler Python pour utiliser la nouvelle version d’OpenSSL.

Détermination de vos protocoles actuellement pris en charge

Tout d’abord, créez un certificat autosigné à utiliser pour le serveur de test et le kit SDK Python à l’aide d’OpenSSL.

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

Ensuite, faites tourner un serveur de test à l’aide d’OpenSSL.

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

Dans une nouvelle fenêtre de terminal, créez un environnement virtuel et installez le kit SDK pour Python.

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

Créez un nouveau script Python nommé check.py qui utilise la bibliothèque HTTP sous-jacente du kit 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'))

Exécutez votre nouveau script.

$ python check.py

Des détails sur la connexion effectuée s’affichent. Recherchez « Protocole :  » dans le résultat. Si le résultat est « TLSv1.2 » ou version ultérieure, le kit SDK est par défaut TLS v1.2 ou version ultérieure. S’il s’agit d’une version antérieure, vous devez recompiler OpenSSL et recompiler Python.

Cependant, même si votre installation de Python est par défaut TLS v1.2 ou version ultérieure, il est toujours possible pour Python de renégocier vers une version antérieure à TLS v1.2 si le serveur ne prend pas en charge TLS v1.2 ou une version ultérieure. Pour vérifier que Python ne renégocie pas automatiquement des versions antérieures, redémarrez le serveur de test avec ce qui suit.

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

Si vous utilisez une version antérieure d’OpenSSL, vous n’avez peut-être pas l’indicateur -no_tls_3 disponible. Si c’est le cas, supprimez l’indicateur car la version d’OpenSSL que vous utilisez ne prend pas en charge TLS v1.3. Exécutez à nouveau le script Python.

$ python check.py

Si votre installation de Python ne renégocie pas correctement des versions antérieures à TLS 1.2, vous devriez recevoir une erreur 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 vous êtes en mesure d’établir une connexion, vous devez recompiler OpenSSL et Python pour désactiver la négociation des protocoles antérieurs à TLS v1.2.

Compilation d’OpenSSL et de Python

Pour vous assurer que le kit SDK ou l’AWS CLI ne négocie rien d’antérieur à TLS 1.2, vous devez recompiler OpenSSL et Python. Pour ce faire, copiez le contenu suivant pour créer un script et exécutez-le.

#!/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

On compile ainsi une version de Python qui a un OpenSSL lié statiquement qui ne négocie pas automatiquement quoi que ce soit d’antérieur à TLS 1.2. On installe également OpenSSL dans le répertoire /opt/openssl-with-min-tls1_2 et Python dans le répertoire /opt/python-with-min-tls1_2. Après avoir exécuté ce script, confirmez l’installation de la nouvelle version de Python.

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

Ce qui suit devrait s’imprimer.

$ Python 3.8.1

Pour confirmer que cette nouvelle version de Python ne négocie pas une version antérieure à TLS 1.2, exécutez à nouveau les étapes à partir de Détermination de vos protocoles actuellement pris en chargeà l’aide de la version Python nouvellement installée (c’est-à-dire /opt/python-with-min-tls1_2/bin/python3).