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

使用 Amazon Aurora PostgreSQL 实现高安全性

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

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

    如果要使用 IAM 访问 Amazon RDS 控制台,必须先使用您的 IAM 用户凭证登录 AWS 管理控制台。然后转至 https://console.amazonaws.cn/rds/ 上的 Amazon RDS 控制台。

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

    Aurora PostgreSQL 仅支持带默认 VPC 的 db.r4 和 db.t3 实例类。对于默认 VPC 租赁,VPC 在共享硬件上运行。对于专用 VPC 租赁,VPC 在专用硬件实例上运行。有关实例类的更多信息,请参阅数据库实例类。有关默认和专用 VPC 租赁的更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的专用实例

  • 要为 Amazon Aurora 数据库集群的登录名和权限进行身份验证,可采用与独立 PostgreSQL 实例相同的方式。

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

    注意

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

当您创建 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;

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

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

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

利用 SSL 保护 Aurora PostgreSQL 数据

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

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

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

通过 SSL 连接到 Aurora PostgreSQL 数据库集群

  1. 下载证书。

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

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

  3. 通过 SSL 连接到 Aurora 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 连接到 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 连接

您可以使用 rds.force_ssl 参数要求至 Aurora PostgreSQL 数据库集群的连接使用 SSL。默认情况下,rds.force_ssl 参数设置为 0 (off)。您可将 rds.force_ssl 参数设置为 1(开)以要求使用 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 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 连接状态

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

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。如果连接使用的是 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 文档中的数据库连接控制函数