使用 Amazon Aurora PostgreSQL 实现高安全性 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Amazon Aurora PostgreSQL 实现高安全性

有关 Aurora 安全性的一般概述,请参阅 Amazon Aurora 中的安全性。您可以在几个不同级别管理 Amazon Aurora PostgreSQL 的安全性:

  • 要控制可对 Aurora PostgreSQL 数据库集群和数据库实例执行 Amazon RDS 管理操作的人员,请使用 Amazon Identity and Access Management (IAM)。IAM 在用户可以访问服务之前处理用户身份验证。它还处理授权,也就是说,是否允许用户执行他们想执行的操作。IAM 数据库身份验证是一种额外的身份验证方法,可以在创建 Aurora PostgreSQL 数据库集群时选择。有关更多信息,请参阅Amazon Aurora 的 Identity and Access Management

    如果您将 IAM 用于 Aurora PostgreSQL 数据库集群,请在打开 Amazon RDS 控制台 https://console.aws.amazon.com/rds/ 之前,先使用您的 IAM 凭据登录 Amazon Web Services Management Console。

  • 确保基于 Amazon VPC 服务在 Virtual Public Cloud (VPC) 中创建 Aurora 数据库集群。要控制哪些设备和 Amazon EC2 实例能够建立与 VPC 中 Aurora 数据库集群的数据库实例端点和端口的连接,请使用 VPC 安全组。您可以使用安全套接字层 (SSL) 建立这些端点和端口连接。此外,公司的防火墙规则也可以控制公司中运行的哪些设备可以建立与数据库实例的连接。有关 VPC 的更多信息,请参阅 Amazon VPC 和 Amazon Aurora

    支持的 VPC 租赁取决于 Aurora PostgreSQL 数据库集群使用的实例类。对于 default VPC 租赁,VPC 在共享硬件上运行。对于 dedicated VPC 租赁,VPC 在专用硬件实例上运行。可突增的性能数据库实例类仅支持原定设置 VPC 租赁。可突增的性能数据库实例类包括 db.t3 和 db.t4g 数据库实例类。所有其他 Aurora PostgreSQL 数据库实例类都支持原定设置和专用 VPC 租赁。

    有关实例类的更多信息,请参阅 Aurora 数据库实例类。有关 defaultdedicated VPC 租赁的更多信息,请参阅 Amazon Elastic Compute Cloud 用户指南 中的专用实例

  • 要为在 Amazon Aurora 数据库集群上运行的 PostgreSQL 数据库授予权限,可采用与独立 PostgreSQL 实例相同的通用方式。CREATE ROLEALTER ROLEGRANTREVOKE 等命令的作用与它们在本地数据库中的作用相同,就像直接修改数据库、架构和表一样。

    PostgreSQL 通过使用角色来管理权限。rds_superuser 角色是 Aurora PostgreSQL 数据库集群权限最高的角色。此角色是自动创建的,并授予创建数据库集群的用户(主用户账户,默认情况下是 postgres)。要了解更多信息,请参阅“了解 PostgreSQL 角色和权限”。

Aurora PostgreSQL 14.3 及更高版本支持对密码使用加盐质询响应身份验证机制 (SCRAM),作为消息摘要(MD5)的替代方案。我们建议您使用 SCRAM,因为它比 MD5 更安全。有关更多信息,包括如何将数据库用户密码从 MD5 迁移到 SCRAM,请参阅使用 SCRAM 进行 PostgreSQL 密码加密

利用 SSL/TLS 保护 Aurora PostgreSQL 数据

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

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

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

通过 SSL/TLS 连接到 Aurora PostgreSQL 数据库集群
  1. 下载证书。

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

  2. 将证书导入您的操作系统。

  3. 通过 SSL/TLS 连接到 Aurora PostgreSQL 数据库集群。

    使用 SSL/TLS 连接时,客户端可以选择是否验证证书链。如果连接参数指定 sslmode=verify-casslmode=verify-full,则客户端要求 RDS CA 证书位于其信任存储中或在连接 URL 中进行引用。此要求是为了验证签署您的数据库证书的证书链。

    当客户端(如 psql 或 JDBC)配置有 SSL/TLS 支持时,预设情况下,该客户端会首先尝试使用 SSL/TLS 连接到数据库。如果该客户端无法使用 SSL/TLS 进行连接,它将恢复为不使用 SSL/TLS 进行连接。基于 libpq 的客户端(例如 psql)和 JDBC 所使用的原定设置 sslmode 模式不同。基于 libpq 的客户端默认使用 prefer,而 JDBC 客户端默认使用 verify-full

    使用 sslrootcert 参数引用证书,例如,sslrootcert=rds-ssl-ca-cert.pem

下面是使用 psql 连接到 Aurora PostgreSQL 数据库集群的示例。

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

需要与 Aurora PostgreSQL 数据库集群建立 SSL/TLS 连接

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

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

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

$ psql postgres -h SOMEHOST.amazonaws.com -p 8192 -U someuser psql (9.3.12, server 9.4.4) WARNING: psql major version 9.3, server major version 9.4. Some psql features might not work. SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. postgres=>

确定 SSL/TLS 连接状态

当您连接到数据库集群后,登录横幅中将显示连接的加密状态。

Password for user master: psql (9.3.12) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help.   postgres=>

也可加载 sslinfo 扩展,然后调用 ssl_is_used() 函数以判断是否在使用 SSL/TLS。如果连接使用的是 SSL/TLS,则此函数将返回 t;否则返回 f

postgres=> create extension sslinfo; CREATE EXTENSION postgres=> select ssl_is_used(); ssl_is_used --------- t (1 row)

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

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

配置密码套件以连接到 Aurora PostgreSQL 数据库集群

通过使用可配置的密码套件,您可以更好地控制数据库连接的安全性。您可以指定想要允许安全客户端 SSL/TLS 与数据库连接的密码套件列表。使用可配置的密码套件,您现在可以控制数据库服务器接受的连接加密。这样做有助于防止使用不安全已或弃用的密码。

Aurora PostgreSQL 版本 11.8 及更高版本支持可配置的密码套件。

要指定加密连接的允许密码列表,请修改 ssl_ciphers 集群参数。使用 Amazon Web Services Management Console、Amazon CLI 或 RDS API 在集群参数组中设置 ssl_ciphers 参数。要设置集群参数,请参阅 修改数据库集群参数组中的参数

ssl_ciphers 参数设置为逗号分隔的密码值字符串。有效密码包括以下各项:

  • ECDHE-RSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES256-SHA

  • ECDHE-RSA-AES256-GCM-SHA384

您也可以使用 describe-engine-default-cluster-parameters CLI 命令来确定特定参数组系列当前支持哪些密码套件。以下示例展示如何获取 Aurora PostgreSQL 11 的 ssl_cipher 集群参数组允许的值。

aws rds describe-engine-default-cluster-parameters --db-parameter-group-family aurora-postgresql11 ...some output truncated... { "ParameterName": "ssl_ciphers", "Description": "Sets the list of allowed TLS ciphers to be used on secure connections.", "Source": "engine-default", "ApplyType": "dynamic", "DataType": "list", "AllowedValues": "ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-SHA384,AES256-SHA,AES128-SHA,DES-CBC3-SHA,ADH-DES-CBC3-SHA,EDH-RSA-DES-CBC3-SHA,EDH-DSS-DES-CBC3-SHA,ADH-AES256-SHA,DHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ADH-AES128-SHA,DHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,HIGH", "IsModifiable": true, "MinimumEngineVersion": "11.8", "SupportedEngineModes": [ "provisioned" ] }, ...some output truncated...

ssl_ciphers 参数没有默认的密码套件字符串。有关密码的更多信息,请参阅 PostgreSQL 文档中的 ssl_ciphers 变量。有关密码套件格式的更多信息,请参阅 OpenSSL 网站上的 openssl-ciphers list formatopenssl-ciphers string format 文档。