將 SSL 與 PostgreSQL 資料庫執行個體搭配使用 - Amazon Relational Database Service

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

將 SSL 與 PostgreSQL 資料庫執行個體搭配使用

對於 PostgreSQL 資料庫執行個體,Amazon RDS 支援 Secure Sockets Layer (SSL) 加密。您可以使用 SSL 將應用程式與 PostgreSQL 資料庫執行個體之間的 PostgreSQL 連線加密。依預設,RDS for PostgreSQL 使用並期望所有用戶端皆使用 SSL/TLS 進行連線,但您也可加以要求。RDS 版支 PostgreSQL 輸層安全性 (TLS) 1.1、1.2 和 1.3 版。

如需 SSL 支援和 PostgreSQL 資料庫的一般資訊,請參閱 PostgreSQL 文件中的 SSL 支援。如需透過 JDBC 使用 SSL 連線的資訊,請參閱 PostgreSQL 文件中的設定用戶端

所有 AWS 區域均提供 PostgreSQL。建立執行個體時,Amazon RDS 會為 PostgreSQL 資料庫執行個體建立 SSL 憑證。如果您啟用 SSL 憑證驗證,則 SSL 憑證會包含資料庫執行個體端點做為 SSL 憑證的一般名稱 (CN),以防止詐騙攻擊。

透過 SSL 連接至 PostgreSQL 資料庫執行個體

透過 SSL 連接至 PostgreSQL 資料庫執行個體
  1. 下載憑證。

    如需有關下載憑證的詳細資訊,請參閱

  2. 透過 SSL 連接至 PostgreSQL 資料庫執行個體。

    當您使用 SSL 來連線時,用戶端可以選擇是否驗證憑證鏈。如果您的連線參數指定 sslmode=verify-casslmode=verify-full,則用戶端在信任存放區必須有 RDS CA 憑證,或在連線 URL 中必須參考這些憑證。此需求是為了驗證用於簽署資料庫憑證的憑證鏈。

    當用戶端 (例如 psql 或 JDBC) 設有 SSL 支援時,依預設,用戶端會先嘗試以 SSL 連線至資料庫。如果用戶端無法以 SSL 連線,則回復為不以 SSL 來連線。以 libpq 為基礎的用戶端 (例如 psql) 和 JDBC 使用的預設 sslmode 模式不同。以 libpq 為基礎的用戶端預設使用 prefer,而 JDBC 用戶端預設使用 verify-full

    使用 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 版本 15 及更新版本,rds.force_ssl參數預設值為 1 (開啟)。對於所有其他 RDS 主 PostgreSQL 本 14 及以上版本,此參數的預設值為 0 (關閉)。您可以將 rds.force_ssl 參數設為 1 (開啟),以要求使用 SSL/TLS 連線至資料庫叢集。您可以將 rds.force_ssl 參數設為 1 (開啟),以要求對資料庫執行個體的連線使用 SSL。

如要變更此參數值,您需要建立自訂資料庫參數群組。然後,您可變更您自訂資料庫參數群組中的 rds.force_ssl 值為 1,以開啟此功能。若於建立 RDS for PostgreSQL 資料庫執行個體之前準備了自訂資料庫參數群組,則可於建立程序期間加以選擇 (而非預設參數群組)。若您於 RDS for PostgreSQL 資料庫執行個體已執行之後進行此作業,則需要重新啟動執行個體,如此您的執行個體便可使用自訂參數群組。如需詳細資訊,請參閱 使用參數群組

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 EXTENSION postgres=> 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 指定 SSL 連線允許的密碼套件類別。下表列出 RDS for PostgreSQL 中使用的預設密碼套件。

PostgreSQL 引擎版本 密碼套件
16 HIGH:!aNULL:!3DES
15 HIGH:!aNULL:!3DES
14 HIGH:!aNULL:!3DES
13 HIGH:!aNULL:!3DES
12 HIGH:!aNULL:!3DES
11.4 及更高次要版本 HIGH:MEDIUM:+3DES:!aNULL:!RC4
11.1、11.2 HIGH:MEDIUM:+3DES:!aNULL
10.9 及更高次要版本 HIGH:MEDIUM:+3DES:!aNULL:!RC4
10.7 及較低次要版本 HIGH:MEDIUM:+3DES:!aNULL