

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用密钥访问 AWS Database Migration Service 终端节点
<a name="security_iam_secretsmanager"></a>

对于 AWS DMS，*密*钥是一种加密密钥，您可以使用它来表示一组用户凭据，通过*秘密身份验证*对支持的 AWS DMS 源端点或目标端点的数据库连接进行身份验证。对于同时使用 Oracle 自动存储管理 (ASM) 的 Oracle 终端节点， AWS DMS 需要一个代表访问 Oracle ASM 的用户凭据的额外密钥。

您可以使用一项服务来创建 AWS DMS 需要进行秘密身份验证的一个或多个机密 AWS Secrets Manager，该服务用于安全地创建、存储和检索凭据，以访问云端和内部部署中的应用程序、服务和 IT 资源。包括支持在无需干预的情况下自动定期轮换加密密钥值，从而为凭证提供额外的安全级别。在中启用机密值轮换 AWS Secrets Manager 还可以确保这种密钥值轮换不会对依赖该密钥的任何数据库迁移产生任何影响。要对端点数据库连接进行秘密身份验证，请创建一个密钥，将其身份或 ARN 分配给 `SecretsManagerSecretId`，并将其包含在端点设置中。要对作为 Oracle 端点一部分的 Oracle ASM 进行秘密身份验证，请创建一个密钥，将其身份或 ARN 分配给 `SecretsManagerOracleAsmSecretId`，并将其包含在端点设置中。

**注意**  
不能使用由 Amazon RDS Aurora 管理的主凭证。这些凭证不包括建立连接 AWS DMS 所需的主机或端口信息。而是应创建新用户和密钥。有关创建用户和密钥的信息，请参阅后面的[使用创建 AWS 管理控制台 机密和秘密访问角色](#security_iam_secretsmanager.console)。

有关的更多信息 AWS Secrets Manager，请参阅[什么是 S AWS ecrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 在《*AWS Secrets Manager 用户指南》*中。

AWS DMS 支持在支持的源端点和目标端点上对以下本地或 AWS托管数据库进行密钥身份验证：
+ Amazon DocumentDB
+ IBM Db2 LUW
+ Microsoft SQL Server
+ MongoDB
+ MySQL
+ Oracle
+ PostgreSQL
+ Amazon Redshift
+ SAP ASE

要连接到这些数据库中的任何一个，您可以选择在端点设置中输入以下值中的一组，但不能同时输入两组值：
+ 明文值，以使用 `UserName`、`Password`、`ServerName` 和 `Port` 设置对数据库连接进行身份验证。对于同时使用 Oracle ASM 的 Oracle 端点，还包括其他明文值，以使用 `AsmUserName`、`AsmPassword` 和 `AsmServerName` 设置对 ASM 进行身份验证。
+ 使用 `SecretsManagerSecretId` 和 `SecretsManagerAccessRoleArn` 设置的值进行秘密身份验证。对于使用 Oracle ASM 的 Oracle 端点，还包括 `SecretsManagerOracleAsmSecretId` 和 `SecretsManagerOracleAsmAccessRoleArn` 设置的值。这些设置的密钥值可能包括以下参数：
  + `SecretsManagerSecretId` – 您在 AWS Secrets Manager中为访问端点数据库而创建的密钥的完整 Amazon 资源名称（ARN）、部分 ARN 或友好名称。
  + `SecretsManagerAccessRoleArn`— 您在 IAM 中创建的用于代表您访问此密钥的`SecretsManagerSecretId`秘密 AWS DMS 访问角色的 ARN。
  + `SecretsManagerOracleAsmSecretId` – 您在 AWS Secrets Manager中为访问 Oracle ASM 而创建的密钥的完整 Amazon 资源名称（ARN）、部分 ARN 或友好名称。
  + `SecretsManagerOracleAsmAccessRoleArn` – 您在 IAM 中为方便 AWS DMS 代表您访问 `SecretsManagerOracleAsmSecretId` 密钥而创建的秘密访问角色的 ARN。
**注意**  
您还可以使用单个机密访问角色来提供对`SecretsManagerSecretId`密钥和密钥的 AWS DMS `SecretsManagerOracleAsmSecretId`访问权限。如果您为这两个密钥创建单个秘密访问角色，请确保将此访问角色的相同 ARN 分配给 `SecretsManagerAccessRoleArn` 和 `SecretsManagerOracleAsmAccessRoleArn`。例如，如果两个密钥的秘密访问角色的 ARN 分配给了变量 `ARN2xsecrets`，则可按如下方式设置 ARN：  

  ```
  SecretsManagerAccessRoleArn = ARN2xsecrets;
  SecretsManagerOracleAsmAccessRoleArn = ARN2xsecrets;
  ```

  有关创建这些值的更多信息，请参阅[使用创建 AWS 管理控制台 机密和秘密访问角色](#security_iam_secretsmanager.console)。

为端点创建并指定所需的密钥及秘密访问角色端点设置后，使用这些密钥详细信息更新将运行 `CreateEndpoint` 或 `ModifyEndpoint` API 请求的用户账户的权限。确保这些账户权限包括对`IAM:GetRole`秘密访问角色的`SecretsManager:DescribeSecret`权限和对机密的权限。 AWS DMS 需要这些权限才能验证访问角色及其密钥。

**提供和验证所需的用户权限**

1. 登录 AWS 管理控制台 并打开 AWS Identity and Access Management 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 选择**用户**，然后选择用于发出 `CreateEndpoint` 和 `ModifyEndpoint` API 调用的**用户 ID**。

1. 从**权限**选项卡中选择 **\$1\$1 JSON**。

1. 请确保用户具有以下所示的权限。

   ```
   {
   	"Statement": [{
   			"Effect": "Allow",
   			"Action": [
   				"iam:GetRole",
   				"iam:PassRole"
   			],
   			"Resource": "SECRET_ACCESS_ROLE_ARN"
   		},
   		{
   			"Effect": "Allow",
   			"Action": "secretsmanager:DescribeSecret",
   			"Resource": "SECRET_ARN"
   		}
   	]
   }
   ```

1. 如果用户没有这些权限，添加权限。

1. 如果使用 IAM 角色发出 DMS API 调用，请对相应的角色重复上述步骤。

1. 打开终端，使用假设上面使用的角色或用户来验证权限是否正确授予。 AWS CLI 

   1.  SecretAccessRole 使用 IAM `get-role` 命令验证用户的权限。

      ```
      aws iam get-role --role-name ROLE_NAME
      ```

      *ROLE\$1NAME*替换为的名称`SecretsManagerAccessRole`。

      如果命令返回错误消息，请确保已正确授予权限。

   1. 使用 Secrets Manager `describe-secret` 命令验证用户对密钥的权限。

      ```
      aws secretsmanager describe-secret --secret-id SECRET_NAME OR SECRET_ARN --region=REGION_NAME
      ```

      用户可以是友好名称、部分 ARN 或完整 ARN。有关更多信息，请参阅 [describe-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html)。

      如果命令返回错误消息，请确保已正确授予权限。

## 使用创建 AWS 管理控制台 机密和秘密访问角色
<a name="security_iam_secretsmanager.console"></a>

您可以使用创建 AWS 管理控制台 用于终端节点身份验证的密钥，并创建允许您代表您 AWS DMS 访问该密钥的策略和角色。

**使用 AWS DMS 可用于对数据库进行源端点和目标端点连接进行身份验证的密钥来创建密钥 AWS 管理控制台**

1. 登录 AWS 管理控制台 并打开 AWS Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 选择**存储新密钥**。

1. 在**存储新密钥**页面上，在**选择密钥类型**下选择**其他类型的密钥**，然后选择**明文**。
**注意**  
从此刻起，这是唯一需要输入明文凭证才能连接到端点数据库的地方。

1. 在**明文**字段中：
   + 对于身份分配给 `SecretsManagerSecretId` 的密钥，输入以下 JSON 结构。

     ```
     {
       "username": db_username,
       "password": db_user_password,
       "port": db_port_number,
       "host": db_server_name
     }
     ```
**注意**  
这是对端点数据库进行身份验证所需的最少 JSON 成员列表。您可以根据需要将任何其他 JSON 端点设置添加为 JSON 成员，全部采用小写。但是，对于端点身份验证， AWS DMS 会忽略任何其他 JSON 成员。

     此处，`db_username` 是访问数据库的用户的名称，`db_user_password` 是数据库用户的密码，`db_port_number` 是访问数据库的端口号，`db_server_name` 是 Web 上的数据库服务器名称（地址），如下例所示。

     ```
     {
       "username": "admin",
       "password": "some_password",
       "port": "8190",
       "host": "oracle101.abcdefghij.us-east-1.rds.amazonaws.com"
     }
     ```
   + 对于身份分配给 `SecretsManagerOracleAsmSecretId` 的密钥，输入以下 JSON 结构。

     ```
     {
       "asm_user": asm_username,
       "asm_password": asm_user_password,
       "asm_server": asm_server_name
     }
     ```
**注意**  
这是对 Oracle 端点的 Oracle ASM 进行身份验证所需的最少 JSON 成员列表。也是您可以根据可用的 Oracle ASM 端点设置指定的完整列表。

     此处，`asm_username` 是访问 Oracle ASM 的用户的名称，`asm_user_password` 是 Oracle ASM 用户的密码，`asm_server_name` 是 Web 上的 Oracle ASM 服务器名称（地址），包括端口，如下例所示。

     ```
     { 
       "asm_user": "oracle_asm_user", 
       "asm_password": "oracle_asm_password",
       "asm_server": "oracle101.abcdefghij.us-east-1.rds.amazonaws.com:8190/+ASM" 
     }
     ```

1. 选择 AWS KMS 加密密钥对密钥进行加密。您可以接受由为您的服务创建的默认加密密钥， AWS Secrets Manager 也可以选择自己创建的 AWS KMS 密钥。

1. 指定引用此密钥的名称和可选的描述。这是您用作 `SecretsManagerSecretId` 或 `SecretsManagerOracleAsmSecretId` 值的友好名称。

1. 如果要在密钥中启用自动轮换，则需要选择或创建一个 AWS Lambda 函数，该函数有权轮换密钥的证书，如上所述。但是，在设置自动轮换以使用 Lambda 函数之前，请确保该函数的配置设置将以下四个字符添加到 `EXCLUDE_CHARACTERS` 环境变量的值中。

   ```
   ;.:+{}*&,%\
   ```

   AWS DMS 不允许在用于端点凭证的密码中使用这些字符。配置 Lambda 函数以排除这些字符，可以防止 AWS Secrets Manager 生成这些字符作为其轮换密码值的一部分。将自动轮换设置为使用 Lambda 函数后， AWS Secrets Manager 立即轮换密钥以验证您的密钥配置。
**注意**  
根据数据库引擎配置的不同，数据库可能无法获取轮换后的凭证。在这种情况下，您需要手动重新启动任务以刷新凭证。

1. 查看您的密钥并将其存储在中 AWS Secrets Manager。然后，您可以在中按其友好名称查找每个密钥 AWS Secrets Manager，然后检索密钥 ARN 作为值，`SecretsManagerSecretId`或`SecretsManagerOracleAsmSecretId`根据需要检索该密钥 ARN，以验证对终端节点数据库连接和 Oracle ASM（如果使用）的访问权限。

**创建秘密访问策略和角色来设置您的`SecretsManagerAccessRoleArn`或`SecretsManagerOracleAsmAccessRoleArn`，这 AWS DMS AWS Secrets Manager 允许访问您的相应密钥**

1. 登录 AWS 管理控制台 并打开 AWS Identity and Access Management (IAM) 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 选择**策略**，然后选择**创建策略**。

1. 选择 **JSON** 并输入以下策略，以启用对密钥的访问和解密。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "secretsmanager:GetSecretValue",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

   此处，`secret_arn` 是密钥的 ARN，您可以根据需要从 `SecretsManagerSecretId` 或 `SecretsManagerOracleAsmSecretId` 中获取，`kms_key_arn` 是您用于加密密钥的 AWS KMS 密钥的 ARN，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "secretsmanager:GetSecretValue",
               "Resource": "arn:aws:secretsmanager:us-east-2:123456789012:secret:MySQLTestSecret-qeHamH"
           },
           {
                "Effect": "Allow",
                "Action": [
                           "kms:Decrypt",
                           "kms:DescribeKey"
                         ],
                "Resource": "arn:aws:kms:us-east-2:123456789012:key/761138dc-0542-4e58-947f-4a3a8458d0fd"
           }
        ]
   }
   ```

------
**注意**  
如果您使用由创建的默认加密密钥 AWS Secrets Manager，则无需为指定 AWS KMS 权限`kms_key_arn`。  
如果您希望您的策略提供对两个密钥的访问权限，只需为另一个密钥指定一个额外的 JSON 资源对象即可*secret\$1arn*。  
如果您的密钥位于不同账户中，那么 `SecretsManagerAccessRoleArn` 角色需要额外的策略来验证跨账户密钥。对于此类使用案例，请将操作 `secretsmanager:DescribeSecret` 添加到策略中。有关设置跨账户密钥的更多详细信息，请参阅[其他账户中的用户对 S AWS ecrets Manager 密钥的权限](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html)。

1. 查看并创建具友好名称和描述（可选）的策略。

1. 选择**角色**，然后选择**创建角色**。

1. 选择 **AWS 服务**作为可信实体的类型。

1. 从服务列表中选择 **DMS** 作为可信服务，然后选择**下一步：权限**。

1. 查找并附加您在步骤 4 中创建的策略，然后继续添加所有标签并查看角色。此时，编辑该角色的信任关系，以使用您的 AWS DMS 区域服务主体作为可信实体。此主体采用以下格式。

   ```
   dms.region-name.amazonaws.com
   ```

   此处，*`region-name`* 是区域的名称，如 `us-east-1`。因此，该 AWS DMS 区域的区域服务负责人随之而来。

   ```
   dms.us-east-1.amazonaws.com
   ```

1. 编辑完角色的可信实体后，创建具友好名称和描述（可选）的角色。现在，您可以在 IAM 中按友好名称查找新角色，然后检索角色 ARN 作为 `SecretsManagerAccessRoleArn` 或 `SecretsManagerOracleAsmAccessRoleArn` 值，以验证端点数据库连接。

**在专用子网中将密钥管理器与复制实例一起使用**

1. 创建密钥管理器 VPC 端点并记下该端点的 DNS。有关创建密钥管理器 VPC 端点的更多信息，请参阅《AWS Secrets Manager 用户指南》中的[通过 VPC 端点连接到 Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint)[]()**。

1. 对于 VPC 端点安全组入口规则，允许来自复制实例的私有 IP 地址或连接到复制实例的安全组的 HTTPS 流量。

1. 对于复制实例安全组出站规则，允许目的地为 `0.0.0.0/0` 的所有流量。

1. 设置端点额外连接属性，`secretsManagerEndpointOverride=secretsManager endpoint DNS`，以提供密钥管理器 VPC 端点 DNS，如以下示例所示。

   ```
   secretsManagerEndpointOverride=vpce-1234a5678b9012c-12345678.secretsmanager.eu-west-1.vpce.amazonaws.com
   ```