本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Organizations 和 Secrets Manager 自动大规模轮换IAM用户访问AWS密钥 AWS
由 Tracy Hickey (AWS)、Gaurav Verma ()、Laura Seletos (AWS)、Michael Davie (AWS) 和 Arvind Patel () 创作 AWS AWS
摘要
重要作为最佳实践,AWS建议您使用 Ident AWS ity and Access Management (IAM) 角色,而不是拥有访问密钥等长期凭证的IAM用户。此模式中记录的方法仅适用于需要长期AWSAPI凭证的旧版实现。对于这些实施,我们仍然建议您考虑使用短期凭证的选项,例如使用亚马逊弹性计算云 (AmazonEC2) 实例配置文件或 Roles Anyw IAM here。本文所述方法仅适用于您无法立即改为使用短期凭证、并且需要按计划轮换长期凭证的情况。使用这种方法,您有责任定期更新旧应用程序代码或配置,以使用轮换后的API凭证。 |
访问密钥是IAM用户的长期凭证。定期轮换您的IAM凭证有助于防止一组泄露的IAM访问密钥访问您AWS账户中的组件。轮换IAM证书也是中安全最佳实践的重要组成部分IAM。
此模式可帮助您使用密钥轮换存储库中提供的AWS CloudFormation 模板自动轮换IAM访问 GitHub IAM密钥
此模式支持在单个或多个账户中部署。如果您使用的是 Org AWS anizations,则此解决方案可识别组织IDs中的所有AWS帐户,并随着帐户的删除或新帐户的创建而动态扩展。集中式 AWS Lambda 函数使用代入IAM角色在您选择的多个账户中本地运行轮换函数。
当现有IAM访问密钥已过期 90 天时,就会生成新的访问密钥。
新的访问密钥作为密钥存储在 Secr AWS ets Manager 中。基于资源的策略仅允许指定的IAM委托人访问和检索密钥。如果选择将密钥存储至管理账户,则所有账户的密钥均应存储至管理账户。
分配给创建新访问密钥的AWS账户所有者的电子邮件地址会收到通知。
先前访问密钥在 100 天后停用,然后在 110 天后删除。
系统会向AWS账户所有者发送一封集中的电子邮件通知。
Lambda 函数和亚马逊 CloudWatch 会自动执行这些操作。然后,您可以检索新的访问密钥对,并在代码或应用程序中将其替换。轮换、删除和停用期限可自定义。
先决条件和限制
至少有一个活跃AWS账户。
AWSOrganizations,已配置和设置(参见教程)。
从您的管理账户查询 AWS Organizations 的权限。有关更多信息,请参阅 AWSOrganizations 文档中的AWS组织和服务相关角色。
有权启动AWS CloudFormation 模板和相关资源的IAM委托人。有关更多信息,请参阅AWS CloudFormation 文档中的授予自我管理权限。
用于部署资源的现有 Amazon Simple Storage Service (Amazon S3)存储桶。
亚马逊简单电子邮件服务 (AmazonSES) 已退出沙箱。有关更多信息,请参阅亚马逊SES文档中的退出亚马逊SES沙箱。
如果您选择在虚拟私有云 (VPC) 中运行 Lambda,则应在运行主 CloudFormation 模板之前创建以下资源:
一个 VPC。
子网。
适用于亚马逊SES、S AWS ystems Manager、AWS安全令牌服务 (AWSSTS)、亚马逊 S3 和 S AWS ecrets Manager 的终端节点。(您可以运行 GitHub IAM密钥轮换
存储库中提供的端点模板来创建这些端点。)
存储在 S AWS ystems Manager 参数(参数SMTP)中的简单邮件传输协议 (SSM) 用户和密码。参数必须与主 CloudFormation 模板参数相匹配。
架构
技术堆栈
Amazon CloudWatch
Amazon EventBridge
IAM
AWS Lambda
AWS Organizations
Amazon S3
架构
下图显示了此模式的组件和工作流程。该解决方案支持两种凭证存储方案:储存至成员账户和储存至管理账户。
选项 1:将凭证存储至成员账户
选项 2:将凭证存储至管理账户
图表显示了以下工作流程:
一个 EventBridge 事件每 24 小时启动一个 Lamb
account_inventory
da 函数。此 Lambda 函数向 Or AWS ganizations 查询所有AWS账户IDs、账户名称和账户电子邮件的列表。
account_inventory
Lambda 函数为每个AWS账户 ID 启动一个 Laccess_key_auto_rotation
ambda 函数,并将元数据传递给该函数进行额外处理。L
access_key_auto_rotation
ambda 函数使用代入的IAM角色来访问AWS账户 ID。Lambda 脚本对账户中的所有用户及其IAM访问密钥进行审计。如果IAM访问密钥的使用期限未超过最佳实践阈值,则 Lambda 函数将不采取进一步的行动。
如果IAM访问密钥的使用期限已超过最佳实践阈值,则
access_key_auto_rotation
Lambda 函数将决定要执行哪个轮换操作。当需要操作时,如果生成了新密钥,
access_key_auto_rotation
Lambda 函数会在 Secr AWS ets Manager 中创建和更新密钥。还创建了一个基于资源的策略,该策略仅允许指定的IAM委托人访问和检索密钥。对于选项 1,将凭证存储至相应账户的 Secrets Manager。对于选项 2(如果StoreSecretsInCentralAccount
标志设置为 True),则将凭证存储至管理账户的 Secrets Manager。启动
notifier
Lambda 函数,以通知轮换活动的账户所有者。此函数接收AWS账户 ID、账户名、账户电子邮件和已执行的轮换操作。notifier
Lambda 函数在部署 S3 存储桶中查询电子邮件模板,并使用相关活动元数据动态更新该模板。然后,电子邮件将发送至账户所有者的电子邮件地址。
备注:
此解决方案支持多个可用区的弹性。但是,它不支持多个AWS区域的弹性。要在多个区域获得支持,您可以在第二个区域部署解决方案并禁用密钥轮换 EventBridge 规则。然后,当您想在第二个区域运行解决方案时,您可以启用该规则。
您可以在审核模式下运行此解决方案。在审核模式下,IAM访问密钥不会被修改,但会发送一封电子邮件通知用户。若要在审计模式下运行解决方案,请在运行密钥轮换模板时或在
access_key_auto_rotation
Lambda 函数的环境变量中将DryRunFlag
标志设置为 True。
自动化和扩缩
自动执行此解决方案的 CloudFormation 模板在 GitHub IAM密钥轮换ASA-iam-key-auto-rotation-iam-assumed-roles.yaml
CloudFormation 模板,而不必将解决方案单独部署到每个成员账户。
工具
AWS 服务
Amazon CloudWatch 可帮助您实时监控您的AWS资源和运行的应用程序AWS的指标。
AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。
AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
AWSO rganizations 是一项账户管理服务,可帮助您将多个AWS账户整合到一个由您创建和集中管理的组织中。
AWSS@@ ecrets Manager 可帮助您将代码中的硬编码凭据(包括密码)替换为API调用 Secrets Manager 以编程方式检索密钥。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
亚马逊简单电子邮件服务 (AmazonSES) 可帮助您使用自己的电子邮件地址和域名发送和接收电子邮件。
亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。
Amazon Virtual Private Cloud(亚马逊VPC)可帮助您将AWS资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS 的可扩展基础设施的优势。
Amazon VPC 终端节点提供了一个接口,用于连接由其提供支持的服务 AWS PrivateLink,包括许多AWS服务。对于您从中指定的每个子网VPC,都会在子网中创建一个终端节点网络接口,并为其分配一个子网地址范围内的私有 IP 地址。
代码
所需的AWS CloudFormation 模板、Python 脚本和运行手册文档可在 GitHub IAM密钥轮换
模板 | 部署 | 备注 |
| 部署账户 | 这是此解决方案的主要模板。 |
| 您想要轮换凭证的单个或多个成员账户 | 您可以使用 CloudFormation 堆栈集在多个账户中部署此模板。 |
| Central/管理账户 | 使用此模板来保存 Organizations 中的AWS账户清单。 |
| 部署账户 | 仅当您要在 a 中运行 Lambda 函数时,才使用此模板自动创建终端节点VPC(在主模板中将 |
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
选择您的部署 S3 存储桶。 | 登录您的账户的AWS管理控制台,打开 Amazon S3 控制台 | 云架构师 |
克隆存储库。 | 将 GitHub IAM密钥轮换 | 云架构师 |
将文件上传至 S3 存储桶。 | 将已克隆文件上传至 S3 存储桶。使用以下默认文件夹结构复制并粘贴所有已克隆文件和目录: 注意您可以在 CloudFormation 模板中自定义此文件夹结构。 | 云架构师 |
修改电子邮件模板。 | 根据您的要求修改 | 云架构师 |
任务 | 描述 | 所需技能 |
---|---|---|
启动密钥轮换 CloudFormation 模板。 |
| 云架构师 |
启动代入角色的 CloudFormation 模板。 |
| 云架构师 |
启动账户库存 CloudFormation 模板。 |
| 云架构师 |
启动终VPC端节点 CloudFormation 模板。 | 此任务是可选的。
| 云架构师 |
相关资源
IAM(IAM文档)中的安全最佳实践
AWS组织和服务相关角色(AWS组织文档)
选择堆栈模板(CloudFormation 文档)
使用 AWS CloudFormation StackSets(CloudFormation 文档)