

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

Amazon Aurora MySQL 的安全性在三个级别上进行管理：
+ 要控制可对 Aurora MySQL 数据库集群和数据库实例执行 Amazon RDS 管理操作的人员，请使用 AWS Identity and Access Management (IAM)。使用 IAM 凭证连接到AWS时，您的AWS账户必须具有授予执行 Amazon RDS 管理操作所需的权限的 IAM 策略。有关更多信息，请参阅 [Amazon Aurora 的 Identity and Access Management](UsingWithRDS.IAM.md)。

  如果要使用 IAM 访问 Amazon RDS 控制台，请确保首先使用您的 IAM 用户凭证登录 AWS 管理控制台。然后通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。
+ 确保基于 Amazon VPC 服务在 Virtual Public Cloud (VPC) 中创建 Aurora MySQL 数据库集群。要控制哪些设备和 Amazon EC2 实例能够建立与 VPC 中 Aurora MySQL 数据库集群的数据库实例的端点和端口的连接，请使用 VPC 安全组。您可以使用传输层安全性协议（TLS）建立这些端点和端口连接。此外，公司的防火墙规则也可以控制公司中运行的哪些设备可以建立与数据库实例的连接。有关 VPC 的更多信息，请参阅 [Amazon VPC 和 Amazon Aurora](USER_VPC.md)。

  支持的 VPC 租赁取决于 Aurora MySQL 数据库集群使用的数据库实例类。对于 `default` VPC 租赁，VPC 在共享硬件上运行。对于 `dedicated` VPC 租赁，VPC 在专用硬件实例上运行。可突增的性能数据库实例类仅支持默认 VPC 租赁。可突增的性能数据库实例类包括 db.t2、db.t3 和 db.t4g 数据库实例类。所有其他 Aurora MySQL 数据库实例类都支持默认和专用 VPC 租赁。
**注意**  
建议仅将 T 数据库实例类用于开发和测试服务器，或其他非生产服务器。有关 T 实例类的更多详细信息，请参阅[使用 T 实例类进行开发和测试](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)。

  有关实例类的更多信息，请参阅 [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 MySQL 数据库集群的登录信息和权限进行身份验证，可单独或组合采用以下各种方式：
  + 您可采用与独立 MySQL 实例相同的方式。

    `CREATE USER`、`RENAME USER`、`GRANT`、`REVOKE` 和 `SET PASSWORD` 等命令的作用与它们在本地数据库中的作用相同，就像直接修改数据库架构表。有关更多信息，请参阅 MySQL 文档中的[访问控制和账户管理](https://dev.mysql.com/doc/refman/8.0/en/access-control.html)。
  + 您还可以使用 IAM 数据库身份验证。

    如果采用 IAM 数据库身份验证方式，可使用 IAM 用户或 IAM 角色以及身份验证令牌对您的数据库集群进行身份验证。*身份验证令牌*是使用签名版本 4 签名流程生成的唯一值。通过使用 IAM 数据库身份验证，您可以使用相同的凭证来控制对 AWS 资源和数据库的访问。有关更多信息，请参阅“[IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.md)”。

**注意**  
有关更多信息，请参阅 [Amazon Aurora 中的安全性](UsingWithRDS.md)。

在以下各节中，请参阅有关 Aurora MySQL 的用户权限以及与 Aurora MySQL 数据库集群的 TLS 连接的信息。

**Topics**
+ [Amazon Aurora MySQL 中的主用户权限](#AuroraMySQL.Security.MasterUser)
+ [与 Aurora MySQL 数据库集群的 TLS 连接](#AuroraMySQL.Security.SSL)

## Amazon Aurora MySQL 中的主用户权限
<a name="AuroraMySQL.Security.MasterUser"></a>

当您创建 Amazon Aurora MySQL 数据库实例时，主用户具有 [主用户账户权限](UsingWithRDS.MasterAccounts.md) 中列出的默认权限。

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

在 Aurora MySQL 版本 2 数据库集群中，在创建数据库集群时系统会创建 `admin` 和 `rdsadmin` 用户。在 Aurora MySQL 版本 3 数据库集群中，系统会创建 `admin`、`rdsadmin` 和 `rds_superuser_role` 用户。

**重要**  
我们强烈建议不要直接在应用程序中使用主用户。请遵守使用数据库用户的最佳实践，按照您的应用程序所需的最少权限创建用户。

对于 Aurora MySQL 数据库集群管理，已限制标准 `kill` 和 `kill_query` 命令。应使用 Amazon RDS 命令 `rds_kill` 和 `rds_kill_query` 以终止 Aurora MySQL 数据库实例上的用户会话或查询。

**注意**  
中国 (宁夏) 区域不支持数据库实例和快照加密。

## 与 Aurora MySQL 数据库集群的 TLS 连接
<a name="AuroraMySQL.Security.SSL"></a>

Amazon Aurora MySQL 数据库集群通过使用与 RDS for MySQL 数据库实例相同的过程和公有密钥，支持从应用程序建立传输层安全性协议（TLS）连接。

在 Amazon RDS 预调配数据库实例时，Amazon RDS 创建 TLS 证书，并将该证书安装在数据库实例上。这些证书由证书颁发机构签署。TLS 证书会将数据库实例端点作为 TLS 证书的公用名（CN）包含在内以防止欺诈攻击。因此，只有在您的客户端支持主题备用名称（SAN）时，您才能使用数据库集群端点通过 TLS 连接到数据库集群。否则，您必须使用写入器实例的实例端点。

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

建议将 AWS JDBC 驱动程序作为支持使用 TLS 的 SAN 的客户端。有关 AWS JDBC 驱动程序的更多信息及其完整使用说明，请参阅 [Amazon Web Services (AWS) JDBC Driver GitHub 存储库](https://github.com/aws/aws-advanced-jdbc-wrapper)。

**Topics**
+ [需要与 Aurora MySQL 数据库集群建立 TLS 连接](#AuroraMySQL.Security.SSL.RequireSSL)
+ [Aurora MySQL 的 TLS 版本](#AuroraMySQL.Security.SSL.TLS_Version)
+ [配置密码套件以连接到 Aurora MySQL 数据库集群](#AuroraMySQL.Security.SSL.ConfiguringCipherSuites)
+ [加密到 Aurora MySQL 数据库集群的连接](#AuroraMySQL.Security.SSL.EncryptingConnections)

### 需要与 Aurora MySQL 数据库集群建立 TLS 连接
<a name="AuroraMySQL.Security.SSL.RequireSSL"></a>

通过使用 `require_secure_transport` 数据库集群参数，您可以要求与您 Aurora MySQL 数据库集群建立的所有用户连接都使用 TLS。默认情况下，`require_secure_transport` 参数设置为 `OFF`。您可将 `require_secure_transport` 参数设置为 `ON` 以要求使用 TLS 连接到数据库集群。

您可通过更新数据库集群的数据库集群参数组来设置 `require_secure_transport` 参数值。您无需重新启动数据库集群即可使更改生效。有关参数组的更多信息，请参阅[Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

**注意**  
`require_secure_transport` 参数适用于 Aurora MySQL 版本 2 和 3。您可以在自定义数据库集群参数组中设置此参数。该参数在数据库实例参数组中不可用。

当数据库集群的 `require_secure_transport` 参数设置为 `ON` 时，如果数据库客户端能够建立加密连接，则可以连接到该数据库集群。否则，将向客户端返回类似于以下内容的错误消息：

```
MySQL Error 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
```

### Aurora MySQL 的 TLS 版本
<a name="AuroraMySQL.Security.SSL.TLS_Version"></a>

Aurora MySQL 支持传输层安全性协议（TLS）版本 1.0、1.1、1.2 和 1.3。从 Aurora MySQL 3.04.0 及更高版本开始，您可以使用 TLS 1.3 协议来保护您的连接。下表显示各个 Aurora MySQL 版本的 TLS 支持情况。


****  

| Aurora MySQL 版本 | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3 | 默认值 | 
| --- | --- | --- | --- | --- | --- | 
|  Aurora MySQL 版本 2  | 弃用 | 弃用 |  支持  | 不支持 | 所有支持的 TLS 版本 | 
|  Aurora MySQL 版本 3（低于 3.04.0）  | 弃用 | 弃用 | 支持 | 不支持 | 所有支持的 TLS 版本 | 
|  Aurora MySQL 版本 3（3.04.0 及更高版本）  | 不支持  | 不支持  | 支持 | 支持 | 所有支持的 TLS 版本 | 

**重要**  
如果您在版本 2 和版本低于 3.04.0 的 Aurora MySQL 集群中使用自定义参数组，建议使用 TLS 1.2，因为 TLS 1.0 和 1.1 不太安全。MySQL 8.0.26 和 Aurora MySQL 3.03 的社区版及其次要版本已不再支持 TLS 版本 1.1 和 1.0。  
MySQL 8.0.28 的社区版和兼容的 Aurora MySQL 版本 3.04.0 及更高版本不支持 TLS 1.1 和 TLS 1.0。如果您使用的是 Aurora MySQL 版本 3.04.0 或更高版本，请勿在自定义参数组中将 TLS 协议设置为 1.0 和 1.1。  
对于 Aurora MySQL 版本 3.04.0 及更高版本，默认为 TLS 1.3 和 TLS 1.2。

您可以使用 `tls_version` 数据库集群参数来指示允许的协议版本。大多数客户端工具或数据库驱动程序都有类似的客户端参数。某些较旧的客户端可能不支持较新的 TLS 版本。默认情况下，数据库集群尝试使用服务器和客户端配置都允许的最高 TLS 协议版本。

将 `tls_version` 数据库集群参数设置为以下值之一：
+ `TLSv1.3` 
+ `TLSv1.2` 
+ `TLSv1.1`
+ `TLSv1`

也可以将 `tls_version` 参数设置为以逗号分隔的列表的字符串。如果您想同时使用 TLS 1.2 和 TLS 1.3 协议，`tls_version` 参数必须包括从最低协议到最高协议的所有协议。在这种情况下，`tls_version` 设置为：

```
tls_version=TLSv1.2,TLSv1.3
```

有关在数据库集群参数组中修改参数的信息，请参阅[在 Amazon Aurora 中修改数据库集群参数组中的参数](USER_WorkingWithParamGroups.ModifyingCluster.md)。如果您将 AWS CLI 用于修改 `tls_version` 数据库集群参数，`ApplyMethod` 必须设置为 `pending-reboot`。当应用方法为 `pending-reboot` 时，对参数的更改会在您停止并重新启动与参数组相关的数据库集群之后应用。

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

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

Aurora MySQL 版本 3 和 Aurora MySQL 版本 2 支持可配置的密码套件。要指定允许用于加密连接的 TLS 1.2、TLS 1.1、TLS 1.0 密码的列表，请修改 `ssl_cipher` 集群参数。使用 AWS 管理控制台、AWS CLI 或 RDS API 在集群参数组中设置 `ssl_cipher` 参数。

将 `ssl_cipher` 参数设置为 TLS 版本的以逗号分隔的密码值字符串。对于客户端应用程序，您可以在连接到数据库时使用 `--ssl-cipher` 选项指定用于加密连接的密码。有关连接到数据库的更多信息，请参阅 [连接到 Amazon Aurora MySQL 数据库集群](Aurora.Connecting.md#Aurora.Connecting.AuroraMySQL)。

从 Aurora MySQL 版本 3.04.0 及更高版本开始，您可以指定 TLS 1.3 密码套件。要指定允许的 TLS 1.3 密码套件，请修改参数组中的 `tls_ciphersuites` 参数。TLS 1.3 减少了可用密码套件的数量，这是由于命名约定中进行了相关更改，删除了使用的密钥交换机制和证书。将 `tls_ciphersuites` 设置为 TLS 1.3 以逗号分隔的密码值字符串。

下表显示了支持的密码、TLS 加密协议以及每个密码的有效 Aurora MySQL 引擎版本。


| 密码 | 加密协议 | 支持的 Aurora MySQL 版本 | 
| --- | --- | --- | 
| `ECDHE-RSA-AES128-SHA` | TLS 1.0 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-RSA-AES128-SHA256` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-RSA-AES128-GCM-SHA256` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-RSA-AES256-SHA` | TLS 1.0 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-RSA-AES256-GCM-SHA384` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-RSA-CHACHA20-POLY1305` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-ECDSA-AES128-SHA` | TLS 1.0 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-ECDSA-AES256-SHA` | TLS 1.0 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-ECDSA-AES128-GCM-SHA256` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-ECDSA-AES256-GCM-SHA384` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `ECDHE-ECDSA-CHACHA20-POLY1305` | TLS 1.2 | 3.04.0 及更高版本，2.11.0 及更高版本 | 
| `TLS_AES_128_GCM_SHA256` | TLS 1.3 | 3.04.0 及更高版本 | 
| `TLS_AES_256_GCM_SHA384` | TLS 1.3 | 3.04.0 及更高版本 | 
| `TLS_CHACHA20_POLY1305_SHA256` | TLS 1.3 | 3.04.0 及更高版本 | 

有关在数据库集群参数组中修改参数的信息，请参阅[在 Amazon Aurora 中修改数据库集群参数组中的参数](USER_WorkingWithParamGroups.ModifyingCluster.md)。如果您使用 CLI 来修改 `ssl_cipher` 数据库集群参数，请务必将 `ApplyMethod` 设置为 `pending-reboot`。当应用方法为 `pending-reboot` 时，对参数的更改会在您停止并重新启动与参数组相关的数据库集群之后应用。

您也可以使用 [describe-engine-default-cluster-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-engine-default-cluster-parameters.html) CLI 命令来确定特定参数组系列当前支持哪些密码套件。以下示例展示如何获取 Aurora MySQL 版本 2 的 `ssl_cipher` 集群参数允许的值。

```
aws rds describe-engine-default-cluster-parameters --db-parameter-group-family aurora-mysql5.7

        ...some output truncated...
	{
        "ParameterName": "ssl_cipher",
        "ParameterValue": "ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-SHA,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA",
        "Description": "The list of permissible ciphers for connection encryption.",
        "Source": "system",
        "ApplyType": "static",
        "DataType": "list",
        "AllowedValues": "ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-SHA,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA",
        "IsModifiable": true,
        "SupportedEngineModes": [
            "provisioned"
        ]
    },
       ...some output truncated...
```

有关密码的更多信息，请参阅 MySQL 文档中的 [ssl\$1cipher](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_ssl_cipher) 变量。有关密码套件格式的更多信息，请参阅 OpenSSL 网站上的 [openssl-ciphers list format](https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT) 和 [openssl-ciphers string format](https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-STRINGS) 文档。

### 加密到 Aurora MySQL 数据库集群的连接
<a name="AuroraMySQL.Security.SSL.EncryptingConnections"></a>

要使用默认的 `mysql` 客户端对连接加密，需用 `--ssl-ca` 参数启动 mysql 客户端以便引用公有密钥，例如：

对于 MySQL 5.7 和 8.0：

```
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com
--ssl-ca=full_path_to_CA_certificate --ssl-mode=VERIFY_IDENTITY
```

对于 MySQL 5.6：

```
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com
--ssl-ca=full_path_to_CA_certificate --ssl-verify-server-cert
```

将 *full\$1path\$1to\$1CA\$1certificate* 替换为证书颁发机构 (CA) 证书的完整路径。有关下载证书的信息，请参阅 [使用 SSL/TLS 加密与数据库集群的连接](UsingWithRDS.SSL.md)。

您可以要求特定用户账户建立 TLS 连接。例如，可以根据您的 MySQL 版本，使用以下语句之一来要求用户账户 `encrypted_user` 建立 TLS 连接。

对于 MySQL 5.7 和 8.0：

```
ALTER USER 'encrypted_user'@'%' REQUIRE SSL;            
```

对于 MySQL 5.6：

```
GRANT USAGE ON *.* TO 'encrypted_user'@'%' REQUIRE SSL;
```

 使用 RDS 代理时，您可以连接到代理端点，而不是通常的集群端点。对于到代理的连接，您可以像直接到 Aurora 数据库集群的连接那样，使 SSL/TLS 成为必需或可选的选项。有关使用 RDS 代理的信息，请参阅[适用于 Aurora 的Amazon RDS 代理](rds-proxy.md)。

**注意**  
有关与 MySQL 的 TLS 连接的更多信息，请参阅 [MySQL 文档](https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html)。