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

使用 Amazon Aurora PostgreSQL 实现高安全性

Amazon Aurora PostgreSQL 的安全性在三个级别上进行管理:

  • 要控制可对 Aurora PostgreSQL 数据库集群和数据库实例执行 Amazon RDS 管理操作的人员,请使用 Amazon Identity and Access Management (IAM)。使用 IAM 凭证连接到Amazon时,您的Amazon账户必须具有授予执行 Amazon RDS 管理操作所需的权限的 IAM 策略。有关更多信息,请参阅 Amazon Aurora 中的 Identity and Access Management

    如果要使用 IAM 访问 Amazon RDS 控制台,请确保首先使用您的 IAM 用户凭证登录 Amazon Web Services Management Console。然后通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

    CREATE ROLEALTER ROLEGRANTREVOKE 等命令的作用与它们在本地数据库中的作用相同,就像直接修改数据库架构表一样。有关更多信息,请参阅 PostgreSQL 文档中的客户端身份验证

    注意

    在 Aurora PostgreSQL 中不支持加盐质询响应身份验证机制 (SCRAM)。

注意

有关更多信息,请参阅“Amazon Aurora 中的安全性”。

当您创建 Amazon Aurora PostgreSQL 数据库实例时,主用户有以下默认权限:

  • LOGIN

  • NOSUPERUSER

  • INHERIT

  • CREATEDB

  • CREATEROLE

  • NOREPLICATION

  • VALID UNTIL 'infinity'

要为每个数据库集群提供管理服务,需要在创建数据库集群时创建 rdsadmin 用户。如果试图删掉、重命名、修改密码,或者修改 rdsadmin 账户的权限,会导致出错。

限制密码管理

您可以限制只有特殊角色的用户才能够管理数据用户密码。通过这样做,您可以在客户端更好地控制密码管理。

您可以通过静态参数 rds.restrict_password_commands 并使用名为 rds_password 的角色来启用受限制的密码管理。当参数 rds.restrict_password_commands 设置为 1 时,只有是 rds_password 角色成员的用户可以运行特定 SQL 命令。受限制的 SQL 命令包括修改数据库用户密码以及修改密码到期时间的命令。

要使用受限制的密码管理,PostgreSQL 10.6 或更高版本的,数据库集群必须运行 Amazon Aurora。由于 rds.restrict_password_commands 参数是静态参数,更改此参数后需要重新启动数据库。

在数据库启用了受限制的密码管理后,如果您尝试运行受限制 SQL 命令,则会收到以下错误:ERROR: must be a member of rds_password to alter passwords (错误:必须是 rds_password 成员才能变更密码)

以下是启用了受限制的密码管理时的一些受限制 SQL 命令示例。

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

一些包含 ALTER ROLERENAME TO 命令也会受限制。因为重命名具有 MD5 密码的 PostgreSQL 角色会清除密码,因此这些命令会受限制。

默认情况下,rds_superuser 角色具有 rds_password 角色的成员资格,并且无法更改。您可以使用 rds_password SQL 命令向其他角色提供 GRANT 角色的成员资格。我们建议您仅将 rds_password 的成员资格提供给少数几个仅用于密码管理的角色。这些角色需要 CREATEROLE 属性以修改其角色。

请确保您验证了密码要求,例如客户端上的过期时间以及所需的复杂性。我们建议您使用自己的客户端实用程序来限制与密码相关的更改。此实用程序应具有作为 rds_password 成员的角色并具有 CREATEROLE 角色属性。

利用 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 参数设置为逗号分隔的密码值字符串。有效密码包括以下各项:

  • DHE-RSA-AES128-SHA

  • DHE-RSA-AES128-SHA256

  • DHE-RSA-AES128-GCM-SHA256

  • DHE-RSA-AES256-SHA

  • DHE-RSA-AES256-SHA256

  • DHE-RSA-AES256-GCM-SHA384

  • ECDHE-RSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES256-SHA

  • ECDHE-RSA-AES256-SHA384

  • 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 文档。