本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 SSL 與 PostgreSQL 資料庫執行個體搭配使用
對於 PostgreSQL 資料庫執行個體,Amazon RDS 支援 Secure Sockets Layer (SSL) 加密。您可以使用 SSL 將應用程式與 PostgreSQL 資料庫執行個體之間的 PostgreSQL 連線加密。依預設,RDS for PostgreSQL 使用並期望所有用戶端皆使用 SSL/TLS 進行連線,但您也可加以要求。RDS for PostgreSQL 支援 Transport Layer Security (TLS) 1.1、1.2 和 1.3 版。
如需 SSL 支援和 PostgreSQL 資料庫的一般資訊,請參閱 PostgreSQL 文件中的 SSL 支援
SSL 支援適用於所有 PostgreSQL 的 AWS 區域。建立執行個體時,Amazon RDS 會為 PostgreSQL 資料庫執行個體建立 SSL 憑證。如果您啟用 SSL 憑證驗證,則 SSL 憑證會包含資料庫執行個體端點做為 SSL 憑證的一般名稱 (CN),以防止詐騙攻擊。
主題
透過 SSL 連接至 PostgreSQL 資料庫執行個體
透過 SSL 連接至 PostgreSQL 資料庫執行個體
-
下載憑證。
如需有關下載憑證的詳細資訊,請參閱使用 SSL/TLS 加密與資料庫執行個體或叢集的連線。
-
透過 SSL 連接至 PostgreSQL 資料庫執行個體。
當您使用 SSL 來連線時,用戶端可以選擇是否驗證憑證鏈。如果您的連線參數指定
sslmode=verify-ca或sslmode=verify-full,則用戶端在信任存放區必須有 RDS CA 憑證,或在連線 URL 中必須參考這些憑證。此需求是為了驗證用於簽署資料庫憑證的憑證鏈。當用戶端 (例如 psql 或 JDBC) 設有 SSL 支援時,依預設,用戶端會先嘗試以 SSL 連線至資料庫。如果用戶端無法以 SSL 連線,則回復為不以 SSL 來連線。以 libpq 為基礎的用戶端 (例如 psql) 和 JDBC 使用的預設
sslmode模式不同。以 libpq 為基礎的用戶端和 JDBC 用戶端預設為prefer。使用
sslrootcert參數來參考憑證,例如sslrootcert=rds-ssl-ca-cert.pem。
下列是使用 psql 連線至使用具認證驗證 SSL 之 PostgreSQL 資料庫執行個體的範例。
$ psql "host=db-name.555555555555.ap-southeast-1.rds.amazonaws.com
port=5432 dbname=testDB user=testuser sslrootcert=rds-ca-rsa2048-g1.pem sslmode=verify-full"
需要以 SSL 連線至 PostgreSQL 資料庫執行個體
您可以使用 rds.force_ssl 參數來要求對 PostgreSQL 資料庫執行個體的連線使用 SSL。RDS for PostgreSQL 第 15 版和更新版本的 rds.force_ssl 參數預設值為 1 (開啟)。至於其他所有 RDS for PostgreSQL 主要版本 14 和較舊版本,此參數的預設值皆為 0 (關閉)。您可以將 rds.force_ssl 參數設為 1 (開啟),以要求使用 SSL/TLS 連線至資料庫叢集。您可以將 rds.force_ssl 參數設為 1 (開啟),以要求對資料庫執行個體的連線使用 SSL。
如要變更此參數值,您需要建立自訂資料庫參數群組。然後,您可變更您自訂資料庫參數群組中的 rds.force_ssl 值為 1,以開啟此功能。若於建立 RDS for PostgreSQL 資料庫執行個體之前準備了自訂資料庫參數群組,則可於建立程序期間加以選擇 (而非預設參數群組)。若您於 RDS for PostgreSQL 資料庫執行個體已執行之後進行此作業,則需要重新啟動執行個體,如此您的執行個體便可使用自訂參數群組。如需詳細資訊,請參閱Amazon RDS 的參數群組。
當 rds.force_ssl 功能在資料庫執行個體上處於活動狀態時,未使用 SSL 的連線嘗試將遭到拒絕,並顯示下列訊息:
$ psql -h db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser
psql: error: FATAL: no pg_hba.conf entry for host "w.x.y.z", user "testuser", database "testDB", SSL off
判斷 SSL 連線狀態
當您連接至資料庫執行個體時,登入橫幅中會顯示連線的加密狀態:
Password for user master:
psql (10.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
postgres=>
您也可以載入 sslinfo 延伸,然後呼叫 ssl_is_used() 函數,以判斷是否正在使用 SSL。如果連線正在使用 SSL,此函數會傳回 t,否則傳回 f。
postgres=>CREATE EXTENSION sslinfo;CREATE EXTENSIONpostgres=>SELECT ssl_is_used();ssl_is_used --------- t (1 row)
如需更多詳細資訊,您可使用下列查詢,從 pg_settings 取得資訊:
SELECT name as "Parameter name", setting as value, short_desc FROM pg_settings WHERE name LIKE '%ssl%';Parameter name | value | short_desc ----------------------------------------+-----------------------------------------+------------------------------------------------------- ssl | on | Enables SSL connections. ssl_ca_file | /rdsdbdata/rds-metadata/ca-cert.pem | Location of the SSL certificate authority file. ssl_cert_file | /rdsdbdata/rds-metadata/server-cert.pem | Location of the SSL server certificate file. ssl_ciphers | HIGH:!aNULL:!3DES | Sets the list of allowed SSL ciphers. ssl_crl_file | | Location of the SSL certificate revocation list file. ssl_dh_params_file | | Location of the SSL DH parameters file. ssl_ecdh_curve | prime256v1 | Sets the curve to use for ECDH. ssl_key_file | /rdsdbdata/rds-metadata/server-key.pem | Location of the SSL server private key file. ssl_library | OpenSSL | Name of the SSL library. ssl_max_protocol_version | | Sets the maximum SSL/TLS protocol version to use. ssl_min_protocol_version | TLSv1.2 | Sets the minimum SSL/TLS protocol version to use. ssl_passphrase_command | | Command to obtain passphrases for SSL. ssl_passphrase_command_supports_reload | off | Also use ssl_passphrase_command during server reload. ssl_prefer_server_ciphers | on | Give priority to server ciphersuite order. (14 rows)
您還可使用下列查詢,依程序、用戶端和應用程式收集有關 RDS for PostgreSQL 資料庫執行個體之 SSL 使用情況的所有資訊:
SELECT datname as "Database name", usename as "User name", ssl, client_addr, application_name, backend_type FROM pg_stat_ssl JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid ORDER BY ssl;Database name | User name | ssl | client_addr | application_name | backend_type ---------------+-----------+-----+----------------+------------------------+------------------------------ | | f | | | autovacuum launcher | rdsadmin | f | | | logical replication launcher | | f | | | background writer | | f | | | checkpointer | | f | | | walwriter rdsadmin | rdsadmin | t | 127.0.0.1 | | client backend rdsadmin | rdsadmin | t | 127.0.0.1 | PostgreSQL JDBC Driver | client backend postgres | postgres | t | 204.246.162.36 | psql | client backend (8 rows)
如要識別用於 SSL 連線的密碼,可依如下方式查詢:
postgres=>SELECT ssl_cipher();ssl_cipher -------------------- DHE-RSA-AES256-SHA (1 row)
若要進一步了解 sslmode,請參閱 PostgreSQL 文件中的資料庫連線控制函數
RDS for PostgreSQL 中的 SSL 密碼套件
PostgreSQL 組態參數 ssl_cipher
在 RDS for PostgreSQL 16 和更新版本中,您可以修改 ssl_ciphers 參數,以使用列入允許清單的密碼套件中的特定值。這是動態參數,不需要將資料庫執行個體重新開機。若要檢視列入允許清單的密碼套件,請使用 Amazon RDS 主控台或下列 CLI AWS
命令:
aws rds describe-db-parameters --db-parameter-group-name<your-parameter-group>--region<region>--endpoint-url<endpoint-url>--output json | jq '.Parameters[] | select(.ParameterName == "ssl_ciphers")'
下表列出支援自訂組態的版本允許的密碼套件和預設密碼套件。
| PostgreSQL 引擎版本 | 預設 ssl_cipher 套件值 | 列入允許清單的自訂 ssl_cipher 套件值 |
|---|---|---|
| 18 | HIGH:!aNULL:!3DES |
|
| 17 | HIGH:!aNULL:!3DES |
|
| 16 | HIGH:!aNULL:!3DES |
|
| 15 | HIGH:!aNULL:!3DES |
不支援自訂 ssl_ciphers |
| 14 | HIGH:!aNULL:!3DES |
不支援自訂 ssl_ciphers |
| 13 | HIGH:!aNULL:!3DES |
不支援自訂 ssl_ciphers |
| 12 | HIGH:!aNULL:!3DES |
不支援自訂 ssl_ciphers |
| 11.4 及更高次要版本 | HIGH:MEDIUM:+3DES:!aNULL:!RC4 |
不支援自訂 ssl_ciphers |
| 11.1、11.2 | HIGH:MEDIUM:+3DES:!aNULL |
不支援自訂 ssl_ciphers |
| 10.9 及更高次要版本 | HIGH:MEDIUM:+3DES:!aNULL:!RC4 |
不支援自訂 ssl_ciphers |
| 10.7 及較低次要版本 | HIGH:MEDIUM:+3DES:!aNULL |
不支援自訂 ssl_ciphers |
若要將所有執行個體連線設定為使用 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 加密套件,請修改參數群組,如下列範例所示:
aws rds modify-db-parameter-group --db-parameter-group-name<your-parameter-group>--parameters "ParameterName='ssl_ciphers',ParameterValue='TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',ApplyMethod=immediate"
此範例使用 ECDSA 密碼,因此您的執行個體必須使用具有橢圓曲線密碼編譯 (ECC) 的憑證授權機構來建立連線。若要了解 Amazon RDS 提供了哪些憑證授權機構,請參閱憑證授權機構。
您可以透過判斷 SSL 連線狀態中所述的方法,來驗證使用中的密碼。
密碼可能隨著內容而有不同的名稱:
-
您可以在參數群組中設定的允許密碼,會以其 IANA 名稱來指稱。
-
sslinfo和psql登入橫幅是指使用其 OpenSSL 名稱的密碼。
根據預設,RDS for PostgreSQL 16 和更新版本中的 ssl_max_protocol_version 值為 TLS v1.3。您必須將此參數的值設定為 TLS v1.2,因為 TLS v1.3 不使用 ssl_ciphers 參數中指定的密碼組態。該值設定為 TLS v1.2 時,連線只會使用您在 ssl_ciphers 中定義的密碼。
aws rds modify-db-parameter-group --db-parameter-group-name<your-parameter-group>--parameters "ParameterName='ssl_max_protocol_version',ParameterValue='TLSv1.2',ApplyMethod=immediate"
若要確保資料庫連線會使用 SSL,請在參數群組中將 rds.force_ssl
parameter 設定為 1。如需參數和參數群組的詳細資訊,請參閱 Amazon RDS 的參數群組。