为 AWS Secrets Manager 设置交替用户轮换 - AWS Secrets Manager

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

为 AWS Secrets Manager 设置交替用户轮换

在本教程中,您将学习如何为包含数据库凭证的秘密设置交替用户轮换。Alternating users rotation(交替用户轮换)是一种轮换策略,在该策略中,Secrets Manager 将克隆用户,然后替换被更新的那些用户凭证。如果您需要为密钥实现高可用性,则此策略是一个不错的选择,因为其中一个交替用户拥有数据库的最新凭证,而另一个则正在更新。有关更多信息,请参阅轮换策略:交替用户

要设置交替用户轮换,您需要两个秘密:

  • 其中一个秘密包含您想轮换的凭证。

  • 具有管理员凭证的第二个密钥。

    此用户有权克隆第一个用户并更改第一个用户的密码。在本教程中,您将让 Amazon RDS 为管理员用户创建此密钥。Amazon RDS 还会管理管理员密码轮换。有关更多信息,请参阅AWS Secrets Manager 密钥的托管轮换

本教程的第一部分内容是介绍如何设置真实环境。为了向您展示轮换的工作原理,本教程使用了一个示例 Amazon RDS MySQL 数据库。为了安全起见,数据库位于限制入站互联网访问的 VPC 中。要通过互联网从本地电脑连接到数据库,请使用堡垒主机,它是 VPC 中可以连接到数据库的服务器,但也允许从互联网进行 SSH 连接。本教程中的堡垒主机是 Amazon EC2 实例,该实例的安全组会阻止其他类型的连接。

完成本教程后,我们建议您清理教程中的资源。请勿在生产环境中使用它们。

Secrets Manager 轮换使用 AWS Lambda 函数来更新密钥和数据库。有关使用 Lambda 函数的成本的信息,请参阅 定价

权限

本教程的先决条件为,您需要对 AWS 账户 的管理权限。在生产环境中,最佳实践是为每个步骤使用不同的角色。例如,具有数据库管理员权限的角色将创建 Amazon RDS 数据库,而具有网络管理员权限的角色将设置 VPC 和安全组。在执行教程步骤时,我们建议您继续使用相同身份。

有关如何在生产环境中设置权限的信息,请参阅 AWS Secrets Manager 的身份验证和访问控制

先决条件

先决条件 A:Amazon VPC

在此步骤中,您将创建可在其中启动 Amazon RDS 数据库和 Amazon EC2 实例的 VPC。在后续步骤中,您将使用计算机通过互联网连接到堡垒机,然后连接到数据库,因此您需要允许来自 VPC 的流量。为此,Amazon VPC 会将互联网网关连接到 VPC 并在路由表中添加路由,以将发往 VPC 外部的流量发送到互联网网关。

在 VPC 中,您可以创建一个 Secrets Manager 端点和一个 Amazon RDS 端点。在稍后的步骤中设置自动轮换时,Secrets Manager 会在 VPC 内创建 Lambda 轮换函数,以便它可以访问数据库。Lambda 轮换函数还会调用 Secrets Manager 来更新密钥,并调用 Amazon RDS 来获取数据库连接信息。通过在 VPC 内创建端点,您可以确保从 Lambda 函数到 Secrets Manager 和 Amazon RDS 的调用不会离开 AWS 基础设施。相反,这些调用将被路由到 VPC 内的端点。

创建 VPC
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 选择 Create VPC(创建 VPC)。

  3. Create VPC(创建 VPC)页面上,选择 VPC and more(VPC 等)。

  4. Name tag auto-generation(名称标签自动生成)下的 Auto-generate(自动生成)下,输入 SecretsManagerTutorial

  5. 对于 DNS options(DNS 选项),请同时选择 Enable DNS hostnamesEnable DNS resolution

  6. 选择 Create VPC(创建 VPC)。

在 VPC 内创建 Secrets Manager 端点
  1. 在 Amazon VPC 控制台的 Endpoints(端点)下,选择 Create Endpoint(创建端点)。

  2. Endpoint settings(端点设置)下,为 Name(名称)输入 SecretsManagerTutorialEndpoint

  3. Services(服务)下,输入 secretsmanager 以筛选列表,然后在您的 AWS 区域 中选择 Secrets Manager 端点。例如,在美国东部(弗吉尼亚北部),选择 com.amazonaws.us-east-1.secretsmanager

  4. 对于 VPC,选择 vpc**** (SecretsManagerTutorial)

  5. 对于 Subnets(子网),选择所有 Availability Zones(可用性区域),然后对于每个区域,选择要包含的 Subnet ID(子网 ID)。

  6. 对于 IP address type(IP 地址类型),选择 IPv4

  7. 对于 Security groups(安全组),选择默认安全组。

  8. 对于 Policy(策略),选择 Full access

  9. 选择 Create endpoint(创建端点)。

在 VPC 内创建 Amazon RDS 端点
  1. 在 Amazon VPC 控制台的 Endpoints(端点)下,选择 Create Endpoint(创建端点)。

  2. Endpoint settings(端点设置)下,为 Name(名称)输入 RDSTutorialEndpoint

  3. Services(服务)下,输入 rds 以筛选列表,然后在您的 AWS 区域 中选择 Amazon RDS 端点。例如,在美国东部(弗吉尼亚北部),选择 com.amazonaws.us-east-1.rds

  4. 对于 VPC,选择 vpc**** (SecretsManagerTutorial)

  5. 对于 Subnets(子网),选择所有 Availability Zones(可用性区域),然后对于每个区域,选择要包含的 Subnet ID(子网 ID)。

  6. 对于 IP address type(IP 地址类型),选择 IPv4

  7. 对于 Security groups(安全组),选择默认安全组。

  8. 对于 Policy(策略),选择 Full access

  9. 选择 Create endpoint(创建端点)。

先决条件 B:Amazon EC2 实例

您在后续步骤中创建的 Amazon RDS 数据库将位于 VPC 中,因此要访问它,您需要堡垒主机。该堡垒主机也位于 VPC 中,但在稍后步骤中,您将配置一个安全组,以允许本地计算机使用 SSH 连接到堡垒主机。

为堡垒主机创建 EC2 实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 选择 Instances(实例),然后选择 Launch Instances(启动实例)。

  3. Name and tags(名称和标签)下,对于 Name(名称),输入 SecretsManagerTutorialInstance

  4. Application and OS Images(应用程序和操作系统映像)下,保留默认值 Amazon Linux 2 AMI (HMV) Kernel 5.10

  5. Instance type(实例类型)下,保留默认值 t2.micro

  6. Key pair(密钥对)下,选择 Create key pair(创建密钥对)。

    Create key pair(创建密钥对)对话框中,对于 Key pair name(密钥对名称),输入 SecretsManagerTutorialKeyPair,然后选择 Create key pair(创建密钥对)。

    此时会自动下载密钥对。

  7. Network settings(网络设置)下,选择 Edit(编辑),然后执行以下操作:

    1. 对于 VPC,选择 vpc-**** SecretsManagerTutorial

    2. 对于 Auto-assign Public IP(自动分配公有 IP),选择 Enable

    3. 对于 Firewall(防火墙),选择 Select existing security group(选择现有安全组)。

    4. 对于 Common security groups(常见安全组),选择 default

  8. 选择 Launch instance (启动实例)

先决条件 C:Amazon RDS 数据库和管理员凭证的 Secrets Manager 密钥

在此步骤中,您将创建一个 AmazonRDS MySQL 数据库并对其进行配置,以便 AmazonRDS 创建包含管理员凭证的密钥。然后,Amazon RDS 会自动为您管理管理员密钥的轮换。有关更多信息,请参阅托管轮换

在创建数据库过程中,请指定您在上一步中创建的堡垒主机。然后,Amazon RDS 会设置安全组,以便数据库和实例能够相互访问。您可向连接到实例的安全组添加规则,以允许您的本地计算机也连接到该实例。

使用包含管理员凭证的 Secrets Manager 密钥创建 Amazon RDS 数据库
  1. 在 Amazon RDS 控制台中,选择 Create database(创建数据库)。

  2. Engine options(引擎选项)部分,为 Engine type(引擎类型)选择 MySQL

  3. Templates(模板)部分,选择 Free tier

  4. Settings(设置)部分,执行以下操作:

    1. 对于 DB instance identifier(数据库实例标识符),输入 SecretsManagerTutorial

    2. 凭证设置下,选择管理 AWS Secrets Manager 中的主凭证

  5. Connectivity(连接)部分,对于 Computer resource(计算机资源),选择 Connect to an EC2 computer resource(连接到 EC2 计算机资源),然后对于 EC2 Instance(EC2 实例),选择 SecretsManagerTutorialInstance

  6. 选择 Create database(创建数据库)。

先决条件 D:允许本地计算机连接到 EC2 实例

在此步骤中,您将在“先决条件 B”中创建的 EC2 实例配置为允许本地计算机连接到该实例。为此,您将编辑 Amazon RDS 在“先决条件 C”中添加的安全组,使其包含允许您的计算机的 IP 地址与 SSH 连接的规则。该规则允许本地计算机(通过当前 IP 地址识别)通过 Internet 使用 SSH 连接到堡垒主机。

允许本地计算机连接到 EC2 实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在 EC2 实例 SecretsManagerTutorialInstance 上,在 Security(安全)选项卡的 Security groups(安全组)下选择 sg-*** (ec2-rds-X)

  3. Input rules(输入规则)下,选择Edit inbound rules(编辑入站规则)。

  4. 选择 Add rule(添加规则),然后对该规则执行以下操作:

    1. 对于类型,选择 SSH

    2. 对于 Source type(源类型),选择 My IP

步骤 1:创建 Amazon RDS 数据库用户

首先,您需要一个用户,其凭证将被存储在秘密中。要创建用户,请使用管理员凭证登录 Amazon RDS 数据库。为简单起见,在本教程中,您将创建具有数据库完全权限的用户。在生产环境中,这并不常见,建议您遵循最低权限原则。

要连接到数据库,请使用 MySQL 客户端工具。在本教程中,您将使用基于 GUI 的应用程序 MySQL Workbench。要安装 MySQL Workbench,请参阅下载 MySQL Workbench

要连接到数据库,请在 MySQL Workbench 中创建连接配置。对于配置,您需要获得来自 Amazon EC2 和 Amazon RDS 的一些信息。

在 MySQL Workbench 中创建数据库连接
  1. 在 MySQL Workbench 中,选择 MySQL Connections(MySQL 连接)旁边的 (+) 按钮。

  2. Setup New Connection(设置新连接)对话框中,执行以下操作:

    1. 对于 Connection Name(连接名称),输入 SecretsManagerTutorial

    2. 对于 Connection Method(连接方法),选择 Standard TCP/IP over SSH

    3. Parameters(参数)选项卡上,执行以下操作:

      1. 对于 SSH Hostname(SSH 主机名),输入 Amazon EC2 实例的公有 IP 地址。

        您可以通过选择实例 SecretsManagerTutorialInstance,在 Amazon EC2 控制台上查找该 IP 地址。复制 Public IPv4 DNS(公有 IPv4 DNS)下的 IP 地址。

      2. 对于 SSH Username(SSH 用户名),输入 ec2-user

      3. 对于 SSH Keyfile(SSH 密钥文件),选择您在之前的先决条件中下载的密钥对文件 SecretsManagerTutorialKeyPair.pem

      4. 对于 MySQL Hostname(MySQL 主机名),输入 Amazon RDS 端点地址。

        您可以在 Amazon RDS 控制台上通过选择数据库实例 secretsmanagertutorialdb 查找端点地址。复制 Endpoint(端点)下的地址。

      5. 对于 Username(用户名),输入 admin

    4. 选择 OK(确定)

检索管理员密码
  1. 在 Amazon RDS 控制台中,导航到您的数据库。

  2. Configuration(配置)选项卡的 Master Credentials ARN(主凭证 ARN)下,选择 Manage in Secrets Manager(在 Secrets Manager 中管理)。

    此时将打开 Secrets Manager 控制台。

  3. 在密钥详细信息页面上,选择 Retrieve secret value(检索密钥值)。

  4. 密码显示在 Secret value(密钥值)部分中。

创建数据库用户
  1. 在 MySQL Workbench 中,选择连接 SecretsManagerTutorial

  2. 输入从密钥中检索到的管理员密码。

  3. 在 MySQL Workbench 中,在 Query(查询)窗口中,输入以下命令(包括强密码),然后选择 Execute(执行)。

    CREATE DATABASE myDB; CREATE USER 'appuser'@'%' IDENTIFIED BY 'EXAMPLE-PASSWORD'; GRANT ALL PRIVILEGES ON myDB . * TO 'appuser'@'%';

    Output(输出)窗口中,您会看到这些命令执行成功。

步骤 2:为用户凭证创建秘密

接下来,您将创建秘密,用于存储您刚创建的用户凭证。这是您将要轮换的秘密。启用自动轮换,要指示交替用户策略,您应选择一个单独的超级用户秘密,它应有权限更改第一个用户的密码。

  1. https://console.aws.amazon.com/secretsmanager/ 打开 Secrets Manager 控制台

  2. 选择 Store a new secret (存储新密钥)

  3. Choose secret type(选择密钥类型)页面上,执行以下操作:

    1. 对于 Secret type(秘密类型),选择 Credentials for Amazon RDS database(Amazon RDS 数据库凭证)。

    2. 对于 Credentials(凭证),输入用户名 appuser,以及您为使用 MySQL Workbench 创建的数据库用户输入的密码。

    3. 对于 Database(数据库),选择 secretsmanagertutorialdb

    4. 选择 Next(下一步)。

  4. Configure secret(配置密钥)页面上,对于 Secret name(密钥名称),输入 SecretsManagerTutorialAppuser,然后选择 Next(下一步)。

  5. Configure rotation(配置轮换)页面上,执行以下操作:

    1. 启用 Automatic rotation(自动轮换)。

    2. 对于 Rotation schedule(轮换计划),设置计划 Days(天数):2 天,以及 Duration(持续时间):2h。使 Rotate immediately(立即轮换)处于已选择状态。

    3. 对于 Rotation function(轮换函数),选择 Create a rotation function(创建轮换函数),然后对于函数名称,输入 tutorial-alternating-users-rotation

    4. 对于轮换策略,选择交替用户,然后在管理员凭证密钥下,选择名为 rds!cluster...,并且描述包含您在本教程 secretsmanagertutorial 中所创建数据库的名称的密钥,例如 Secret associated with primary RDS DB instance: arn:aws:rds:Region:AccountId:db:secretsmanagertutorial

    5. 选择 Next(下一步)。

  6. Review(检查)页面上,选择 Store(存储)。

    Secrets Manager 将返回到秘密详细信息页面。您可以在该页面顶部查看轮换配置状态。Secrets Manager 使用 CloudFormation 创建资源,如 Lambda 轮换函数和运行 Lambda 函数的执行角色。当 CloudFormation 完成后,横幅将更改为 Secret scheduled for rotation(秘密已计划轮换)。第一次轮换已完成。

步骤 3:测试已轮换的秘密

在密钥轮换后,您可以检查该密钥是否包含有效凭证。秘密中的密码已从原始凭证发生更改。

从秘密中检索新密码
  1. https://console.aws.amazon.com/secretsmanager/ 打开 Secrets Manager 控制台

  2. 选择 Secrets(秘密),然后选择秘密 SecretsManagerTutorialAppuser

  3. Secret details(秘密详细信息)页面上,向下滚动并选择 Retrieve secret value(检索秘密值)。

  4. Key/value(键/值)表中,为 password 复制 Secret value(秘密值)。

测试凭证
  1. 在 MySQL Workbench 中,右键单击连接 SecretsManagerTutorial,然后选择 Edit Connection(编辑连接)。

  2. Manage Server Connections(管理服务器连接)对话框中,对于 Username(用户名),输入 appuser,然后选择 Close(关闭)。

  3. 返回 MySQL 工作台,选择连接 SecretsManagerTutorial

  4. Open SSH Connection(打开 SSH 连接)对话框中,对于 Password(密码),粘贴您从秘密中检索到的密码,然后选择 OK(确定)。

    如果凭证有效,则 MySQL Workbench 将打开至数据库的设计页面。

这表明秘密轮换是成功的。秘密中的凭证已更新,它是用于连接到数据库的有效密码。

步骤 4:清理资源

如果您想尝试另一种轮换策略单用户轮换,请跳过清理资源,然后转到 为 AWS Secrets Manager 设置单用户轮换

否则,为了避免潜在费用,并删除有权访问互联网的 EC2 实例,请删除您在本教程及其先决条件中创建的以下资源:

  • Amazon RDS 数据库实例。有关说明,请参阅《Amazon RDS 用户指南》中的删除数据库实例

  • Amazon EC2 实例。有关说明,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的终止实例

  • Secrets Manager 秘密 SecretsManagerTutorialAppuser。有关说明,请参阅 删除 AWS Secrets Manager 密钥

  • Secrets Manager 端点。有关说明,请参阅《AWS PrivateLink 指南》中的删除 VPC 端点

  • VPC 端点。有关说明,请参阅《AWS PrivateLink 指南》中的删除 VPC

后续步骤