使用以下 AWS IAM Identity Center 命令将权限集作为代码进行管理 AWS CodePipeline - AWS Prescriptive Guidance

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

使用以下 AWS IAM Identity Center 命令将权限集作为代码进行管理 AWS CodePipeline

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

摘要

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

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

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

  • 创建、更新或删除对目标 AWS 账户、组织单位 (OUs) 或组织根目录的权限集分配。

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

先决条件和限制

先决条件

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

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

  • 注册为以下任务的委托管理员的成员账户 AWS 服务:

    注意

    对于这两项服务,您必须使用与委派管理员相同的帐户。

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

  • IAM Identity Center 中的亚马逊简单存储服务 (Amazon S3) Service 存储桶委派了管理员账户。您将构件代码上传到此存储桶中。有关说明,请参阅 Amazon S3 文档中的创建存储桶

  • 组织管理账户的账户 ID。有关说明,请参阅查找您的 AWS 账户 身份证

  • 源代码主机中的存储库,例如 GitHub。

限制

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

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

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

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

架构

目标架构

使用 CI/CD 管道管理 IAM 身份中心中的权限集。

图表显示了以下工作流:

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

    • 向远程存储库提交一项或多项更改,例如 GitHub

    • 修改 OU 中的账户 AWS Organizations

  2. 如果用户向主分支提交了对远程存储库的更改,则管道将启动。

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

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

  4. CodePipeline 启动TemplateValidation CodeBuild 项目。该TemplateValidation CodeBuild 项目使用远程存储库中的 Python 脚本来验证权限集模板。 CodeBuild 验证以下内容:

    • 权限集名称是唯一的。

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

    • CustomPolicy 参数中的策略定义和有效。(此验证使用 AWS Identity and Access Management Access Analyzer。)

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

  5. Deploy CodeBuild 项目中的PermissionSet操作组用于 AWS SDK for Python (Boto3) 删除、创建或更新 IAM Identity Center 中的权限集。只有带有 SSOPipeline:true 标签的权限集会受到影响。通过此管道管理的所有权限集都有此标签。

  6. Deploy CodeBuild 项目中的Assignments操作组使用 Terraform 在 IAM Identity Center 中删除、创建或更新分配。Terraform 后端状态文件存储在同一个账户的 Amazon S3 存储桶中。

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

自动化和扩缩

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

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

工具

AWS 服务

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

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

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

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

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

  • AWS Organizations是一项账户管理服务,可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。

  • AWS SDK for Python (Boto3)是一个软件开发套件,可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。

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

代码存储库

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

最佳实践

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

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

操作说明

Task描述所需技能

克隆存储库。

在 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参数中,指定用户可以登录的时间长度 AWS 账户。使用 ISO-8601 持续时间格式(维基百科),例如 PT4H 为 4 小时。如果未定义值,则 IAM Identity Center 中的默认值为 1 小时。

  5. RelayState参数中,指定最适合用户角色的提供对控制台的快速访问的 URL。

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

    • ManagedPolicies参数中 ARNs ,输入要分配的所有AWS 托管策略

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

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

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

      • 如果您使用客户托管策略作为权限边界,请在PolicyTypeCustomer、输入和输入策略的名称。Policy请勿使用 ARN。

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

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

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

DevOps 工程师

定义分配。

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

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

  3. Target 参数中,定义要在其中应用权限集的账户或组织。有效值为账户 IDs OUs、或rootroot将权限集分配给组织中的所有成员帐户,不包括管理帐户。在双引号中输入值,并用逗号分隔多个值。账户 IDs 并 OUs 应遵循模式:{{account_name}}:{{account_id}}{{ou_name}}:{{ou_id}}。如果要递归地为嵌套分配权限 OUs,请使用末尾带有通配符的 OU 模式。示例:{{ou_name}}:{{ou_id}}:*

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

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

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

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

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

DevOps 工程师
Task描述所需技能

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

  1. 在 IAM Identity Center 委托管理员账户中,打开AWS CloudFormation 控制台

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

DevOps 工程师

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

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

  2. 打开 AWS CloudFormation 管理控制台

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

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

DevOps 工程师

完成远程存储库的设置。

将 AWS CodeConnections 连接状态从更改PENDINGAVAILABLE。此连接是在您部署 CloudFormation 堆栈时创建的。有关说明,请参阅 CodeConnections 文档中的更新待处理连接

DevOps 工程师

将文件上传到远程存储库。

将您从aws-samples存储库下载并在之前的步骤中编辑的所有文件上传到远程存储库。对main分支的更改会启动管道,管道会创建或更新权限集和分配。

DevOps 工程师
Task描述所需技能

更新权限集和分配。

MoveAccount Amazon EventBridge 规则检测到组织中的账户被修改时,CI/CD pipeline automatically starts and updates the permission sets. For example, if you add an account to an OU specified in the assignments JSON file, then the CI/CD管道会将权限集应用于新账户。

如果要修改已部署的权限集和分配,请更新 JSON 文件,然后将其提交到远程存储库。

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

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

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

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

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

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

  • 您无法删除分配给的权限集 AWS 账户。首先,您必须取消分配权限集。

DevOps 工程师

故障排除

事务解决方案

访问被拒绝错误

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

验证阶段的管道错误

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

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

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

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

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

相关资源