

# 使用 Amazon Aurora 和 Amazon Secrets Manager 管理密码
<a name="rds-secrets-manager"></a>

Amazon Aurora 集成了 Secrets Manager，以管理您的数据库集群的主用户密码。

**Topics**
+ [区域和版本可用性](#rds-secrets-manager-availability)
+ [Secrets Manager 与 Amazon Aurora 集成的限制](#rds-secrets-manager-limitations)
+ [使用 Amazon Secrets Manager 管理主用户密码的概述](#rds-secrets-manager-overview)
+ [使用 Secrets Manager 管理主用户密码的优势](#rds-secrets-manager-benefits)
+ [Secrets Manager 集成所需的权限](#rds-secrets-manager-permissions)
+ [强制 Aurora 在 Amazon Secrets Manager 中管理主用户密码](#rds-secrets-manager-auth)
+ [使用 Secrets Manager 管理数据库集群的主用户密码](#rds-secrets-manager-db-cluster)
+ [轮换数据库集群的主用户密码密钥](#rds-secrets-manager-rotate-db-cluster)
+ [查看有关数据库集群的密钥的详细信息](#rds-secrets-manager-view-db-cluster)

## 区域和版本可用性
<a name="rds-secrets-manager-availability"></a>

功能可用性和支持因每个数据库引擎的特定版本以及 Amazon Web Services 区域而异。有关 Secrets Manager 与 Amazon Aurora 集成的版本和区域可用性的更多信息，请参阅 [支持 Secrets Manager 集成的区域和 Aurora 数据库引擎](Concepts.Aurora_Fea_Regions_DB-eng.Feature.SecretsManager.md)。

## Secrets Manager 与 Amazon Aurora 集成的限制
<a name="rds-secrets-manager-limitations"></a>

以下功能不支持使用 Secrets Manager 管理主用户密码：
+ Amazon RDS 蓝绿部署
+ 属于 Aurora Global Database 的数据库集群
+ Aurora Serverless v1 数据库集群
+ 跨区域只读副本
+ 二进制日志外部复制

## 使用 Amazon Secrets Manager 管理主用户密码的概述
<a name="rds-secrets-manager-overview"></a>

借助 Amazon Secrets Manager，您可以将代码中的硬编码凭证（包括数据库密码）替换为对 Secrets Manager 的 API 调用，从而以编程方式检索密钥。有关 Secrets Manager 的更多信息，请参阅《Amazon Secrets Manager 用户指南》[https://docs.amazonaws.cn/secretsmanager/latest/userguide/](https://docs.amazonaws.cn/secretsmanager/latest/userguide/)。

当您在 Secrets Manager 中存储数据库密钥时，您的 Amazon Web Services 账户会产生费用。有关定价的信息，请参阅 [Amazon Secrets Manager 定价](https://www.amazonaws.cn/secrets-manager/pricing)。

在执行以下操作之一时，您可以指定 Aurora 在 Secrets Manager 中管理 Amazon Aurora 数据库集群的主用户密码：
+ 创建数据库集群
+ 修改数据库集群
+ 从 Amazon S3 还原数据库集群（仅限 Aurora MySQL）

当您指定 Aurora 在 Secrets Manager 中管理主用户密码时，Aurora 会生成密码并将其存储在 Secrets Manager 中。您可以直接与密钥交互以检索主用户的凭证。您还可以指定客户托管密钥来加密密钥，或者使用 Secrets Manager 提供的 KMS 密钥。

Aurora 管理密钥的设置，默认情况下每七天轮换一次密钥。您可以修改某些设置，例如轮换计划。如果您删除在 Secrets Manager 中管理密钥的数据库集群，则该密钥及其关联的元数据也会被删除。

要使用密钥中的凭证连接到数据库集群，您可以从 Secrets Manager 检索密钥。有关更多信息，请参阅《Amazon Secrets Manager 用户指南》**中的[从 Amazon Secrets Manager 中检索密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/retrieving-secrets.html)和[使用 Amazon Secrets Manager 密钥中的凭证连接到 SQL 数据库](https://docs.amazonaws.cn/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html)。

## 使用 Secrets Manager 管理主用户密码的优势
<a name="rds-secrets-manager-benefits"></a>

使用 Secrets Manager 管理 Aurora 主用户密码具有以下优势：
+ Aurora 会自动生成数据库凭证。
+ Aurora 会自动在 Amazon Secrets Manager 中存储和管理数据库凭证。
+ Aurora 定期轮换数据库凭证，而无需更改应用程序。
+ Secrets Manager 保护数据库凭证免受人员访问和纯文本视图的影响。
+ Secrets Manager 允许在密钥中检索数据库凭证以进行数据库连接。
+ Secrets Manager 允许使用 IAM 细粒度控制对密钥中的数据库凭证的访问权限。
+ 您可以选择使用不同的 KMS 密钥将数据库加密与凭证加密分开。
+ 您可以省去手动管理和轮换数据库凭证。
+ 您可以使用 Amazon CloudTrail 和 Amazon CloudWatch 轻松监控数据库凭证。

有关 Secrets Manager 的优势的更多信息，请参阅 [Amazon Secrets Manager 用户指南](https://docs.amazonaws.cn/secretsmanager/latest/userguide/)。

## Secrets Manager 集成所需的权限
<a name="rds-secrets-manager-permissions"></a>

用户必须拥有所需的权限才能执行与 Secrets Manager 集成相关的操作。您可以创建 IAM policy，以便授予权限对所需的指定资源执行特定的 API 操作。然后，可以将这些策略附加到需要这些权限的 IAM 权限集或角色。有关更多信息，请参阅 [Amazon Aurora 的 Identity and Access Management](UsingWithRDS.IAM.md)。

对于创建、修改或还原操作，指定 Aurora 在 Secrets Manager 中管理主用户密码的用户必须具有执行以下操作的权限：
+ `kms:DescribeKey`
+ `secretsmanager:CreateSecret`
+ `secretsmanager:TagResource`

需要 `kms:DescribeKey` 权限才能访问 `MasterUserSecretKmsKeyId` 的客户托管密钥并描述 `aws/secretsmanager`。

对于创建、修改或还原操作，指定用于在 Secrets Manager 中加密密钥的客户托管密钥的用户必须具有执行以下操作的权限：
+ `kms:Decrypt`
+ `kms:GenerateDataKey`
+ `kms:CreateGrant`

对于修改操作，在 Secrets Manager 中轮换主用户密码的用户必须具有执行以下操作的权限：
+ `secretsmanager:RotateSecret`

## 强制 Aurora 在 Amazon Secrets Manager 中管理主用户密码
<a name="rds-secrets-manager-auth"></a>

您可以使用 IAM 条件密钥强制 Aurora 在 Amazon Secrets Manager 中管理主用户密码。除非主用户密码由 Aurora 在 Secrets Manager 中进行管理，否则以下策略不支持用户创建或还原数据库实例或数据库集群。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": ["rds:CreateDBInstance", "rds:CreateDBCluster", "rds:RestoreDBInstanceFromS3", "rds:RestoreDBClusterFromS3"],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "rds:ManageMasterUserPassword": false
                }
            }
        }
    ]
}
```

------

**注意**  
此策略在创建时在 Amazon Secrets Manager 中强制执行密码管理。但是，您仍然可以禁用 Secrets Manager 集成，并通过修改集群手动设置主密码。  
为防止这种情况，请在策略的操作块中包括 `rds:ModifyDBInstance`、`rds:ModifyDBCluster`。请注意，这可以防止用户对未启用 Secrets Manager 集成的现有集群进行任何进一步修改。

有关在 IAM 策略中使用条件密钥的更多信息，请参阅 [Aurora 的策略条件键](security_iam_service-with-iam.md#UsingWithRDS.IAM.Conditions) 和 [示例策略：使用条件键](UsingWithRDS.IAM.Conditions.Examples.md)。

## 使用 Secrets Manager 管理数据库集群的主用户密码
<a name="rds-secrets-manager-db-cluster"></a>

执行以下操作时，可以配置 Aurora 在 Secrets Manager 中管理主用户密码：
+ [创建 Amazon Aurora 数据库集群](Aurora.CreateInstance.md)
+ [修改 Amazon Aurora 数据库集群](Aurora.Modifying.md)
+ [将数据从外部 MySQL 数据库迁移到 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Migrating.ExtMySQL.md)

您可以使用 RDS 控制台、Amazon CLI 或 RDS API 来执行这些操作。

### 控制台
<a name="rds-secrets-manager-db-cluster-console"></a>

按照说明使用 RDS 控制台创建或修改数据库集群：
+ [创建数据库集群](Aurora.CreateInstance.md#Aurora.CreateInstance.Creating)
+ [修改数据库集群中的数据库实例](Aurora.Modifying.md#Aurora.Modifying.Instance)

  在 RDS 控制台中，您可以修改任何数据库实例，为整个数据库集群指定主用户密码管理设置。
+ [从 Amazon S3 存储桶还原 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Migrating.ExtMySQL.S3.md#AuroraMySQL.Migrating.ExtMySQL.S3.Restore)

当您使用 RDS 控制台执行其中一项操作时，可以在 Secrets Manager 中指定主用户密码由 Aurora 管理。要在创建或还原数据库集群时执行此操作，请在**凭证设置**中选择**在 Amazon Secrets Manager 中管理主凭证**。修改数据库集群时，请在**设置**中选择**在 Amazon Secrets Manager 中管理主凭证**。

下图是在创建或还原数据库集群时**在 Amazon Secrets Manager 中管理主凭证**的示例。

![\[在 Amazon Secrets Manager 中管理主凭证\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/secrets-manager-credential-settings.png)


当您选择此选项时，Aurora 会生成主用户密码并在其整个生命周期中在 Secrets Manager 中对其进行管理。

![\[在所选的 Amazon Secrets Manager 中管理主凭证\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/secrets-manager-integration-create.png)


您可以选择使用 Secrets Manager 提供的 KMS 密钥或您创建的客户托管密钥对密钥进行加密。在 Aurora 管理数据库集群的数据库凭证后，您无法更改用于加密密钥的 KMS 密钥。

您可以选择其他设置来满足您的要求。

有关创建数据库集群时的可用设置的更多信息，请参阅 [Aurora 数据库集群的设置](Aurora.CreateInstance.md#Aurora.CreateInstance.Settings)。有关修改数据库集群时的可用设置的更多信息，请参阅 [Amazon Aurora 设置](Aurora.Modifying.md#Aurora.Modifying.Settings)。

### Amazon CLI
<a name="rds-secrets-manager-db-cluster-cli"></a>

要指定 Aurora 在 Secrets Manager 中管理主用户密码，请在以下命令之一中指定 `--manage-master-user-password` 选项：
+ [create-db-cluster](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html)
+ [modify-db-cluster](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-cluster.html)
+ [restore-db-cluster-from-s3](https://docs.amazonaws.cn/cli/latest/reference/rds/restore-db-cluster-from-s3.html)

当您在这些命令中指定 `--manage-master-user-password` 选项时，Aurora 会生成主用户密码，并在其整个生命周期中在 Secrets Manager 中对其进行管理。

要加密密钥，您可以指定客户托管密钥或使用 Secrets Manager 提供的默认 KMS 密钥。使用 `--master-user-secret-kms-key-id` 选项指定客户托管密钥。Amazon KMS 密钥标识符是密钥 ARN、密钥 ID、别名 ARN 或者 KMS 密钥的别名。要使用不同 Amazon Web Services 账户中的密钥，请指定密钥 ARN 或别名 ARN。在 Aurora 管理数据库集群的数据库凭证后，您无法更改用于加密密钥的 KMS 密钥。

您可以选择其他设置来满足您的要求。

有关创建数据库集群时的可用设置的更多信息，请参阅 [Aurora 数据库集群的设置](Aurora.CreateInstance.md#Aurora.CreateInstance.Settings)。有关修改数据库集群时的可用设置的更多信息，请参阅 [Amazon Aurora 设置](Aurora.Modifying.md#Aurora.Modifying.Settings)。

此示例创建一个数据库集群，并指定 Aurora 在 Secrets Manager 中管理密码。此密钥使用 Secrets Manager 提供的 KMS 密钥进行加密。

**Example**  
对于 Linux、macOS 或 Unix：  

```
1. aws rds create-db-cluster \
2.      --db-cluster-identifier sample-cluster \
3.      --engine aurora-mysql \
4.      --engine-version 8.0 \
5.      --master-username admin \
6.      --manage-master-user-password
```
对于：Windows  

```
1. aws rds create-db-cluster ^
2.      --db-cluster-identifier sample-cluster ^
3.      --engine aurora-mysql ^
4.      --engine-version 8.0 ^
5.      --master-username admin ^
6.      --manage-master-user-password
```

### RDS API
<a name="rds-secrets-manager-db-cluster-api"></a>

要指定 Aurora 在 Secrets Manager 中管理主用户密码，请在以下操作之一中将 `ManageMasterUserPassword` 参数设置为 `true`：
+ [CreateDBCluster](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html)
+ [ModifyDBCluster](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html)
+ [RestoreDBClusterFromS3](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromS3.html)

当您在其中一个操作中将 `ManageMasterUserPassword` 参数设置为 `true` 时，Aurora 会生成主用户密码并在其整个生命周期中在 Secrets Manager 中对其进行管理。

要加密密钥，您可以指定客户托管式密钥或使用 Secrets Manager 提供的原定设置 KMS 密钥。使用 `MasterUserSecretKmsKeyId` 参数指定客户托管密钥。Amazon KMS 密钥标识符是密钥 ARN、密钥 ID、别名 ARN 或者 KMS 密钥的别名。要使用不同 Amazon Web Services 账户中的密钥，请指定密钥 ARN 或别名 ARN。在 Aurora 管理数据库集群的数据库凭证后，您无法更改用于加密密钥的 KMS 密钥。

## 轮换数据库集群的主用户密码密钥
<a name="rds-secrets-manager-rotate-db-cluster"></a>

当 Aurora 轮换主用户密码密钥时，Secrets Manager 会为现有密钥生成一个新的密钥版本。密钥的新版本包含新的主用户密码。Aurora 更改数据库集群的主用户密码，以匹配新密钥版本的密码。

您可以立即轮换密钥，而不必等待计划的轮换。要在 Secrets Manager 中轮换主用户密码密钥，请修改数据库集群。有关修改数据库集群的信息，请参阅 [修改 Amazon Aurora 数据库集群](Aurora.Modifying.md)。

您可以使用 RDS 控制台、Amazon CLI 或 RDS API 立即轮换主用户密码密钥。新密码长度始终为 28 个字符，包含至少一个大写和小写字母、一个数字和一个标点符号。

### 控制台
<a name="rds-secrets-manager-rotate-db-instance-console"></a>

要使用 RDS 控制台轮换主用户密码密钥，请修改数据库集群并在 **Settings**（设置）中选择 **Rotate secret immediately**（立即轮换密钥）。

![\[立即轮换主用户密码密钥\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/secrets-manager-integration-rotate-aurora.png)


按照[使用控制台、CLI 和 API 修改数据库集群](Aurora.Modifying.md#Aurora.Modifying.Cluster)中的说明使用 RDS 控制台修改数据库集群。您必须在确认页面上选择 **Apply immediately**（立即应用）。

### Amazon CLI
<a name="rds-secrets-manager-rotate-db-instance-cli"></a>

要使用 Amazon CLI 轮换主用户密码密钥，请使用 [modify-db-cluster](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-cluster.html) 命令并指定 `--rotate-master-user-password` 选项。轮换主密码时必须指定 `--apply-immediately` 选项。

此示例轮换主用户密码密钥。

**Example**  
对于 Linux、macOS 或 Unix：  

```
1. aws rds modify-db-cluster \
2.     --db-cluster-identifier mydbcluster \
3.     --rotate-master-user-password \
4.     --apply-immediately
```
对于：Windows  

```
1. aws rds modify-db-cluster ^
2.     --db-cluster-identifier mydbcluster ^
3.     --rotate-master-user-password ^
4.     --apply-immediately
```

### RDS API
<a name="rds-secrets-manager-rotate-db-instance-api"></a>

您可以使用 [ModifyDBCluster](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) 操作并将 `RotateMasterUserPassword` 参数设置为 `true` 来轮换主用户密码密钥。轮换主密码时，必须将 `ApplyImmediately` 参数设置为 `true`。

## 查看有关数据库集群的密钥的详细信息
<a name="rds-secrets-manager-view-db-cluster"></a>

您可以使用控制台（[https://console.aws.amazon.com/secretsmanager/](https://console.amazonaws.cn/secretsmanager/)）或 Amazon CLI（[get-secret-value](https://docs.amazonaws.cn/cli/latest/reference/secretsmanager/get-secret-value.html) Secrets Manager 命令）检索您的密钥。

您可以使用 RDS 控制台、Amazon CLI 或 RDS API 找到 Aurora 在 Secrets Manager 中管理的密钥的 Amazon 资源名称（ARN）。

### 控制台
<a name="rds-secrets-manager-view-db-cluster-console"></a>

**查看有关 Secrets Manager 中 Aurora 管理的密钥的详细信息**

1. 登录Amazon Web Services 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择数据库集群的名称以显示其详细信息。

1. 选择**配置**选项卡。

   在 **Master Credentials ARN**（主凭证 ARN）中，您可以查看密钥 ARN。  
![\[查看有关 Aurora 在 Secrets Manager 中管理的密钥的详细信息\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/secrets-manager-integration-view-cluster.png)

   您可以单击 **Manage in Secrets Manager**（在 Secrets Manager 中管理）链接，以在 Secrets Manager 控制台中查看和管理密钥。

### Amazon CLI
<a name="rds-secrets-manager-view-db-instance-cli"></a>

您可以使用 RDS Amazon CLI [describe-db-clusters](https://docs.amazonaws.cn/cli/latest/reference/rds/describe-db-clusters.html) 命令查找有关 Aurora 在 Secrets Manager 中管理的密钥的以下信息：
+ `SecretArn` – 密钥的 ARN
+ `SecretStatus` – 密钥的状态

  可能的状态值包括：
  + `creating` – 密钥正在创建中。
  + `active` – 密钥可用于正常使用和轮换。
  + `rotating` – 密钥正在轮换。
  + `impaired` – 密钥可用于访问数据库凭证，但不能轮换。例如，如果更改权限以使 RDS 无法再访问密钥或密钥的 KMS 密钥，则密钥可能具有此状态。

    当密钥具有此状态时，您可以更正导致该状态的条件。如果您更正导致状态的条件，则状态会一直保持为 `impaired`，直至下一次轮换。或者，您可以修改数据库集群以关闭数据库凭证的自动管理，然后再次修改数据库集群以开启数据库凭证的自动管理。要修改数据库集群，请在 [modify-db-cluster](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-cluster.html) 命令中使用 `--manage-master-user-password` 选项。
+ `KmsKeyId` – 用于加密密钥的 KMS 密钥的 ARN

指定 `--db-cluster-identifier` 选项可显示特定数据库集群的输出。此示例显示数据库集群使用的密钥的输出。

**Example**  

```
1. aws rds describe-db-clusters --db-cluster-identifier mydbcluster
```
以下示例显示密钥的输出：  

```
"MasterUserSecret": {
                "SecretArn": "arn:aws:secretsmanager:eu-west-1:123456789012:secret:rds!cluster-033d7456-2c96-450d-9d48-f5de3025e51c-xmJRDx",
                "SecretStatus": "active",
                "KmsKeyId": "arn:aws:kms:eu-west-1:123456789012:key/0987dcba-09fe-87dc-65ba-ab0987654321"
            }
```

当您拥有密钥 ARN 时，您可以使用 [get-secret-value](https://docs.amazonaws.cn/cli/latest/reference/secretsmanager/get-secret-value.html) Secrets Manager CLI 命令查看有关该密钥的详细信息。

此示例显示先前示例输出中的密钥的详细信息。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws secretsmanager get-secret-value \
    --secret-id 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:rds!cluster-033d7456-2c96-450d-9d48-f5de3025e51c-xmJRDx'
```
对于：Windows  

```
aws secretsmanager get-secret-value ^
    --secret-id 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:rds!cluster-033d7456-2c96-450d-9d48-f5de3025e51c-xmJRDx'
```

### RDS API
<a name="rds-secrets-manager-rotate-db-instance-api"></a>

您可以使用 [DescribeDBClusters](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) RDS 操作并将 `DBClusterIdentifier` 参数设置为数据库集群标识符，查看 Aurora 在 Secrets Manager 中管理的密钥的 ARN、状态和 KMS 密钥。输出中包含有关密钥的详细信息。

当您拥有密钥 ARN 时，您可以使用 [GetSecretValue](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_GetSecretValue.html) Secrets Manager 操作查看有关该密钥的详细信息。