強制執行 TLS的 最低版本 AWS CLI - AWS Command Line Interface

本文件 AWS CLI 僅適用於 的第 1 版。如需與 第 2 版相關的文件 AWS CLI,請參閱 第 2 版使用者指南

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

強制執行 TLS的 最低版本 AWS CLI

使用 AWS Command Line Interface () 時AWS CLI,Transport Layer Security (TLS) 通訊協定在保護 AWS CLI 和 之間的通訊方面扮演重要角色 AWS 服務。若要在與服務通訊時增加安全性 AWS ,您應該使用 TLS 1.2 或更新版本。

AWS CLI 和 AWS 服務 可以透過提供加密、身分驗證和資料完整性的TLS通訊協定安全地交換資料。透過利用TLS通訊協定, 可確保您與 AWS CLI 的互動 AWS 服務 不受未經授權的存取和資料洩露影響,進而增強 AWS 生態系統的整體安全性。

AWS 共同責任模型適用於 中的資料保護 AWS Command Line Interface。如此模型所述, AWS 負責保護執行所有 的全域基礎設施 AWS 服務。您負責維護在此基礎設施上託管內容的控制權。您也必須負責 AWS 服務 使用 的安全組態和管理任務。如需資料保護的詳細資訊,請參閱 中的資料保護 AWS CLI

為了確保 AWS CLI 版本 1 沒有使用早於 TLS 1.2 的TLS版本,您可能需要重新編譯 OpenSSL 以強制執行此最小值,然後重新編譯 Python 以使用新建置的 Open SSL。

判定目前支援的通訊協定

首先,SDK使用 Open 建立自我簽署憑證,用於測試伺服器和 PythonSSL。

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

然後使用 Open 啟動測試伺服器SSL。

$ 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

建立名為 的新 Python 指令碼check.py,使用 SDK的基礎HTTP程式庫。

$ 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 仍然可以重新交涉至 v1.2 或更新版本之前的TLS版本。若要確保 Python 不會自動與較早版本重新交涉,請使用以下命令重新啟動測試伺服器。

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

如果您使用的是舊版的 Open SSL,則可能沒有可用的-no_tls_3旗標。如果發生這種情況,請移除旗標,因為您使用的 OpenSSL 版本不支援 TLS v1.3。然後執行 Python 指令碼。

$ python check.py

如果您的 Python 正確安裝未針對 1.2 TLS 之前的版本重新交涉,您應該會收到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,以停用 v1TLS.2 之前的通訊協定交涉。

編譯 OpenSSL 和 Python

為了確保 SDK或 AWS CLI 不會針對 1.2 TLS 之前的任何內容進行交涉,您需要重新編譯 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 版本,該 Open 不會自動交涉早於 1.2 TLS 的任何內容。這也會在 /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 未交涉比 1.2 TLS 更早的版本,請重新執行判定目前支援的通訊協定使用新安裝的 Python 版本 (即 /opt/python-with-min-tls1_2/bin/python3) 的步驟。