将 SSL 与 PostgreSQL 数据库实例结合使用 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 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 支持。有关通过 JDBC 使用 SSL 连接的信息,请参阅 PostgreSQL 文档中的配置客户端

所有Amazon区域均支持对 PostgreSQL 使用 SSL。在创建数据库实例时,Amazon RDS 会为 PostgreSQL 数据库实例创建一个 SSL 证书。如果启用 SSL 证书验证,SSL 证书会将数据库实例终端节点作为 SSL 证书的公用名 (CN) 包含在内以防止欺诈攻击。

通过 SSL 连接到 PostgreSQL 数据库实例

通过 SSL 连接到 PostgreSQL 数据库实例
  1. 下载证书。

    有关下载证书的信息,请参阅 使用 SSL/TLS 加密与数据库实例或集群的连接

  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 连接到 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 指定 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