为 Amazon Secrets Manager 设置单用户轮换
在本教程中,您将学习如何为包含数据库管理员凭证的秘密设置单用户轮换。单用户轮换是一种轮换策略,在该策略中,Secrets Manager 将同时在秘密和数据库中更新单个用户的凭证。有关更多信息,请参阅轮换策略:单用户。
本教程的大部分内容是介绍如何建立真实环境。为了向您展示轮换的工作原理,本教程使用了一个示例 Amazon RDS MySQL 数据库。为了安全起见,数据库位于不允许互联网访问的 VPC 中。要通过互联网从本地电脑连接到数据库,请使用堡垒主机,它是 VPC 中可以连接到数据库的服务器,但也允许从互联网进行 SSH 连接。本教程中的堡垒主机是 Amazon EC2 实例,该实例的安全组会阻止其他类型的连接。
作为本教程先决条件的组成部分,您还可以创建一个包含数据库管理员凭证的秘密。该秘密最初没有开启轮换。在本教程中,您将学习如何启用自动轮换。
Secrets Manager 轮换使用 Amazon Lambda 函数来更新密钥和数据库。有关使用 Lambda 函数的成本的信息,请参阅 定价。
目录
权限
本教程的先决条件为,您需要对 Amazon Web Services 账户 的管理权限。在生产环境中,最佳实践是为每个步骤使用不同的角色。例如,具有数据库管理员权限的角色将创建 Amazon RDS 数据库,而具有网络管理员权限的角色将设置 VPC 和安全组。在执行教程步骤时,我们建议您继续使用相同身份。
有关如何在生产环境中设置权限的信息,请参阅 Amazon Secrets Manager 的身份验证和访问控制。
先决条件
在此教程中,您需要以下内容:
先决条件 A:Amazon RDS 数据库、Amazon VPC 和 Secrets Manager 秘密
对于本教程,您将配合使用 Amazon CloudFormation 与提供的模板创建 CloudFormation 堆栈,而不是通过控制台创建这些资源。有关 CloudFormation 和模板的更多信息,请参阅 Amazon CloudFormation 概念。
获取 CloudFormation 模板
-
转到 使用 Amazon CloudFormation 为 Amazon RDS MySQL 数据库实例创建 Amazon Secrets Manager 密钥,然后将代码保存到新文件中。您可以使用 JSON 或 YAML。
通过模板创建堆栈
-
打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
在 Stacks(堆栈)下,选择 Create stack(创建堆栈),然后选择 With new resources(使用新资源)。
-
在 Create stack(创建堆栈)页面上,对于 Prepare template(准备模板),选择Template is ready(模板已就绪)。
-
对于 Template source(模板来源),选择 Upload a template file(上载模板文件)。
-
选择 Choose file(选择文件),然后选择您保存的文件。
-
选择 Next(下一步)。
-
在 Specify stack details(指定堆栈详细信息)页面上,为堆栈
SecretsManagerRotationTutorial
命名,然后选择 Next(下一步)。 -
在 Configure stack options(配置堆栈选项) 页面上,请选择 Next(下一步)。
-
在 Review(查看)页面上,选择 Create stack(创建堆栈)。
CloudFormation 将在控制台中打开新堆栈,然后开始在模板中创建资源。这一过程耗时最多 30 分钟。您可以在Events(事件)下查看该操作在流程中的进度。选择刷新按钮可以更新事件。
在堆栈完成后,您可以在 Logical ID(逻辑 ID)下通过 Status CREATE_COMPLETE(状态 CREATE_COMPLETE)查看 SecretsManagerRotationTutorial。
先决条件 B:互联网网关
对于本教程,您需要创建互联网网关,并将其附加到 VPC,以允许流量传出 VPC。您可以在路由表中创建路由,以将发往 VPC 外部的流量发送到互联网网关。有关更多信息,请参阅使用互联网网关将子网连接到互联网。
创建互联网网关
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
选择 Internet Gateways(互联网网关),然后选择 Create internet gateway(创建互联网网关)。
-
在 Create internet gateway(创建互联网网关)页面上,对于 Name tag(名称标签),输入
SecretsManagerTutorialGateway
,然后选择Create internet gateway(创建互联网网关)。 -
在 igw-**** / SecretsManagerTutorialGateway 页面上的绿色横幅中,选择 Attach to a VPC(附加到 VPC)。
-
在Attach to VPC(附加到 VPC)页面上,对于 Available VPCs(可用 VPC),选择
vpc-**** - SecretsManagerTutorial
,然后选择 Attach internet gateway(连接互联网网关)。
为互联网网关添加路由
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
选择 Route tables(路由表),然后选择与 VPC
vpc-**** | SecretsManagerTutorial
相关联到的 Route table ID(路由表 ID)。您可能需要滚动才能看到该表中的 VPC 列。 -
选择 Actions(操作),然后选择 Edit routes(编辑路由)。
-
在 Edit routes(编辑路由)页面上,选择 Add Route(添加路由),然后执行以下操作:
-
在 Destination(目标位置)字段,输入
0.0.0.0/0
。 -
对于 Target(目标),选择 Internet Gateway(互联网网关),然后选择
igw-**** (SecretsManagerTutorialGateway)
。 -
选择 Save changes(保存更改)。
-
先决条件 C:安全组
创建安全组,以允许入站 SSH 流量访问您将在后面步骤中创建的 Amazon EC2 堡垒主机。
允许 SSH 访问堡垒主机
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
选择 Security Groups(安全组),然后选择 Create Security Group(创建安全组)。
-
对于安全组名称,输入
SecretsManagerTutorialAccess
。 -
对于描述,输入
Allows SSH access to bastion host
。 -
对于 VPC,选择
vpc-**** (SecretsManagerTutorial)
。您可能需要删除预填充文本,以查看其他选择。 -
在 Inbound Rules(入站规则)下,选择 Add Rule(添加规则)。
-
对于入站规则 1,执行以下操作:
-
对于类型,选择
SSH
。 -
对于 Source(源),选择
My IP
。
-
-
选择Create security group(创建安全组)。
先决条件 D:Amazon EC2 实例
要访问 VPC 中的数据库,您可以使用堡垒主机。堡垒主机也在 VPC 中,但它允许您的本地电脑使用 SSH 与它连接。您可以通过堡垒主机访问数据库。
为堡垒主机创建 EC2 实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
选择 Instances(实例),然后选择 Launch Instances(启动实例)。
-
在 Step 1(步骤 1)页面上,选择原定设置的
Amazon Linux 2 AMI (HMV) Kernel 5.10
,然后选择 Select(选择)。 -
在 Step 2(步骤 2)页面上,选择原定设置的
t2.micro
,然后选择 Next: Configure Instance Details(下一步:配置实例详细信息)。 -
在 Step 3 页面中,执行以下操作:
-
对于 Network(网络),选择
vpc-**** SecretsManagerTutorial
。 -
对于 Auto-assign Public IP(自动分配公有 IP),选择
Enable
。 -
选择下一步:添加存储。
-
-
在 Step 4(步骤 4)页面上,选择 Next: Add Tags(下一步:添加标签)。
-
在 Step 5(步骤 5)页面上,选择“Add Tag”(添加标签)。
对于“Key”(键),输入
Name
,对于 Value(值),输入SecretsManagerTutorialInstance
,然后选择 Next: Configure Security Group(下一步:配置安全组)。 -
在 Step 6(步骤 6)页面上,对于 Assign a security group(分配安全组),选择 Select an existing security group(选择现有安全组)。
-
对于“Security group ID”(安全组 ID),选择名称为
default
和SecretsManagerTutorialAccess
的安全组,然后选择 Review and Launch(审核并启动)。 -
在 Step 7(步骤 7)页面上,选择 Launch(启动)。
-
在 Select an existing key pair(选择现有密钥对)对话框中,执行以下操作:
-
选择 Create a new key pair(创建新密钥对)。
-
对于 Key pair name(密钥对名称),输入
SecretsManagerTutorialKeyPair
。 -
选择 Download Key Pair(下载密钥对)。在后面的步骤中,您将使用此私有密钥文件连接到实例。
-
选择 Launch Instances。
-
先决条件 E:MySQL Workbench
要连接到数据库,请使用 MySQL 客户端工具。在本教程中,您将使用基于 GUI 的应用程序 MySQL Workbench。
要安装 MySQL Workbench,请参阅下载 MySQL Workbench
要连接到数据库,首先在 MySQL Workbench 中创建连接配置。对于配置,您需要获得来自 Amazon EC2 和 Amazon RDS 的一些信息。
在 MySQL Workbench 中创建数据库连接
-
在 MySQL Workbench 中,选择 MySQL Connections(MySQL 连接)旁边的 (+) 按钮。
-
在 Setup New Connection(设置新连接)对话框中,执行以下操作:
-
对于 Connection Name(连接名称),输入
SecretsManagerTutorial
。 -
对于 Connection Method(连接方法),选择
Standard TCP/IP over SSH
。 -
在 Parameters(参数)选项卡上,执行以下操作:
-
对于 SSH Hostname(SSH 主机名),输入 Amazon EC2 实例的公有 IP 地址。
您可以通过选择实例 SecretsManagerTutorialInstance,在 Amazon EC2 控制台上查找该 IP 地址。复制 Public IPv4 DNS(公有 IPv4 DNS)下的 IP 地址。
-
对于 SSH Username(SSH 用户名),输入
ec2-user
。 -
对于 SSH Keyfile(SSH 密钥文件),选择您在之前的先决条件中下载的密钥对文件 SecretsManagerTutorialKeyPair.pem。
-
对于 MySQL Hostname(MySQL 主机名),输入 Amazon RDS 端点地址。
您可以在 Amazon RDS 控制台上通过选择数据库实例 secretsmanagertutorialdb 查找端点地址。复制 Endpoint(端点)下的地址。
-
对于 Username(用户名),输入
admin
。
-
-
选择 OK(确定)。
-
步骤 1:使用原始密码连接
第一步是检查秘密中的信息是否包含数据库的有效凭证。
从秘密中检索密码
在 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台 -
选择 Secrets(秘密),然后选择秘密
SecretsManagerTutorialAdmin-****
。 -
在 Secret details(秘密详细信息)页面上,向下滚动并选择 Retrieve secret value(检索秘密值)。
-
在 Key/value(键/值)表中,为
password
复制 Secret value(秘密值)。
测试凭证
-
在 MySQL Workbench 中,选择连接 SecretsManagerTutorial。
-
在 Open SSH Connection(打开 SSH 连接)对话框中,对于 Password(密码),粘贴您从秘密中检索到的密码,然后选择 OK(确定)。
第一次连接时,您可能会看到一个关于服务器指纹的警告对话框。选择 OK(确定)以继续。
如果凭证有效,则 MySQL Workbench 将打开至数据库的设计页面。
步骤 2:创建 Secrets Manager 端点
下一步是在 VPC 中创建 Secrets Manager 端点。在设置自动轮换时,Secrets Manager 会在 VPC 内创建 Lambda 轮换函数,以便它可以访问数据库。Lambda 轮换函数还会调用 Secrets Manager。通过在 VPC 内创建 Secrets Manager 端点,您可以确保从 Lambda 到 Secrets Manager 的调用不会离开 Amazon 基础设施。相反,这些调用将被路由到 VPC 内的 Secrets Manager 端点。
在 VPC 内创建 Secrets Manager 端点
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在 Endpoints(端点)下,选择 Create Endpoint(创建端点)。
-
向下滚动到 Services(服务),输入
secretsmanager
以筛选列表,然后在您的 Amazon Web Services 区域 中选择 Secrets Manager 端点。例如,在美国东部(弗吉尼亚北部),选择com.amazonaws.us-east-1.secretsmanager
。 -
对于 VPC,选择
vpc**** (SecretsManagerTutorial)
。 -
对于 Subnets(子网),选择所有 Availability Zones(可用性区域),然后对于每个区域,选择要包含的 Subnet ID(子网 ID)。
-
对于 Security groups(安全组),选择默认安全组。
-
对于 Policy(策略),选择
Full access
。 -
选择 Create endpoint(创建端点)。
步骤 3:轮换秘密
现在,您已准备好启用轮换。您可以开始立即轮换,这样在您保存秘密时,Secrets Manager 将立即轮换秘密。您还可以启用自动轮换,这样将在协调世界时午夜至凌晨 2:00 之间每 10 天轮换一次秘密。
启用自动轮换
在 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台 -
打开秘密 SecretsManagerTutorialAdmin-a1b2c3d4e5f6,向下滚动到 Rotation configuration(轮换配置),然后选择 Edit rotation(编辑轮换)。
-
在 Edit rotation configuration(编辑轮换配置)对话框中,启用 Automatic rotation(自动轮换)。
-
对于 Rotation schedule(轮换计划),设置计划 Days(天数):
10
天,以及 Duration(持续时间):2h
。使 Rotate immediately(立即轮换)处于已选择状态。 -
对 Rotation function(轮换函数),执行以下操作:
-
选择 Create a rotation function(创建轮换函数),然后对于 Lambda rotation function(Lambda 轮换函数),输入
tutorial-single-user-rotation
。 -
Secrets Manager 将创建名为 SecretsManagertutorial-single-user-rotation 的 Lambda 轮换函数。
-
对于 Use separate credentials(使用单独的凭证),选择
No
。
-
-
选择 Save(保存)。
Secrets Manager 将返回到秘密详细信息页面。Secrets Manager 使用 CloudFormation 创建资源,如 Lambda 轮换函数和运行 Lambda 函数的执行角色。您可以在秘密详细信息页面的顶部查看 CloudFormation 资源的状态。当 CloudFormation 完成资源部署后,横幅将更改为 Secret scheduled for rotation(秘密已计划轮换)。现在 Secrets Manager 将开始第一次轮换。
步骤 4:测试轮换的密码
在第一次密钥轮换(可能需要几秒钟)之后,您可以检查秘密是否仍包含有效凭证。秘密中的密码已从原始凭证发生更改。
从秘密中检索新密码
在 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台 -
选择 Secrets(秘密),然后选择秘密
SecretsManagerTutorialAdmin-****
。 -
在 Secret details(秘密详细信息)页面上,向下滚动并选择 Retrieve secret value(检索秘密值)。
-
在 Key/value(键/值)表中,为
password
复制 Secret value(秘密值)。
测试凭证
-
在 MySQL Workbench 中,选择连接 SecretsManagerTutorial。
-
在 Open SSH Connection(打开 SSH 连接)对话框中,对于 Password(密码),粘贴您从秘密中检索到的密码,然后选择 OK(确定)。
如果凭证有效,则 MySQL Workbench 将打开至数据库的设计页面。
这表明秘密轮换是成功的。秘密中已更新的密码是用于连接到数据库的有效密码。您已经完成了自动轮换的设置,下一次轮换将在 10 天后发生。
步骤 5:清理资源
如果您想尝试另一种轮换策略,交替用户轮换,则请跳过清理资源,然后转到 为 Amazon Secrets Manager 设置交替用户轮换。
否则,为了避免潜在的费用,并删除有权访问互联网的 EC2 实例,请删除您在本教程中创建的以下资源:
-
Amazon EC2 实例。有关说明,请参阅终止实例。
-
Secrets Manager 端点。有关说明,请参阅删除 VPC 终端节点。
-
互联网网关。首先将互联网网关与您的 VPC 断开,然后删除互联网网关。
-
Amazon CloudFormation 堆栈。有关说明,请参阅删除堆栈。
后续步骤
-
了解如何在您的应用程序中检索秘密。请参阅从 Amazon Secrets Manager 中检索密钥。
-
了解如何使用 Amazon CloudFormation 创建能够自动轮换的秘密,请参阅《Amazon CloudFormation 用户指南》中的 AWS::SecretsManager::RotationSchedule。
-
了解其他轮换计划。请参阅Secrets Manager 轮换中的计划表达式。