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

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

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

Amazon RDS支援 PostgreSQL 資料庫執行個體的安全通訊端層 (SSL) 加密。您可以使用 SSL加密應用程式與 PostgreSQL 資料庫執行個體之間的 PostgreSQL 連線。根據預設,RDS對於 PostgreSQL, 會使用 並預期所有用戶端都會使用 SSL/ 進行連線TLS,但您也可以要求它。RDS for PostgreSQL 支援 Transport Layer Security (TLS) 1.1、1.2 和 1.3 版。

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

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

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

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

    如需有關下載憑證的詳細資訊,請參閱使用 SSL/TLS 加密與資料庫執行個體或叢集的連線

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

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

    當 psql 或 等用戶端JDBC設定為SSL支援時,用戶端會SSL先嘗試使用 連線到資料庫。如果用戶端無法與 連線SSL,則會還原為沒有 的連線SSL。使用的預設sslmode模式在 libpq 型用戶端 (例如 psql) 和 之間不同JDBC。以 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 資料庫執行個體

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

如要變更此參數值,您需要建立自訂資料庫參數群組。然後,您可變更您自訂資料庫參數群組中的 rds.force_ssl 值為 1,以開啟此功能。如果您在建立 RDS for PostgreSQL 資料庫執行個體之前準備自訂資料庫參數群組,您可以在建立過程中選擇它 (而非預設參數群組)。如果您在 RDS for PostgreSQL 資料庫執行個體已執行之後執行此操作,則需要重新啟動執行個體,以便執行個體使用自訂參數群組。如需詳細資訊,請參閱 的參數組 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是否正在使用中。t 如果連線使用 ,則函數會傳回 SSL,否則會傳回 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 文件 中的資料庫連線控制函數

SSL RDS for Postgre 中的密碼套件SQL

PostgreSQL 組態參數 ssl_ciphers 會指定允許SSL連線的密碼套件類別。下表列出RDS用於 Postgre 的預設密碼套件SQL。

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