将 SSL 与 PostgreSQL 数据库实例结合使用
Amazon RDS 支持对 PostgreSQL 数据库实例进行安全套接字层 (SSL) 加密。使用 SSL 可加密应用程序与 PostgreSQL 数据库实例之间的 PostgreSQL 连接。默认情况下,RDS for PostgreSQL 使用并期望所有客户端使用 SSL/TLS 进行连接,但您也可以要求它这样做。RDS for PostgreSQL 支持传输层安全性协议(TLS)版本 1.1、1.2 和 1.3。
有关 SSL 支持和 PostgreSQL 数据库的一般信息,请参阅 PostgreSQL 文档中的 SSL 支持
所有AWS区域均支持对 PostgreSQL 使用 SSL。在创建数据库实例时,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 的客户端默认使用prefer
,而 JDBC 客户端默认使用verify-full
。使用
sslrootcert
参数引用证书,例如,sslrootcert=rds-ssl-ca-cert.pem
。
以下是使用 psql
连接到 PostgreSQL 数据库实例的示例,该数据库实例使用 SSL 及证书验证。
$
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"
需要至 PostgreSQL 数据库实例的 SSL 连接
您可以使用 rds.force_ssl
参数要求至 PostgreSQL 数据库实例的连接使用 SSL。对于 RDS for PostgreSQL 版本 15 及更高版本,rds.force_ssl
参数默认值为 1(开启)。对于所有其它 RDS for PostgreSQL 主要版本 14 及更早版本,此参数的默认值均为 0(关闭)。您可将 rds.force_ssl
参数设置为 1 (on) 以要求使用 SSL/TLS 连接到数据库集群。您可将 rds.force_ssl
参数设置为 1 (on) 以要求至数据库实例的 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 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_ciphers
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 |