

# 使用 Amazon Aurora PostgreSQL 实现高安全性
<a name="AuroraPostgreSQL.Security"></a>

有关 Aurora 安全性的一般概述，请参阅 [Amazon Aurora 中的安全性](UsingWithRDS.md)。您可以在几个不同级别管理 Amazon Aurora PostgreSQL 的安全性：
+ 要控制可对 Aurora PostgreSQL 数据库集群和数据库实例执行 Amazon RDS 管理操作的人员，请使用 AWS Identity and Access Management (IAM)。IAM 在用户可以访问服务之前处理用户身份验证。它还处理授权，也就是说，是否允许用户执行他们想执行的操作。IAM 数据库身份验证是一种额外的身份验证方法，可以在创建 Aurora PostgreSQL 数据库集群时选择。有关更多信息，请参阅 [Amazon Aurora 的 Identity and Access Management](UsingWithRDS.IAM.md)。

  如果您将 IAM 用于 Aurora PostgreSQL 数据库集群，请在打开 Amazon RDS 控制台 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/) 之前，先使用您的 IAM 凭据登录 AWS 管理控制台。
+ 确保基于 Amazon VPC 服务在虚拟私有云（VPC）中创建 Aurora 数据库集群。要控制哪些设备和 Amazon EC2 实例能够建立与 VPC 中 Aurora 数据库集群的数据库实例端点和端口的连接，请使用 VPC 安全组。您可以使用安全套接字层 (SSL) 建立这些端点和端口连接。此外，公司的防火墙规则也可以控制公司中运行的哪些设备可以建立与数据库实例的连接。有关 VPC 的更多信息，请参阅 [Amazon VPC 和 Amazon Aurora](USER_VPC.md)。

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

  有关实例类的更多信息，请参阅 [Amazon Aurora数据库实例类](Concepts.DBInstanceClass.md)。有关 `default` 和 `dedicated` VPC 租赁的更多信息，请参阅 *Amazon Elastic Compute Cloud 用户指南* 中的[专用实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)。
+ 要为在 Amazon Aurora 数据库集群上运行的 PostgreSQL 数据库授予权限，可采用与独立 PostgreSQL 实例相同的通用方式。`CREATE ROLE`、`ALTER ROLE`、`GRANT` 和 `REVOKE` 等命令的作用与它们在本地数据库中的作用相同，就像直接修改数据库、架构和表一样。

  PostgreSQL 通过使用*角色*来管理权限。`rds_superuser` 角色是 Aurora PostgreSQL 数据库集群权限最高的角色。此角色是自动创建的，并授予创建数据库集群的用户（主用户账户，默认情况下是 `postgres`）。要了解更多信息，请参阅[了解 PostgreSQL 角色和权限](Appendix.PostgreSQL.CommonDBATasks.Roles.md)。

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

## 利用 SSL/TLS 保护 Aurora PostgreSQL 数据
<a name="AuroraPostgreSQL.Security.SSL"></a>

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 加密连接。我们在以下 Aurora PostgreSQL 版本中增加了对 TLSv1.3 的支持：
+ 15.3 及更高版本
+ 14.8 及更高的 14 版本
+ 13.11 及更高的 13 版本
+ 12.15 及更高的 12 版本
+ 11.20 及更高的 11 版本

有关 SSL/TLS 支持和 PostgreSQL 数据库的一般信息，请参阅 PostgreSQL 文档中的 [SSL 支持](https://www.postgresql.org/docs/current/libpq-ssl.html)。有关通过 JDBC 使用 SSL/TLS 连接的信息，请参阅 PostgreSQL 文档中的[配置客户端](https://jdbc.postgresql.org/documentation/head/ssl-client.html)。

**Topics**
+ [需要与 Aurora PostgreSQL 数据库集群建立 SSL/TLS 连接](#AuroraPostgreSQL.Security.SSL.Requiring)
+ [确定 SSL/TLS 连接状态](#AuroraPostgreSQL.Security.SSL.Status)
+ [配置密码套件以连接到 Aurora PostgreSQL 数据库集群](#AuroraPostgreSQL.Security.SSL.ConfiguringCipherSuites)

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

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

1. 下载证书。

   有关下载证书的信息，请参阅 [使用 SSL/TLS 加密与数据库集群的连接](UsingWithRDS.SSL.md)。

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

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

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

   当客户端（如 psql 或 JDBC）配置有 SSL/TLS 支持时，预设情况下，该客户端会首先尝试使用 SSL/TLS 连接到数据库。如果该客户端无法使用 SSL/TLS 进行连接，它将恢复为不使用 SSL/TLS 进行连接。原定设置情况下，适用于 JDBC 客户端和基于 libpq 的客户端的 `sslmode` 选项设置为 `prefer`。

   使用 `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 连接
<a name="AuroraPostgreSQL.Security.SSL.Requiring"></a>

要想要求使用 SSL/TLS 连接到 Aurora PostgreSQL 数据库集群，请使用 `rds.force_ssl` 参数。
+ 要想要求使用 SSL/TLS 连接，请将 `rds.force_ssl` 参数值设置为 1（开启）。
+ 要想不要求使用 SSL/TLS 连接，请将 `rds.force_ssl` 参数值设置为 0（关闭）。

此参数的默认值取决于 Aurora PostgreSQL 版本：
+ 对于 Aurora PostgreSQL 版本 17 及更高版本：默认值为 1（开启）。
+ 对于 Aurora PostgreSQL 版本 16 及较低版本：默认值为 0（关闭）。

**注意**  
当您从 Aurora PostgreSQL 版本 16 或更早版本执行主要版本升级，从而升级到版本 17 或更高版本时，参数的默认值将从 0（关闭）更改为 1（开启）。对于未配置 SSL 的应用程序，此更改可能会导致连接故障。您可以将此参数设置为 0（关闭），从而恢复到之前的默认行为。

有关处理参数的更多信息，请参阅 [Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

更新 `rds.force_ssl` 参数还会将 PostgreSQL `ssl` 参数设置为 1 (on) 并将数据库集群的 `pg_hba.conf` 文件修改为支持新的 SSL/TLS 配置。

当数据库集群的 `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 连接状态
<a name="AuroraPostgreSQL.Security.SSL.Status"></a>

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

```
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 文档中的[数据库连接控制函数](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLMODE)。

### 配置密码套件以连接到 Aurora PostgreSQL 数据库集群
<a name="AuroraPostgreSQL.Security.SSL.ConfiguringCipherSuites"></a>

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

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

要指定加密连接的允许密码列表，请修改 `ssl_ciphers` 集群参数。使用 AWS 管理控制台、AWS CLI 或 RDS API 在集群参数组中将 `ssl_ciphers` 参数设置为逗号分隔的密码值字符串。要设置集群参数，请参阅 [在 Amazon Aurora 中修改数据库集群参数组中的参数](USER_WorkingWithParamGroups.ModifyingCluster.md)。

下表显示了有效 Aurora PostgreSQL 引擎版本支持的密码。


| Aurora PostgreSQL 引擎版本 | 支持的密码 | TLS 1.1 | TLS 1.2 | TLS 1.3 | 
| --- | --- | --- | --- | --- | 
| 9.6、10.20 及更低版本、11.15 及更低版本、12.10 及更低版本、13.6 及更低版本 | 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-ECDSA-AES256-SHA ECDHE-ECDSA-AES256- GCM-SHA384 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128- GCM-SHA256 ECDHE-RSA-AES256-SHA ECDHE-RSA-AES256- GCM-SHA384 | 是 否 否 否 否 否 是 否 否 是 否 否 是 否 | 否 是 是 是 是 是 是 是 是 是 是 是 是 是 |  否 否 否 否 否 否 否 否 否 否 否 否 否 否  | 
| 10.21、11.16、12.11、13.7、14.3 和 14.4 |  ECDHE-RSA-AES128-SHATLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1CHACHA20\$1POLY1305\$1SHA256 | 是 否 是 否 是 否 是 否 否 是 否 是 否 | 是 是 是 是 是 是 是 是 是 是 是 是 是 | 否 否 否 否 否 否 否 否 否 否 否 否 否 | 
| 10.22、11.17、12.12、13.8、14.5 和 15.2 |  TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1CHACHA20\$1POLY1305\$1SHA256 |  是 否 否 是 否 是 否 否 是 否 否 是 否 是 是 否  | 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 | 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 | 
| 11.20、12.15、13.11、14.8、15.3、16.1 及更高版本 | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1CHACHA20\$1POLY1305\$1SHA256 TLS\$1AES\$1128\$1GCM\$1SHA256 TLS\$1AES\$1256\$1GCM\$1SHA384  | 是 否 否 是 否 是 否 否 是 否 否 是 否 是 是 否 否 否 | 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 否 否 |  否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 是 是  | 

您也可以使用 [describe-engine-default-cluster-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-engine-default-cluster-parameters.html) 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": "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,TLS_RSA_WITH_AES_256_GCM_SHA384,
		TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
		TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
		"IsModifiable": true,
		"MinimumEngineVersion": "11.8",
		"SupportedEngineModes": [
			"provisioned"
		]
	},
    ...some output truncated...
```

`ssl_ciphers` 参数原定设置为所有允许的密码套件。有关密码的更多信息，请参阅 PostgreSQL 文档中的 [ssl\$1ciphers](https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-SSL-CIPHERS) 变量。