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

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

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

Amazon RDS for PostgreSQL 支持传输层安全性 (TLS) 1.1 和 1.2 版。Amazon RDS 不强制执行 TLS 连接,因此必须从应用程序中强制执行连接。

有关 SSL 支持和 PostgreSQL 数据库的一般信息,请参阅 PostgreSQL 文档中的 SSL 支持。有关通过 JDBC 使用 SSL 连接的信息,请参阅 PostgreSQL 文档中的配置客户端

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

通过 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.cdhmuqifdpib.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 文档中的数据库连接控制函数