如何使用 AWS Secrets Manager Agent 安全博客

新闻动态

14

使用 AWS Secrets Manager Agent 的指南

主要要点

在这篇文章中,我们将介绍 AWS Secrets Manager Agent 的使用方法,这是一个新的功能,旨在标准化从 Secrets Manager 获取秘密的方法,让你更轻松地管理机密资讯。我们将深入探讨如何在 EC2 实例上安装和使用这个代理,以便能够高效、安全地管理秘密。

AWS Secrets Manager 是一个能帮助你管理、检索和轮换数据库凭证、应用程序凭证、API 密钥及其它机密的服务。它允许你将硬编码的凭证替换为在运行时动态调用 Secrets Manager 服务来检索凭证,从而避免其他人因检视应用程式源代码、配置或组件而意外访问这些凭证。

在这篇博客文章中,我们介绍了一个新功能Secrets Manager Agent,并展示了如何使用它来检索 Secrets Manager 的秘密。

新方法:Secrets Manager Agent

之前,如果你的应用程序使用了 Secrets Manager 并需要检索秘密,你必须使用 AWS SDK 或我们现有的一些缓存库。这两种选择都针对特定的编程语言,而且客制化的功能有限。

Secrets Manager Agent 是一个客户端代理,可以在你的 AWS 计算环境中标准化地消费来自 Secrets Manager 的秘密。AWS 将这个代理的代码公开为开源代码。Secrets Manager Agent 在你的计算环境中提取并缓存秘密,允许你的应用程序从内存缓存中直接消耗秘密。Secrets Manager Agent 在你的应用环境中启动一个本地端口。这样,你可以从本地代理获取秘密值,而不需要进行网络请求,这有助于提高应用的整体可用性并减少 API 调用次数。因为 Secrets Manager Agent 与编程语言无关,你可以在许多类型的 AWS 计算环境中安装该二进制文件。

虽然你可以利用这个功能在应用程序的计算环境中检索和缓存秘密,但对 Secrets Manager 秘密的访问控制仍然保持不变。这意味著 AWS 身份和访问管理IAM原则需要拥有与检索每个秘密相同的权限。你将需要为你希望通过 Secrets Manager Agent 使用的秘密提供 GetSecretValue 和 DescribeSecret 的权限。

Secrets Manager Agent 也提供对伺服器端请求伪造SSRF的防护。当你安装 Secrets Manager Agent 时,该脚本在启动时生成一个随机的 SSRF 令牌并存储在文件 /var/run/awssmatoken 中。该令牌可以被安装脚本创建的 awssmatokenreader 群组读取。Secrets Manager Agent 将拒绝没有在请求头中包含 SSRF 令牌或拥有无效 SSRF 令牌的请求。

解决方案概述

Secrets Manager Agent 提供了一种与语言无关的方法来消费你应用程序代码中的秘密。它支持多种 AWS 计算服务,如 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Service (Amazon ECS)、Amazon Elastic Kubernetes Service (Amazon EKS) 以及 AWS Lambda 函数。在本解决方案中,我们将介绍如何在 EC2 机器上安装 Secrets Manager Agent,并通过 CURL 命令在应用程序代码中检索秘密。详见 AWS Secrets Manager Agent 文档,了解如何在其他类型的计算服务中使用此代理。

如何使用 AWS Secrets Manager Agent 安全博客

先决条件

你需要具备以下条件:

一个 AWS 账户AWS Command Line Interface (AWS CLI) 版本 2jq

请遵循 安装或更新到 AWS CLI 最新版本 页面的步骤来安装 AWS CLI,并参考 配置 AWS CLI 页面来配置它。

创建秘密

第一步是使用 AWS CLI 在 Secrets Manager 中创建一个秘密。

创建秘密的步骤

在终端中输入以下命令来创建秘密:

bashaws secretsmanager createsecret name MySecret description My Secret secretstring {user myuser passwordmypassword}

你会看到如下输出:

json{ ARN arnawssecretsmanageruseast1XXXXXXXXXXXXsecretMySecretLrBlpm Name MySecret VersionId b5e73e9b6ec54144a1763648304b2d60}

请记下秘密的 ARN 作为 ltSECRETARNgt,因为你将在下一个步骤中使用它。

创建 IAM 角色

Lambda 函数、EC2 实例和 ECS 任务定义需要一个 IAM 角色,授予其批准检索刚创建的秘密的许可权。

创建 IAM 角色的步骤

使用编辑器创建名为 ec2iampolicyjson 的文件,内容如下:

json{ Version 20121017 Statement [ { Effect Allow Principal { Service ec2amazonawscom } Action stsAssumeRole } ]}

输入以下命令来创建 IAM 角色:

bashaws iam createrole rolename ec2secretexecutionrole assumerolepolicydocument file//ec2iampolicyjson

创建名为 iampermissionjson 的文件,内容如下,将 ltSECRETARNgt 替换为前面记录的秘密 ARN:

json{ Version 20121017 Statement [ { Effect Allow Action [ secretsmanagerGetSecretValue secretsmanagerDescribeSecret ] Resource ltSECRETARNgt } ]}

输入以下命令来创建一个策略:

bashaws iam createpolicy policyname getsecretpolicy policydocument file//iampermissionjson

请记下 ARN 作为 ltPOLICYARNgt,因为你接下来需要该值。

输入以下命令将此策略附加到 IAM 角色,将 ltPOLICYARNgt 替换为你刚记录的值:

bashaws iam attachrolepolicy rolename ec2secretexecutionrole policyarn ltPOLICYARNgt

接著,输入以下命令将 AWS Systems Manager 策略附加到该角色:

bashaws iam attachrolepolicy rolename ec2secretexecutionrole policyarn arnawsiamawspolicy/AmazonSSMManagedInstanceCore

启动 EC2 实例

使用本节中的步骤来启动 EC2 实例。

创建实例配置文件

输入以下命令来创建实例配置文件:

bashaws iam createinstanceprofile instanceprofilename secretprofile

输入以下命令将此实例配置文件与你刚创建的角色关联:

bashaws iam addroletoinstanceprofile instanceprofilename secretprofile rolename ec2secretexecutionrole

创建安全组

输入以下命令来创建安全组:

bashaws ec2 createsecuritygroup groupname secretsecuritygroup description Secrets Manager Security Group

请记下该组 ID 作为 ltGROUPIDgt,因为你在下一个步骤中将使用到它。

启动 EC2 实例

运行以下命令启动 EC2 实例,将 ltGROUPIDgt 替换为安全组 ID:

bashaws ec2 runinstances imageid resolvessm/aws/service/amiamazonlinuxlatest/amzn2amihvmx8664gp2 instancetype t3micro securitygroupids ltGROUPIDgt iaminstanceprofile Name=secretprofile tagspecifications ResourceType=instanceTags=[{Key=NameValue=secretinstance}]

请记下 InstanceId 值作为 ltINSTANCEIDgt。

透过运行以下命令检查该实例的状态:

bashaws ec2 describeinstances filters Name=tagNameValues=secretinstance jq Reservations[0]Instances[0]State

你将看到如下回应,显示该实例正在运行中:

json{ Code 16 Name running}

当实例处于运行状态时,输入以下命令以连接到 EC2 实例,将 ltINSTANCEIDgt 替换为先前记录的值:

bashaws ssm startsession target ltINSTANCEIDgt

保持会话打开,因为在下一步中你将使用它。

在 EC2 实例中安装 Secrets Manager Agent

使用本节中的步骤在 EC2 实例中安装 Secrets Manager Agent。你将在之前创建的 EC2 实例中运行这些命令。

下载 Secrets Manager Agent 代码

输入以下命令在 EC2 实例中安装 git:

bashsudo yum install y git

啊哈加速器安卓输入以下命令下载 Secrets Manager Agent 的代码:

bashcd git clone https//githubcom/aws/awssecretsmanageragent

编译 Secrets Manager Agent

输入以下命令以安装开发工具:

bashsudo yum y groupinstall Development Tools

输入以下命令来安装 Rust:

bashcurl proto =https tlsv12 sSf https//shrustuprs sh s y HOME/cargo/env

输入以下命令来编译代理:

bashcd awssecretsmanageragentcargo build release

安装 Secrets Manager Agent

输入以下命令来安装 Secrets Manager Agent:

bashcd awssecretsmanageragent/awssecretsmanageragent/configurationsudo /install

授予读取令牌文件的权限

输入以下命令来复制令牌文件并授予当前用户ec2user读取它的权限:

bashsudo cp /var/run/awssmatoken /tmpsudo chown ssmuser /tmp/awssmatoken

检索秘密

现在你可以使用本地 Web 伺服器检索代理。运行在此 EC2 实例中的进程可以通过 REST API 调用从 Web 伺服器检索秘密。

检索秘密的步骤

透过本地代理,目前 EC2 实例中的进程可以检索秘密。

运行以下命令来检索秘密:

bashcurl H XAwsParametersSecretsToken (lt/tmp/awssmatoken) localhost2773/secretsmanager/getsecretId=MySecret

你将看到以下输出:

json{ ARN arnawssecretsmanageruseast1XXXXXXXXXXXXsecretMySecret3z00LH Name MySecret VersionId e7b07d00a0e841b9b76e45bdd8daca4f SecretString {user myuser passwordmypassword} VersionStages [AWSCURRENT] CreatedDate 1716912317961}

通过输入 exit 来退出 EC2 实例。

清理

按照本节中的步骤清理解决方案创建的资源。

终止 EC2 实例和相关资源的步骤

输入以下命令终止 EC2 实例,将 ltINSTANCEIDgt 替换为启动实例时获得的 EC2 InstanceId:

bashaws ec2 terminateinstances instanceids ltINSTANCEIDgt

运行以下命令删除安全组:

bashaws ec2 deletesecuritygroup groupname secretsecuritygroup

运行以下命令从实例配置文件中删除 IAM 角色:

bashaws iam removerolefrominstanceprofile instanceprofilename secretprofile rolename ec2secretexecutionrole

运行以下命令删除实例配置文件:

bashaws iam deleteinstanceprofile instanceprofilename secretprofile

清理 IAM 角色

运行以下命令删除政策角色,将 ltPOLICYARNgt 替换为你之前记录的值:

bashaws iam detachrolepolicy rolename ec2secretexecutionrole policyarn ltPOLICYARNgt

运行以下命令从角色中分离该策略:

bashaws iam detachrolepolicy rolename ec2secretexecutionrole policyarn arnawsiamawspolicy/AmazonSSMManagedInstanceCore

运行以下命令删除 IAM 角色:

bashaws iam deleterole rolename ec2secretexecutionrole

清理秘密

运行以下命令删除秘密:

bashaws secretsmanager deletesecret secretid MySecret

结论

在这篇文章中,我们介绍了 Secrets Manager Agent,并展示了如何在 EC2 实例中安装它,以便从 Secrets Manager 检索秘密。应用程序可以调用这个 Web 伺服器来检索秘密,而无需使用 AWS SDK。详见 AWS Secrets Manager Agent 文档 了解如何在其他计算环境中使用此 Secrets Manager Agent。

想了解有关 AWS Secrets Manager 的更多资讯,可以查看 AWS Secrets Manager 文档。

如果你对这篇文章有任何反馈,请在评论部分中提交。如果你对本文章有任何疑问,请 联系 AWS 支持。

Eduardo PatrocinioEduardo 是 AWS 策略客户团队的一名卓越首席解决方案架构师,拥有超过 25 年的行业经验,致力于设计和交付创新的客户解决方案,专注于云技术的前沿。

Akshay AggarwalAkshay 是 AWS Secrets Manager 团队的高级技术产品经理,负责推动技术改进和定义最佳实践,以帮助用户在 AWS 云中构建安全、可靠的工作负载。Akshay 对构建易于使用、安全、可扩展的技术充满热情。

标签:AWS Secrets Manager,安全博客

AWS上的卫星通信:Thales云化机上WiFi服务by Young Jung Chakri Botlaguduru (嘉宾) Kenneth Sullivan (嘉宾) Seshu Dommaraju (嘉宾) Yann Nicolas (嘉宾) and Sebastien Maugeais 于2...

将 Petabyte 级数据仓库从 Actian Vectorwise 迁移至 Amazon Redshift关键要点:本文探讨了一家金融服务行业客户如何通过迁移至 Amazon Redshift,获得可扩展性、可靠性和可用性。客户面临的主要挑战包括可扩展性、可用性和性能问题。新的架构利用 Amaz...