使用密钥访问 Amazon Database Migration Service 端点 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用密钥访问 Amazon Database Migration Service 端点

对于 Amazon DMS,密钥是一种可用于表示一组用户凭证的加密密钥,这些凭证通过秘密身份验证,对支持的 Amazon DMS 源端点或目标端点的数据库连接进行身份验证。对于同时使用 Oracle Automatic Storage Management (ASM) 的 Oracle 端点,Amazon DMS 需要一个额外的密钥来表示访问 Oracle ASM 的用户凭证。

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

注意

不能使用由 Amazon RDS Aurora 管理的主凭证。这些凭证不包括 Amazon DMS 建立连接所需的主机或端口信息。而是应创建新用户和密钥。有关创建用户和密钥的信息,请参阅后面的使用 Amazon Web Services Management Console创建密钥和秘密访问角色

有关 Amazon Secrets Manager 的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的 Amazon Secrets Manager 是什么?

在支持的源端点和目标端点上,Amazon DMS 支持对以下本地数据库或 Amazon 托管的数据库进行秘密身份验证:

  • Amazon DocumentDB

  • IBM Db2 LUW

  • Microsoft SQL Server

  • MongoDB

  • MySQL

  • Oracle

  • PostgreSQL

  • Amazon Redshift

  • SAP ASE

要连接到这些数据库中的任何一个,您可以选择在端点设置中输入以下值中的一组,但不能同时输入两组值:

  • 明文值,以使用 UserNamePasswordServerNamePort 设置对数据库连接进行身份验证。对于同时使用 Oracle ASM 的 Oracle 端点,还包括其他明文值,以使用 AsmUserNameAsmPasswordAsmServerName 设置对 ASM 进行身份验证。

  • 使用 SecretsManagerSecretIdSecretsManagerAccessRoleArn 设置的值进行秘密身份验证。对于使用 Oracle ASM 的 Oracle 端点,还包括 SecretsManagerOracleAsmSecretIdSecretsManagerOracleAsmAccessRoleArn 设置的值。这些设置的密钥值可能包括以下参数:

    • SecretsManagerSecretId – 您在 Amazon Secrets Manager 中为访问端点数据库而创建的密钥的完整 Amazon 资源名称 (ARN)、部分 ARN 或友好名称。

    • SecretsManagerAccessRoleArn – 您在 IAM 中为方便 Amazon DMS 代表您访问 SecretsManagerSecretId 密钥而创建的秘密访问角色的 ARN。

    • SecretsManagerOracleAsmSecretId – 您在 Amazon Secrets Manager 中为访问 Oracle ASM 而创建的密钥的完整 Amazon 资源名称 (ARN)、部分 ARN 或友好名称。

    • SecretsManagerOracleAsmAccessRoleArn – 您在 IAM 中为方便 Amazon DMS 代表您访问 SecretsManagerOracleAsmSecretId 密钥而创建的秘密访问角色的 ARN。

    注意

    您还可以使用单个秘密访问角色,为 Amazon DMS 提供对 SecretsManagerSecretId 密钥和 SecretsManagerOracleAsmSecretId 密钥的访问权限。如果您为这两个密钥创建单个秘密访问角色,请确保将此访问角色的相同 ARN 分配给 SecretsManagerAccessRoleArnSecretsManagerOracleAsmAccessRoleArn。例如,如果两个密钥的秘密访问角色的 ARN 分配给了变量 ARN2xsecrets,则可按如下方式设置 ARN:

    SecretsManagerAccessRoleArn = ARN2xsecrets; SecretsManagerOracleAsmAccessRoleArn = ARN2xsecrets;

    有关创建这些值的更多信息,请参阅使用 Amazon Web Services Management Console创建密钥和秘密访问角色

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

提供和验证所需的用户权限
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Identity and Access Management 控制台:https://console.amazonaws.cn/iam/

  2. 选择用户,然后选择用于发出 CreateEndpointModifyEndpoint API 调用的用户 ID

  3. 权限选项卡中选择 {} JSON

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

    { "Statement": [{ "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "SECRET_ACCESS_ROLE_ARN" }, { "Effect": "Allow", "Action": "secretsmanager:DescribeSecret", "Resource": "SECRET_ARN" } ] }
  5. 如果用户没有这些权限,添加权限。

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

  7. 打开终端,通过假设上面使用的角色或用户,使用 Amazon CLI 验证权限的授予是否正确。

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

      aws iam get-role --role-name ROLE_NAME

      ROLE_NAME 替换为 SecretsManagerAccessRole 的名称。

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

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

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

      用户可以是友好名称、部分 ARN 或完整 ARN。有关更多信息,请参阅 describe-secret

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

使用 Amazon Web Services Management Console创建密钥和秘密访问角色

您可以使用 Amazon Web Services Management Console创建用于端点身份验证的密钥,并创建允许 Amazon DMS 代表您访问该密钥的策略和角色。

使用 Amazon Web Services Management Console创建 Amazon DMS 可用于对连接源端点和目标端点的数据库进行身份验证的密钥
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Secrets Manager 控制台:https://console.amazonaws.cn/secretsmanager/

  2. 选择存储新密钥

  3. 存储新密钥页面上,在选择密钥类型下选择其他类型的密钥,然后选择明文

    注意

    从此刻起,这是唯一需要输入明文凭证才能连接到端点数据库的地方。

  4. 明文字段中:

    • 对于身份分配给 SecretsManagerSecretId 的密钥,输入以下 JSON 结构。

      { "username": db_username, "password": db_user_password, "port": db_port_number, "host": db_server_name }
      注意

      这是对端点数据库进行身份验证所需的最少 JSON 成员列表。您可以根据需要将任何其他 JSON 端点设置添加为 JSON 成员,全部采用小写。但是,对于端点身份验证,Amazon 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" }
  5. 选择 Amazon KMS 加密密钥以加密密钥。您可以接受 Amazon Secrets Manager 为服务创建的默认加密密钥,也可以选择自己创建的 Amazon KMS 密钥。

  6. 指定引用此密钥的名称和可选的描述。这是您用作 SecretsManagerSecretIdSecretsManagerOracleAsmSecretId 值的友好名称。

  7. 如果要在密钥中启用自动轮换,那么需要选择或创建一个具备轮换密钥凭证权限(如上所述)的 Amazon Lambda 函数。但是,在设置自动轮换以使用 Lambda 函数之前,请确保该函数的配置设置将以下四个字符添加到 EXCLUDE_CHARACTERS 环境变量的值中。

    ;.:+

    Amazon DMS 不允许在用于端点凭证的密码中使用这些字符。配置 Lambda 函数以排除这些字符,可以防止 Amazon Secrets Manager 生成这些字符作为其轮换密码值的一部分。将自动轮换设置为使用 Lambda 函数后,Amazon Secrets Manager 会立即轮换密钥以验证密钥配置。

    注意

    根据数据库引擎配置的不同,数据库可能无法获取轮换后的凭证。在这种情况下,您需要手动重新启动任务以刷新凭证。

  8. 在 Amazon Secrets Manager 中查看并存储密钥。随后您可以在 Amazon Secrets Manager 中按其友好名称查找每个密钥,然后根据需要检索密钥 ARN 作为 SecretsManagerSecretIdSecretsManagerOracleAsmSecretId 的值,以验证对端点数据库连接和 Oracle ASM(如果使用)的访问。

创建秘密访问策略和角色以设置 SecretsManagerAccessRoleArnSecretsManagerOracleAsmAccessRoleArn,以允许 Amazon DMS 访问 Amazon Secrets Manager 从而访问相应的密钥
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Identity and Access Management (IAM) 控制台:https://console.aws.amazon.com/iam/

  2. 选择策略,然后选择创建策略

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

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

    此处,secret_arn 是密钥的 ARN,您可以根据需要从 SecretsManagerSecretIdSecretsManagerOracleAsmSecretId 中获取,kms_key_arn 是您用于加密密钥的 Amazon KMS 密钥的 ARN,如以下示例所示。

    { "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" } ] }
    注意

    如果您使用 Amazon Secrets Manager 创建的默认加密密钥,则无需为 kms_key_arn 指定 Amazon KMS 权限。

    如果您希望策略提供对两个密钥的访问权限,只需为另一个 secret_arn 指定一个额外的 JSON 资源对象。

    如果您的密钥位于不同账户中,那么 SecretsManagerAccessRoleArn 角色需要额外的策略来验证跨账户密钥。对于此类使用案例,请将操作 secretsmanager:DescribeSecret 添加到策略中。有关设置跨账户密钥的更多详细信息,请参阅不同账户中用户对 Amazon Secrets Manager 密钥的访问权限

  4. 查看并创建具友好名称和描述(可选)的策略。

  5. 选择角色,然后选择创建角色

  6. 选择 Amazon 服务作为可信实体的类型。

  7. 从服务列表中选择 DMS 作为可信服务,然后选择下一步:权限

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

    dms.region-name.amazonaws.com

    此处,region-name 是区域的名称,如 us-east-1。因此,此区域的 Amazon DMS 区域服务主体如下。

    dms.us-east-1.amazonaws.com
  9. 编辑完角色的可信实体后,创建具友好名称和描述(可选)的角色。现在,您可以在 IAM 中按友好名称查找新角色,然后检索角色 ARN 作为 SecretsManagerAccessRoleArnSecretsManagerOracleAsmAccessRoleArn 值,以验证端点数据库连接。

在专用子网中将密钥管理器与复制实例一起使用
  1. 创建密钥管理器 VPC 端点并记下该端点的 DNS。有关创建密钥管理器 VPC 端点的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的通过 VPC 端点连接到 Secrets Manager

  2. 将复制实例安全组附加到密钥管理器 VPC 端点。

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

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

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