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

将 SSL 与 PostgreSQL 数据库实例结合使用

Amazon RDS 支持对 PostgreSQL 数据库实例进行安全套接字层 (SSL) 加密。使用 SSL 可加密应用程序与 PostgreSQL 数据库实例之间的 PostgreSQL 连接。您还可强制至 PostgreSQL 数据库实例的所有连接使用 SSL。RDS for PostgreSQL 支持传输层安全性 (TLS) 版本 1.1 和 1.2。

有关 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. 将证书导入您的操作系统。

    有关导入证书的示例脚本,请参阅 将证书导入信任存储的示例脚本

  3. 通过 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 数据库实例的示例。

$ psql -h testpg.555555555555.us-east-1.rds.amazonaws.com -p 5432 \ "dbname=testpg user=testuser sslrootcert=rds-ca-2019-root.pem sslmode=verify-full"

需要至 PostgreSQL 数据库实例的 SSL 连接

您可以使用 rds.force_ssl 参数要求至 PostgreSQL 数据库实例的连接使用 SSL。默认情况下,rds.force_ssl 参数设置为 0 (off)。您可将 rds.force_ssl 参数设置为 1 (on) 以要求至数据库实例的 SSL 连接。更新 rds.force_ssl 参数还会将 PostgreSQL ssl 参数设置为 1(打开)并将数据库实例的 pg_hba.conf 文件修改为支持新的 SSL 配置。

您可通过更新数据库实例的参数组来设置 rds.force_ssl 参数值。如果数据库实例的参数组不是默认参数组,而 ssl 参数在您将 rds.force_ssl 参数设置为 1 时已设置为 1,则您无需重新启动数据库实例。否则您必须重新启动数据库实例,更改才会生效。有关参数组的更多信息,请参阅 使用参数组

当数据库实例的 rds.force_ssl 参数设置为 1 时,您将在连接时看到类似以下的输出,指示现在需要 SSL:

$ psql postgres -h SOMEHOST.amazonaws.com -p 8192 -U someuser . . . SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. postgres=>

确定 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)

您可以使用 select ssl_cipher() 命令确定 SSL 密码:

postgres=> select ssl_cipher(); ssl_cipher -------------------- DHE-RSA-AES256-SHA (1 row)

如果您启用 set rds.force_ssl 并重新启动实例,则将拒绝非 SSL 连接并返回以下消息:

$ export PGSSLMODE=disable $ psql postgres -h SOMEHOST.amazonaws.com -p 8192 -U someuser psql: FATAL: no pg_hba.conf entry for host "host.ip", user "someuser", database "postgres", SSL off $

有关 sslmode 选项的信息,请参阅 PostgreSQL 文档中的数据库连接控制函数

RDS for PostgreSQL 中的 SSL 密码套件

PostgreSQL 配置参数 ssl_ciphers 指定 SSL 连接允许的密码套件的类别。下表列出了 RDS for PostgreSQL 中使用的默认密码套件。

PostgreSQL 引擎版本 密码套件
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