使用 AWS 以代码形式管理 AWS IAM 身份中心权限集 CodePipeline - AWS Prescriptive Guidance

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

使用 AWS 以代码形式管理 AWS IAM 身份中心权限集 CodePipeline

由 Andre Cavalcante (AWS) 和 Claison Amorim (AWS) 创建

代码存储库:aws-iam-identity-center- pipeline

环境:生产

技术:安全、身份、合规; DevOps

AWS 服务:AWS CodeBuild;AWS CodeCommit;AWS CodePipeline;AWS IAM 身份中心

Summary

AWS IAM Identity Center (AWS 单点登录的后继平台)可帮助您集中管理对所有 Amazon Web Services account 和应用程序的单点登录(SSO)访问。您可以在 IAM Identity Center 中创建和管理用户身份,也可以连接现有身份源,例如 Microsoft Active Directory 域或外部身份提供者 (IdP)。IAM Identity Center 提供统一的管理体验,使用权限集定义、自定义和分配对 AWS 环境的精细访问权限。权限集适用于您的 AWS IAM Identity Center 身份存储或外部 IdP 中的联合用户和组。

该模式可帮助您在多账户环境中以代码形式管理 IAM Identity Center 权限集,该环境在 AWS Organizations 中作为一个组织进行管理。使用此模式,您可以实现以下目标:

  • 创建、删除和更新权限集

  • 创建、更新或删除针对 Amazon Web Services account 、组织单位 (OU) 或组织根的权限集分配。

为了以代码形式管理 IAM Identity Center 权限和分配,此解决方案部署了使用 AWS、AWS 和 AWS 的持续集成和持续交付 (CI/CD) 管道。 CodeCommit CodeBuild CodePipeline您可以通过存储在 CodeCommit 存储库中的 JSON 模板中管理权限集和分配。当 Amazon EventBridge 规则检测到存储库的更改或检测到目标 OU 中账户的修改时,它会启动 AWS Lambda 函数。Lambda 函数启动 CI/CD 管道,更新 IAM Identity Center 中的权限集和分配。

先决条件和限制

先决条件

  • 在 AWS Organizations 中作为组织管理的多账户环境。有关更多信息,请参阅创建组织

  • 已启用并配置身份源的 IAM Identity Center。有关更多信息,请参阅 IAM Identity Center 文档中的快速入门

  • 一个注册为 IAM Identity Center 的委托管理员的成员账户。有关说明,请参阅 IAM Identity Center 文档中的注册成员账户

  • 在 IAM Identity Center 委托的管理员账户和组织的管理账户中部署 AWS CloudFormation 堆栈的权限。有关更多信息,请参阅 CloudFormation 文档中的控制访问权限

  • Identity Center 中的 Amazon Simple Storage Service (Amazon S3) 桶委托管理员上传构件代码。有关说明,请参阅创建桶

  • 组织管理账户的账户 ID。有关说明,请参阅查找您的 Amazon Web Services account ID

限制

  • 此模式不能用于管理或分配单账户环境或未在 AWS Organizations 中作为组织管理的账户的权限集。

  • 部署后,无法修改权限集名称、分配 ID 以及 IAM Identity Center 主体类型和 ID。

  • 此模式可帮助您创建和管理自定义权限。您不能使用此模式来管理或分配预定义权限

  • 此模式不能用于管理组织管理账户的权限集。

架构

技术堆栈

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon EventBridge

  • AWS Identity Center

  • AWS Lambda

  • AWS Organizations

目标架构

使用 CI/CD 管道和 AWS CodeCommit 存储库管理 AWS IAM 身份中心中的权限集。

图表显示了以下工作流:

  1. 某位用户进行了以下更改之一:

    1. 向 CodeCommit 存储库提交一项或多项更改

    2. 修改 AWS Organizations 中组织单位(OU)中的账户

  2. 如果用户提交了对 CodeCommit 存储库的更改,则该CodeChange EventBridge 规则会检测到更改并在 IAM Identity Center 委托的管理员账户中启动 Lambda 函数。该规则不会对存储库中某些文件(如 README.md 文件)的更改做出反应。

    如果用户修改了组织部门中的账户,则该MoveAccount EventBridge 规则会检测到更改并在组织的管理账户中启动 Lambda 函数。

  3. 启动的 Lambda 函数在中启动 CI/CD 管道。 CodePipeline

  4. CodePipeline 启动CodebuildTemplateValidation CodeBuild 项目。

  5. CodebuildTemplateValidation CodeBuild 项目使用 CodeCommit 存储库中的 Python 脚本来验证权限集模板。 CodeBuild 验证以下内容:

    • 权限集名称是唯一的。

    • 赋值语句 ID (Sid) 是唯一的。

    • CustomPolicy 参数中的策略定义和有效。(此验证使用 AWS 身份验证和访问管理访问分析器。)

    • 托管策略的Amazon 资源名称(ARN)有效。

  6. CodebuildPermissionSet CodeBuild 项目使用适用于 Python 的 AWS 开发工具包 (Boto3) 在 IAM Identity Center 中删除、创建或更新权限集。只有带有 SSOPipeline:true 标签的权限集会受到影响。通过此管道管理的所有权限集都有此标签。

  7. CodebuildAssignments CodeBuild 项目使用 Terraform 在 IAM 身份中心中删除、创建或更新分配。Terraform 后端状态文件存储在同一账户的 S3 存储桶中。

  8. CodeBuild 在组织的管理账户中担任 lookup IAM 角色。它可调用组织和 identitystore API,以列出授予或撤消权限所需资源。

  9. CodeBuild 更新 IAM 身份中心中的权限集和分配。

自动化和扩缩

由于多账户环境中的所有新账户都会移至 AWS Organizations 中的特定组织单位,因此该解决方案会自动运行,并向您在分配模板中指定的所有账户授予所需权限集。无需进行其他自动化或扩展操作。

在大型环境中,向 IAM Identity Center 发出的 API 请求数量可能会导致此解决方案的运行速度变慢。Terraform 和 Boto3 会自动管理节流,以最大限度地减少任何性能下降。

工具

Amazon Web Services

  • AWS CloudFormation 可帮助您设置 AWS 资源,快速一致地配置这些资源,并在 AWS 账户和区域的整个生命周期中对其进行管理。

  • AWS CodeBuild 是一项完全托管的构建服务,可帮助您编译源代码、运行单元测试和生成可随时部署的项目。 

  • AWS CodeCommit 是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。

  • AWS CodePipeline 可帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件变更所需的步骤。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,AWS Lambda 函数、使用 API 目标的 HTTP 调用端点或其他 Amazon Web Services account 中的事件总线。

  • AWS IAM Identity Center 可帮助您集中管理对所有 Amazon Web Services account 和云应用程序的单点登录(SSO)访问权限。

  • AWS Organizations 是一项账户管理服务,使您可以将多个 Amazon Web Services account 整合到您创建组织中并进行集中管理。

  • 适用于 Python 的 Amazon SDK (Boto3) 是一个软件开发工具包,可帮助您将 Python 应用程序、库或脚本与 Amazon Web Services 集成。

  • Amazon Simple Storage Service (Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

代码存储库

此模式的代码可在 aws-iam-identity-center-pipelin e 存储库中找到。存储库中的 templates 文件夹包含权限集和分配的示例模板。它还包括用于在目标账户中部署 CI/CD 管道和 AWS 资源的 AWS CloudFormation 模板。

最佳实践

  • 在开始修改权限集和分配模板之前,我们建议您为您的组织规划权限集。考虑权限应该是什么,权限集应适用于哪些账户或 OU,以及哪些 IAM Identity Center 主体(用户或组)应受权限集的影响。部署后,无法修改权限集名称、关联 ID 以及 IAM Identity Center 主体类型和 ID。

  • 遵循最低权限原则,并授予执行任务所需最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限安全最佳实践

操作说明

任务描述所需技能

克隆存储库。

在 bash Shell 中输入以下命令:这将从中克隆 aws-iam-identity-center-pipelin e 存储库。 GitHub

git clone https://github.com/aws-samples/aws-iam-identity-center-pipeline.git
DevOps 工程师

定义权限集。

  1. 在克隆的存储库中,导航到 templates/permissionsets 文件夹,然后打开其中一个可用模板。

  2. Name 参数中,输入权限集的名称。此值必须是唯一的,并且在部署后无法更改。

  3. Description 参数中,简要描述权限集,例如其用例。

  4. SessionDuration 参数中,指定用户可以登录 Amazon Web Services account 的时间长度。使用 ISO-8601 持续时间格式(维基百科),例如 PT4H 为 4 小时。如果未定义值,则 IAM Identity Center 中的默认值为 1 小时。

  5. 自定义权限集中的策略。以下所有参数均为可选参数,可在部署后进行修改。您必须至少使用其中一个参数才能在权限集中定义策略:

    • ManagedPolicies 参数中,输入您要分配的任何 AWS 托管式策略的 ARN。

    • CustomerManagedPolicies 参数中,输入您要分配的任何客户管理型策略的名称。请勿使用 ARN。

    • PermissionBoundary 参数中,执行以下操作以分配权限边界

      • 如果您使用 AWS 托管式策略作为权限边界,请在 PolicyType 中输入 AWS,在 Policy 中输入策略的 ARN。

      • 如果您使用客户管理型策略作为权限边界,请在 PolicyType 中输入 Customer,在 Policy 中输入策略的名称。请勿使用 ARN。

    • CustomPolicy 参数中,定义要分配的任何自定义 JSON 格式策略。有关 JSON 策略文档的结构和内容的更多信息,请参阅JSON 策略概览

  6. 保存并关闭权限集模板。我们建议您使用与权限集名称相匹配的名称保存文件。

  7. 重复此过程以创建组织所需任意数量的权限集,并删除任何不需要的示例模板。

DevOps 工程师

定义分配。

  1. 在克隆的存储库中,导航到 templates/assignments 文件夹,然后打开 iam-identitycenter-assigments.json。此文件描述了您希望如何将权限集分配给 Amazon Web Services account 或 OU。

  2. SID 参数中,输入分配的标识符。此值必须是唯一的,并且在部署后无法修改。

  3. Target 参数中,定义要在其中应用权限集的账户或组织。有效值包括账户 ID、OU ID、OU 名称或 rootroot 将权限集分配给组织中的所有成员账户,但不包括管理账户。在双引号中输入值,并用逗号分隔多个值。有关如何查找 ID 的说明,请参阅查看账户详细信息查看 OU 详细信息

  4. PrincipalType 参数中,输入将受权限集影响的 IAM Identity Center 主体的类型。有效值为 USERGROUP。部署后无法修改此值。

  5. PrincipalID 参数中,输入 IAM Identity Center 身份存储中将受权限集影响的用户或组的名称。部署后无法修改此值。

  6. PermissionSetName 参数中,输入要分配的权限集的名称。

  7. 重复步骤 2-6 在此文件中创建所需数量的分配。通常情况下,每个权限集都有一个分配。删除所有不需要的示例作业。

  8. 保存并关闭 iam-identitycenter-assigments.json文件。

DevOps 工程师
任务描述所需技能

将 .zip 文件上传到 S3 存储桶。

  1. 将克隆的存储库压缩为 .zip 文件。

  2. 登录 IAM Identity Center 委派管理员账户。

  3. 打开 Amazon S3 控制台,网址为:https://console.aws.amazon.com/s3/

  4. 在左侧导航窗格中,选择存储桶

  5. 请选择要用于部署此解决方案的存储桶。

  6. 将 .zip 文件上传到 S3 存储桶。有关说明,请参阅上传对象

DevOps 工程师

在 IAM Identity Center 委托管理员账户中部署资源。

  1. 在 IAM Identity Center 委托管理员账户中,打开 CloudFormation 控制台,网址为 https://console.aws.amazon.com/cloudformation/

  2. 部署 iam-identitycenter-pipeline.yaml 模板。为堆栈指定一个清晰且具有描述性的名称,并按照指示更新参数。有关说明,请参阅 CloudFormation 文档中的创建堆栈

DevOps 工程师

在 AWS Organization 管理账户中部署资源。

  1. 登录组织的管理账户。

  2. 打开 CloudFormation 控制台,网址为 https://console.aws.amazon.com/cloudformation/

  3. 在导航栏中,选择当前所显示 AWS 区域的名称。选择 us-east-1 区域。该区域是必需的,这样MoveAccount EventBridge 规则才能检测到与组织变更相关的 AWS CloudTrail 事件。

  4. 部署 iam-identitycenter-organization 模板。为堆栈指定一个清晰且具有描述性的名称,并按照指示更新参数。有关说明,请参阅 CloudFormation 文档中的创建堆栈

DevOps 工程师
任务描述所需技能

更新权限集和分配。

MoveAccount Amazon EventBridge 规则检测到组织中账户的修改时,CI/CD 管道会自动启动并更新权限集。例如,如果您将一个账户添加到分配 JSON 文件中指定的 OU,那么 CI/CD 管道就会将权限集应用到新账户。

如果您想修改已部署的权限集和分配,请更新 JSON 文件,然后将其提交到 IAM Identity Center 委托管理员账户中的 CodeCommit 存储库。有关说明,请参阅 CodeCommit 文档中的创建提交

使用 CI/CD 管道管理先前部署的权限集和关联时,请注意以下事项:

  • 如果更改了权限集的名称,CI/CD 管道会删除原始权限集并创建一个新权限集。

  • 此管道仅管理具有 SSOPipeline:true 标签的权限集。

  • 您可以在存储库的同一文件夹中拥有多个权限集和分配模板。

  • 如果您删除一个模板,则管道会删除该分配或权限集。

  • 如果您删除整个分配 JSON 块,管道将从 IAM Identity Center 中删除该分配。

  • 您无法删除分配给 Amazon Web Services account 的权限集。首先,您必须取消分配权限集。

DevOps 工程师

故障排除

问题解决方案

访问被拒绝错误

确认您拥有部署 CloudFormation 模板和模板中定义的资源所需的权限。有关更多信息,请参阅 CloudFormation 文档中的控制访问权限

验证阶段的管道错误

如果权限集或分配模板中存在任何错误,则会出现此错误。

  1. 在中 CodeBuild,查看版本详细信息

  2. 在构建日志中,查找验证错误,该错误提供了有关导致构建失败的原因的更多信息。

  3. 更新权限集或分配模板,然后将其提交到存储库。

  4. CI/CD 管道会重新启动项目。 CodeBuild 监控状态以确认验证错误已解决。

相关资源