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

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

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

針對 AWS CLI 強制執行 TLS 最低版本

使用 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 以使用新建立的 OpenSSL。

判定目前支援的通訊協定

首先,使用 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

在新的終端機視窗中,建立虛擬環境並安裝適用於 Python 的開發套件。

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

建立一個名為 check.py 的 Python 指令碼,此指令碼使用 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 仍然可能必須與 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

這樣會編譯一個 Python 版本,內含不會自動與 TLS 1.2 之前任何版本交涉的靜態連結 OpenSSL。這也會在 /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) 重新執行 判定目前支援的通訊協定 的步驟。