Enforcing a minimum version of TLS for the AWS CLI - AWS Command Line Interface

このドキュメントはバージョン 1 の AWS CLI のみを対象としています。AWS CLI のバージョン 2 に関連するドキュメントについては、バージョン 2 用ユーザーガイドを参照してください。

Enforcing a minimum version of TLS for the AWS CLI

AWS Command Line Interface (AWS CLI) を使用する場合、Transport Layer Security (TLS) プロトコルは、AWS CLI と AWS のサービス間の通信をセキュリティ保護する上で重要な役割を果たします。AWS のサービスと通信する際のセキュリティを強化するには、TLS 1.2 以降を使用する必要があります。

AWS CLI と AWS のサービスは、暗号化、認証、データ整合性を提供する TLS プロトコルを使用して、データを安全に交換できます。AWS CLI が TLS プロトコルを活用することで、AWS のサービス とのやり取りが不正アクセスやデータ侵害から保護され、AWS エコシステムのセキュリティ全体が強化されます。

AWS責任共有モデル は、AWS Command Line Interface でのデータ保護に適用されます。このモデルで説明されているように、AWS は、AWS のサービス のすべてを実行するグローバルインフラストラクチャを保護するがあります。お客様は、このインフラストラクチャでホストされているコンテンツに対する管理を維持する責任があります。また、使用する AWS のサービスのセキュリティ設定と管理タスクもユーザーの責任となります。データ保護の詳細については、「AWS CLI でのデータ保護」を参照してください。

AWS CLI バージョン 1 が TLS 1.2 より前の TLS バージョンを使用しないようにするには、この最小バージョンを適用するように OpenSSL を再コンパイルしてから、新しく構築された OpenSSL を使用するように Python を再コンパイルしなければならない場合があります。

現在サポートされているプロトコルの確認

まず、OpenSSL を使用して、テストサーバーと Python SDK に使用する自己署名証明書を作成します。

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

次に、OpenSSL を使用してテストサーバーをスピンアップします。

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

新しいターミナルウィンドウで仮想環境を作成し、SDK for Python をインストールします。

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

SDK の基になる HTTP ライブラリを使用する、check.py という名前の新しい Python スクリプトを作成します。

$ 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'))

新しいスクリプトを実行します。

$ python check.py

確立された接続に関する詳細が表示されます。出力で「Protocol:」を検索します。出力が「TLSv1.2」以降の場合、SDK のデフォルト設定は TLS v1.2 以降です。それ以前のバージョンの場合は、OpenSSL を再コンパイルして Python を再コンパイルする必要があります。

ただし、Python のインストールがデフォルトで TLS v1.2 以降に設定されている場合でも、サーバーが TLS v1.2 以降をサポートしていないと、Python は TLS v1.2 より前のバージョンに再ネゴシエートする可能性があります。Python が以前のバージョンに自動的に再ネゴシエートしないことを確認するには、次のようにしてテストサーバーを再起動します。

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

以前のバージョンの OpenSSL を使用している場合は、-no_tls_3 フラグが使用できない可能性があります。この場合は、使用している OpenSSL のバージョンが TLS v1.3 をサポートしていないため、フラグを削除します。次に、Python スクリプトを実行します。

$ python check.py

Python のインストールが TLS 1.2 より前のバージョンに対して正しく再ネゴシエートしない場合は、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)')))

接続を確立できる場合は、OpenSSL と Python を再コンパイルして、TLS v1.2 より前のプロトコルのネゴシエーションを無効にする必要があります。

OpenSSL と Python のコンパイル

SDK または AWS CLI が TLS 1.2 より前のバージョンをネゴシエートしないようにするには、OpenSSL と Python を再コンパイルする必要があります。これを行うには、次のコンテンツをコピーしてスクリプトを作成し、実行します。

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

これにより、静的にリンクされた OpenSSL を持つ Python のバージョンがコンパイルされます。このバージョンは、TLS 1.2 より前のバージョンは自動的にネゴシエートしません。また、/opt/openssl-with-min-tls1_2 ディレクトリに OpenSSL がインストールされ、/opt/python-with-min-tls1_2 ディレクトリに Python がインストールされます。このスクリプトを実行した後、新しいバージョンの Python のインストールを確認します。

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

これにより、以下が出力されます。

$ Python 3.8.1

この新しいバージョンの Python が TLS 1.2 より前のバージョンをネゴシエートしないことを確認するには、新しくインストールされた Python バージョン (つまり現在サポートされているプロトコルの確認) を使用する手順 /opt/python-with-min-tls1_2/bin/python3 を再実行します。