使用 Organizations 和 Secrets Manager 自动大规模轮换IAM用户访问AWS密钥 AWS - AWS Prescriptive Guidance

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

使用 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:将凭证存储至成员账户

将IAM凭证存储在成员账户中

选项 2:将凭证存储至管理账户

在管理账户中存储IAM凭证

图表显示了以下工作流程:

  1. 一个 EventBridge 事件每 24 小时启动一个 Lamb account_inventory da 函数。

  2. 此 Lambda 函数向 Or AWS ganizations 查询所有AWS账户IDs、账户名称和账户电子邮件的列表。 

  3. account_inventoryLambda 函数为每个AWS账户 ID 启动一个 L access_key_auto_rotation ambda 函数,并将元数据传递给该函数进行额外处理。

  4. L access_key_auto_rotation ambda 函数使用代入的IAM角色来访问AWS账户 ID。Lambda 脚本对账户中的所有用户及其IAM访问密钥进行审计。 

  5. 如果IAM访问密钥的使用期限未超过最佳实践阈值,则 Lambda 函数将不采取进一步的行动。

  6. 如果IAM访问密钥的使用期限已超过最佳实践阈值,则 access_key_auto_rotation Lambda 函数将决定要执行哪个轮换操作。

  7. 当需要操作时,如果生成了新密钥,access_key_auto_rotationLambda 函数会在 Secr AWS ets Manager 中创建和更新密钥。还创建了一个基于资源的策略,该策略仅允许指定的IAM委托人访问和检索密钥。对于选项 1,将凭证存储至相应账户的 Secrets Manager。对于选项 2(如果 StoreSecretsInCentralAccount 标志设置为 True),则将凭证存储至管理账户的 Secrets Manager。 

  8. 启动 notifier Lambda 函数,以通知轮换活动的账户所有者。此函数接收AWS账户 ID、账户名、账户电子邮件和已执行的轮换操作。 

  9. notifier Lambda 函数在部署 S3 存储桶中查询电子邮件模板,并使用相关活动元数据动态更新该模板。然后,电子邮件将发送至账户所有者的电子邮件地址。

备注:

  • 此解决方案支持多个可用区的弹性。但是,它不支持多个AWS区域的弹性。要在多个区域获得支持,您可以在第二个区域部署解决方案并禁用密钥轮换 EventBridge 规则。然后,当您想在第二个区域运行解决方案时,您可以启用该规则。

  • 您可以在审核模式下运行此解决方案。在审核模式下,IAM访问密钥不会被修改,但会发送一封电子邮件通知用户。若要在审计模式下运行解决方案,请在运行密钥轮换模板时或在 access_key_auto_rotation Lambda 函数的环境变量中将 DryRunFlag 标志设置为 True

自动化和扩缩

自动执行此解决方案的 CloudFormation 模板在 GitHub IAM密钥轮换存储库中提供,并列在 “代码” 部分中。在 AWS Organizati CloudFormation StackSetsons 中,您可以使用在多个账户中部署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密钥轮换存储库中找到。模板按以下方式部署。

模板

部署

备注

ASA-iam-key-auto-rotation-and-notifier-solution.yaml

部署账户

这是此解决方案的主要模板。

ASA-iam-key-auto-rotation-iam-assumed-roles.yaml

您想要轮换凭证的单个或多个成员账户

您可以使用 CloudFormation 堆栈集在多个账户中部署此模板。

ASA-iam-key-auto-rotation-list-accounts-role.yaml

Central/管理账户

使用此模板来保存 Organizations 中的AWS账户清单。

ASA-iam-key-auto-rotation-vpc-endpoints.yaml

部署账户

仅当您要在 a 中运行 Lambda 函数时,才使用此模板自动创建终端节点VPC(在主模板中将RunLambdaInVPC参数设置为 True)。

操作说明

任务描述所需技能

选择您的部署 S3 存储桶。

登录您的账户的AWS管理控制台,打开 Amazon S3 控制台,然后选择要部署的 S3 存储桶。如果您想在 Organizations 中AWS为多个账户实施解决方案,请登录您的组织的管理账户。

云架构师

克隆存储库。

将 GitHub IAM密钥轮换存储库克隆到您的本地桌面。

云架构师

将文件上传至 S3 存储桶。

将已克隆文件上传至 S3 存储桶。使用以下默认文件夹结构复制并粘贴所有已克隆文件和目录:asa/asa-iam-rotation

注意

您可以在 CloudFormation 模板中自定义此文件夹结构。

云架构师

修改电子邮件模板。

根据您的要求修改 iam-auto-key-rotation-enforcement.html 电子邮件模板 (位于 template 文件夹中)。用您的部门名称替换模板末尾的 [Department Name Here]

云架构师
任务描述所需技能

启动密钥轮换 CloudFormation 模板。

  1. 在部署账户中启动 ASA-iam-key-auto-rotation-and-notifier-solution.yaml 模板。有关更多信息,请参阅 CloudFormation 文档中的选择堆栈模板

  2. 为参数指定值,包括:

    • CloudFormation S3 存储桶名称 (S3BucketName)-包含您的 Lambda 代码的部署 S3 存储桶的名称。

    • CloudFormation S3 存储桶前缀 (S3BucketPrefix)-S3 存储桶的前缀。

    • 假设IAM角色名称 (IAMRoleName)-key-rotation Lambda 函数在轮换密钥时将假设的角色名称。

    • IAM执行角色名称 (ExecutionRoleName)-key-rotation Lambda 函数使用的IAM执行角色的名称。

    • 清单执行角色名称 (InventoryExecutionRoleName)-account_inventory Lambda 函数使用的IAM执行角色的名称。

    • Dry Run Flag (Audit Mode) (DryRunFlag) - 设置为 True 可开启审核模式(默认)。设置为 False 以开启强制模式。

    • 列出组织账户的账户 (OrgListAccount) - 用于列出组织中的账户的中央/管理账户的账户 ID。

    • 列出账户角色名称 (OrgListRole) - 用于列出组织中账户的角色名称。

    • 中央账户的 Secrets Store 标志 (StoreSecretsInCentralAccount)– 设置为 True 可将密钥存储至中央账户。设置为 False 以将密钥存储至相应账户。

    • 要复制证书的区域 (CredentialReplicationRegions) — 要复制证书的AWS区域 (Secrets Manager),用逗号分隔;例如,us-east-2,us-west-1,us-west-2。跳过您要在其中创建堆栈的区域。

    • 在 VPC (RunLambdaInVpc) 中运行 Lambda — 设置为 True 可在指定的环境中运行 Lambda 函数。VPC您必须创建VPC终端节点,并将NAT网关连接到包含 Lambda 函数的子网。有关更多信息,请参阅介绍此选项的 re:Post 文章

    • VPCLambda 函数 (VpcId)、安全组规则 (VpcCidr) 的 ID Lambda 函数的子网 ID (SubnetId)-如果您设置VPCCIDR为 True,请提供有关VPCCIDR、和子网的信息。RunLambdaInVpc

    • 管理员电子邮件地址 (AdminEmailAddress) - 用于向其发送通知的有效电子邮件地址。

    • AWS组织 ID (AWSOrgID)-您的组织的唯一 ID。此 ID 以 o- 开头,其后为 10-32 个小写字母或数字。

    • 电子邮件模板文件名 [审核模式] (EmailTemplateAudit) 和 [强制模式] (EmailTemplateEnforce)-审计模式和强制模式下notifier模块要发送的电子邮件HTML模板的文件名。

    • SMTP用户SSM参数名称 (SMTPUserParamName) 和SMTP密码SSM参数名称 (SMTPPasswordParamName)-简单邮件传输协议 (SMTP) 的用户和密码信息。 

云架构师

启动代入角色的 CloudFormation 模板。

  1. AWS CloudFormation 控制台中,为要轮换密钥的每个账户启动ASA-iam-key-auto-rotation-iam-assumed-roles.yaml模板。如果您有多个账户,则可以将管理账户中的主 CloudFormation 模板部署为堆栈,并将包含堆 CloudFormation 栈集的ASA-iam-key-auto-rotation-iam-assumed-roles.yaml模板部署到所有必需的账户。有关更多信息,请参阅 CloudFormation 文档AWS CloudFormation StackSets中的使用

  2. 为以下参数指定值:

    • 假设IAM角色名称 (IAMRoleName) — 将由 Lambda 函数access_key_auto_rotation代入的IAM角色名称。您可以保留默认值。

    • IAM执行角色名称 (ExecutionRoleName)-将担任子账户IAM角色以运行 Lambda 函数的角色。

    • 主AWS账户 ID (PrimaryAccountID)-将在其中部署主模板的AWS账户 ID。 

    • IAM豁免组 (IAMExemptionGroup)-用于简化要从自动密钥轮换中排除的IAM账户的IAM群组名称。

云架构师

启动账户库存 CloudFormation 模板。

  1. 在管理/中央账户中启动 ASA-iam-key-auto-rotation-list-accounts-role.yaml 模板

  2. 为以下参数指定值:

    • 假设IAM角色名称 (IAMRoleName) — Lambda access_key_auto_rotation 函数将采用的IAM角色名称。

    • IAM账户 Lambda (AccountExecutionRoleName) 的执行角色名称-Lam notifier bda 函数将IAM担任的角色的名称。

    • IAM轮换的执行角色名称 Lambda (RotationExecutionRoleName)-Lam access_key_auto_rotation bda 函数将IAM担任的角色的名称。

    • 主AWS账户 ID (PrimaryAccountID)-将在其中部署主模板的AWS账户 ID。

云架构师

启动终VPC端节点 CloudFormation 模板。

此任务是可选的。

  1. 在部署账户中启动 ASA-iam-key-auto-rotation-vpc-endpoints.yaml 模板。 

  2. 为以下参数指定值:

    • VPCID (pVpcId)、子网 ID (pSubnetId) 和 VPC (pVPCCidr) 的CIDR范围-提供有关VPCCIDR、和子网的信息。

    • 将每个VPC端点的参数设置为 True。如果已有端点,则可选择 False

云架构师

相关资源