使用 AWS CodePipeline 和 Amazon Bedrock 将 AWS Organizations 政策作为代码进行管理 - AWS Prescriptive Guidance

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

使用 AWS CodePipeline 和 Amazon Bedrock 将 AWS Organizations 政策作为代码进行管理

Andre Cavalcante 和 Mariana Pessoa de Queiroz,Amazon Web Services

摘要

您可以使用中的授权策略 AWS Organizations 来集中配置和管理成员账户中委托人和资源的访问权限。服务控制策略 (SCPs) 定义组织中 AWS Identity and Access Management (IAM) 角色和用户的最大可用权限。资源控制策略 (RCPs) 定义组织中资源可用的最大权限。

此模式可帮助您管理通过持续集成 SCPs 和 RCPs 持续部署 (CI/CD) 管道部署的基础架构即代码 (IaC)。通过使用 AWS CloudFormation 或 Hashicorp Terraform 来管理这些策略,您可以减轻与构建和维护多个授权策略相关的负担。

此图案包括以下特征:

  • 您可以使用清单文件(和rcp-management.json)创建、删除scp-management.json和更新授权策略。

  • 你使用的是护栏而不是政策。你可以在清单文件中定义护栏及其目标。

  • 该管道使用 AWS CodeBuild 和 AWS CodePipeline,合并并优化了清单文件中的护栏。对于清单文件中的每条语句,管道将护栏组合成单个 SCP 或 RCP,然后将其应用于定义的目标。

  • AWS Organizations 将策略应用于您的目标。目标可以是 AWS 账户、组织单位 (OU)、环境(这是一组帐户或 OUs 您在environments.json文件中定义的帐户)或一组共享AWS 标签的帐户。

  • Amazon Bedrock 会读取管道日志并汇总所有政策变更。

  • 该管道需要手动批准。批准者可以查看 Amazon Bedrock 准备的执行摘要,这有助于他们了解变更。

先决条件和限制

先决条件

限制

  • 您不能使用此模式来管理 SCPs 或 RCPs 在此 CI/CD 管道之外创建的内容。但是,您可以通过管道重新创建现有策略。有关更多信息,请参阅此模式的 其他信息” 部分中的将现有策略迁移到管道

  • 每个账户中的账户数量和策略均受配额和服务限制的约束 AWS Organizations。 OUs

  • 此模式不能用于在中配置管理策略 AWS Organizations,例如备份策略、标签策略、聊天应用程序策略或声明性策略。

架构

下图显示了策略管理管道及其相关资源的工作流程。

发布 SCPs 并 RCPs 通过策略管理管道。

图表显示了以下工作流:

  1. 用户提交对远程仓库主分支中的scp-management.jsonrcp-management.json清单文件所做的更改。

  2. main分支的更改会启动管道。 AWS CodePipeline

  3. CodePipeline 启动Validate-Plan CodeBuild 项目。此项目使用远程仓库中的 Python 脚本来验证策略和策略清单文件。该 CodeBuild 项目执行以下操作:

    1. 检查 SCP 和 RCP 清单文件是否包含唯一语句 IDs () Sid

    2. 使用scp-policy-processor/main.pyrcp-policy-processor/main.py Python 脚本将护栏文件夹中的护栏连接成单个 RCP 或 SCP 策略。它结合了具有相同ResourceAction、和的护栏。Condition

    3. AWS Identity and Access Management Access Analyzer 用于验证经过优化的最终策略。如果有任何发现,管道就会停止。

    4. 创建scps.jsonrcps.json文件,Terraform 使用这些文件来创建资源。

    5. 运行terraform plan命令,该命令将创建 Terraform 执行计划。

  4. (可选)该Validate-Plan CodeBuild 项目使用bedrock-prompt/prompt.py脚本向 Amazon Bedrock 发送提示。你可以在bedrock-prompt/prompt.txt文件中定义提示。Amazon Bedrock 使用 Anthropic Claude Sonnet 3.5 通过分析 Terraform 和 Python 日志来生成拟议变更的摘要。

  5. CodePipeline 使用亚马逊简单通知服务 (Amazon SNS) Service 主题来通知批准者必须对更改进行审查。如果 Amazon Bedrock 生成了变更摘要,则通知中将包含此摘要。

  6. 策略批准者在中批准该操作。 CodePipeline如果 Amazon Bedrock 生成了变更摘要,则批准者可以在批准 CodePipeline 之前查看该摘要。

  7. CodePipeline 启动Apply CodeBuild 项目。该项目使用 Terraform 来应用 RCP 和 SCP 的更改。 AWS Organizations

与此架构关联的 IaC 模板还部署了以下支持策略管理管道的资源:

  • 用于存储 CodePipeline 项目和脚本的 Amazon S3 存储桶,例如scp-policy-processor/main.pybedrock-prompt/prompt.py

  • 用于加密此解决方案创建的资源的 AWS Key Management Service (AWS KMS) 密钥

工具

AWS 服务

  • Amazon Bedrock 是一项完全托管的 AI 服务,它使许多高性能的基础模型可供通过统一的 API 使用。

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

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

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

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

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

其他工具

  • HashiCorp Terraform 是一款 IaC 工具,可帮助您使用代码来配置和管理云基础架构和资源。

代码存储库

此模式的代码可在organizations-policy-pipeline GitHub 存储库中找到。以下是该sample-repository文件夹中包含的关键文件:

  • environments文件夹中,environments.json包含环境列表。环境是一组目标,它们可以包含 AWS 账户 IDs 或组织单位 (OUs)。

  • rcp-management文件夹中:

    • guardrails文件夹包含您的个人护栏 RCPs

    • policies文件夹包含个人 RCPs

    • rcp-management.json清单文件可帮助您管理 RCP 护栏(已满)及其 RCPs相关目标。

  • scp-management文件夹中:

    • guardrails文件夹包含您的个人护栏 SCPs

    • policies文件夹包含个人 SCPs

    • scp-management.json清单文件可帮助您管理 SCP 护栏(已满)及其 SCPs相关目标。

  • utils文件夹包含脚本,可以帮助您迁移当前脚本 SCPs , RCPs 以便您可以通过管道对其进行管理。有关更多信息,请参阅此模式的其他信息部分。

最佳实践

  • 在设置管道之前,我们建议您确认自己尚未达到 AWS Organizations 配额限制。

  • 我们建议您仅将 AWS Organizations 管理账户用于必须在该账户中执行的任务。有关更多信息,请参阅管理账户的最佳实践

操作说明

Task描述所需技能

创建存储库。

创建一个存储库,您的安全运营团队将从中管理策略。使用 AWS CodeConnections 支持的第三方存储库提供商之一。

DevOps 工程师

委托策略管理。

将 AWS Organizations 策略的管理委托给您部署管道的成员账户。有关说明,请参阅使用创建基于资源的委托策略。 AWS Organizations有关策略示例,请参阅此模式的 “其他信息” 部分中的基于资源的委托策略示例。

AWS 管理员

(可选)启用基础模型。

如果您想生成政策变更摘要,请在部署管道的 Amazon Bedrock 中启用对 Anthropic Claude 3.5 Sonnet 基础模型 AWS 账户 的访问权限。有关说明,请参阅添加或移除对 Amazon Bedrock 基础模型的访问权限

常规 AWS
Task描述所需技能

克隆存储库。

输入以下命令以从中克隆organizations-policy-pipeline 存储库 GitHub:

git clone https://github.com/aws-samples/organizations-policy-pipeline.git

DevOps 工程师

定义您的部署方法。

  1. 在克隆的存储库中,打开该variables.tf文件。

  2. 对于project_name,输入要应用于已部署资源名称的前缀。

  3. 对于provider_type,请输入远程存储库的提供商。文件中提供了有效值。

  4. 对于full_repository_name,输入远程存储库的名称。

  5. 对于branch_name,输入您将用于部署策略的 Git 分支的名称。在此分支中推送或合并会启动管道。通常,这是主分支。

  6. 对于terraform_version,请输入您正在使用的 Terraform 版本。

  7. 对于enable_bedrocktrue如果您想让 Amazon Bedrock 汇总更改,请输入。false如果您不想生成更改摘要,请输入。

  8. 对于tags,输入要作为标签分配给已部署资源的键值对。

  9. 保存并关闭 variables.tf文件。

DevOps 工程师

部署管道。

  1. 输入以下命令以创建计划并查看更改:

    terraform plan
  2. 输入以下命令以应用计划并创建管道基础架构:

    terraform apply
DevOps 工程师,Terraform

Connect 远程存储库。

在上一步中,Terraform 创建了与第三方 CodeConnections 存储库的连接。在AWS 开发者工具控制台中,将连接状态从更改PENDINGAVAILABLE。有关说明,请参阅更新待处理的连接

AWS DevOps

订阅 Amazon SNS 主题。

Terraform 创建了一个亚马逊 SNS 话题。为终端节点订阅主题并确认订阅,以便批准者收到有关管道中待审批操作的通知。有关说明,请参阅创建 Amazon SNS 订阅主题。

常规 AWS
Task描述所需技能

填充远程存储库。

从克隆的存储库中,将该sample-repository文件夹的内容复制到您的远程存储库。这包括environmentsrcp-managementscp-management、和utils文件夹。

DevOps 工程师

定义您的环境。

  1. environments文件夹中,打开environments.json文件。这是您定义目标的文件,也是 OUs 为 AWS 账户 和定义目标的文件 RCPs SCPs。

  2. 删除示例环境。

  3. 按以下格式添加目标环境:

    [ { "ID": "<environment-name>", "Target": [ "<ou-name>:<ou-id>", "<account-name>:<account-id>" ] } ]

    其中:

    • <environment-name>是您分配给该组 OUs 和 AWS 账户的名称。您可以在清单文件中使用此名称来定义要将策略应用到何处。

    • <ou-name>是目标 OU 的名称。

    • <ou-id>是目标 OU 的 ID。

    • <account-name>是目标的名称 AWS 账户。

    • <account-id>是目标的 ID AWS 账户。

    有关示例,请参阅源代码存储库

  4. 保存并关闭 environments.json文件。

DevOps 工程师

定义您的护栏。

  1. 导航到远程存储库中的rcp-management/guardrails文件夹。这是您为 RCP 清单文件定义防护栏的文件夹。每个护栏都必须存放在单独的文件中。Guardrail 文件可以包含一个或多个语句。

    注意

    您可以在和的清单文件中的多个语句中使用相同的护栏。 SCPs RCPs如果您修改护栏,则包含此护栏的所有策略都会受到影响。

  2. 删除从源代码存储库中复制的所有示例护栏。

  3. 创建一个新的.json 文件并为其指定一个描述性名称。

  4. 打开您创建的.json 文件。

  5. 按以下格式定义护栏:

    [ { "Sid": "<guardrail-name>", "Effect": "<effect-value>", "Action": [ "<action-name>" ], "Resource": "<resource-arn>", "Condition": { "<condition-operator>": { "<condition-key>": [ "<condition-value>" ] } } } ]

    其中:

    • <guardrail-name>是护栏的唯一名称。此名称不能用于任何其他护栏。

    • <effect-value>必须是AllowDeny。有关更多信息,请参见效果

    • <action-name>必须是该服务支持的操作的有效名称。有关更多信息,请参阅操作

    • <resource-arn>是护栏所适用的资源的亚马逊资源名称 (ARN)。也可以使用通配符,例如*?。有关更多信息,请参阅资源

    • <condition-operator>是有效的条件运算符。有关更多信息,请参阅条件运算符

    • <condition-key>是有效的全局条件上下文密钥或特定于服务的上下文密钥。有关更多信息,请参阅条件

    • <condition-value>是条件中用来评估护栏是否适用的特定值。有关更多信息,请参阅条件

    例如 RCP 护栏,请参阅源代码存储库。

  6. 保存并关闭.json 文件。

  7. 重复这些步骤,根据需要创建任意数量的 RCP 护栏。

  8. scp-management/guardrails文件夹中重复这些步骤,根据需要创建任意数量的护栏。 SCPs例如 SCP 护栏,请参阅源代码存储库。

DevOps 工程师

定义您的政策。

  1. 导航到远程存储库中的rcp-management/policies文件夹。您可以在此文件夹中为 RCP 清单文件定义完整策略。每份策略都必须是一个单独的文件。

    注意

    如果您修改此文件夹中的策略,则根据清单文件中的定义 OUs ,策略更改会影响任何账户或应用此策略的账户。

  2. 删除从源代码存储库中复制的所有示例策略。

  3. 创建一个新的.json 文件并为其指定一个描述性名称。

  4. 打开您创建的.json 文件。

  5. 定义 RCP。例如 RCPs,请参阅源代码存储库或参阅 AWS Organizations 文档中的资源控制策略示例

  6. 保存并关闭.json 文件。

  7. 重复这些步骤,根据需要创建任意数量 RCPs 的内容。

  8. scp-management/policies文件夹中重复这些步骤,根据需要创建 SCPs 任意数量的文件。例如 SCPs,请参阅源代码存储库或参阅 AWS Organizations 文档中的服务控制策略示例

DevOps 工程师
Task描述所需技能

配置清单文件。

  1. rcp-management文件夹中,打开rcp-management.json文件。在此文件中,您可以定义哪些 RCP 护栏和完整版 RCPs 适用于您的目标环境。有关此文件的示例,请参阅源代码存储库

  2. 删除示例语句。

  3. 按以下格式添加一条新语句:

    [ { "SID": "<statement-name>", "Target": { "Type": "<target-type>", "ID": "<target-name>" }, "Guardrails": [ "<guardrail-name>" ], "Policy": "<policy-name>", "Comments": "<comment-text>" } ]

    其中:

    • <statement-name>是该语句的唯一名称。

    • <target-type>是您要应用策略的目标类型。有效值为 AccountOUEnvironmentTag

    • <target-name>是您要将策略应用到的目标的标识符。输入以下内容之一:

      • 对于 AWS 账户,请将标识符输入为<account-name>:<account-id>

      • 对于 OU,请将标识符输入为<OU-name>:<ou-id>

      • 对于环境,请输入您在environments.json文件中定义的唯一名称。

      • 对于标签,将键值对输入为。<tag-key>:<tag-value>

    • <guardrail-name>是您在文件夹中定义的 RCP 护栏的唯一名称。rcp-management/guardrails您可以在此元素中添加多个护栏。如果您不想使用护栏,可以将此字段留空。

    • <policy-name>是您在rcp-management/policies文件夹中定义的 RCP 的唯一名称。您只能在此元素中添加一个策略。如果您不想应用策略,可以将此字段留空。

    • <comment-text>是您可以为文档目的输入的描述。管道处理期间不使用此字段。如果您不想添加评论,可以将此字段留空。

  4. 重复这些步骤,根据需要添加任意数量的语句,以便 RCPs 为您的组织进行配置。

  5. 保存并关闭 rcp-management.json文件。

  6. scp-management文件夹中,在scp-management.json文件中重复这些步骤。在此文件中,您可以定义哪些 SCP 护栏和完整版 SCPs 适用于您的目标环境。有关此文件的示例,请参阅源代码存储库

DevOps 工程师

启动管道。

提交更改并将其推送到您在variables.tf文件中定义的远程存储库的分支。通常,这是分main支。 CI/CD 管道会自动启动。如果有任何管道错误,请参阅此模式的 “故障排除” 部分。

DevOps 工程师

批准更改。

Validate-Plan CodeBuild 项目完成后,策略批准者会通过您之前配置的 Amazon SNS 主题收到通知。执行以下操作:

  1. 打开通知消息。

  2. 如果有,请查看政策变更摘要。

  3. 按照中的批准或拒绝批准操作中的说明进行操作 CodePipeline

常规 AWS,政策批准者

验证部署。

  1. 使用作为其委派管理员的账户登录AWS Organizations 控制台 AWS Organizations。

  2. 在 “服务控制策略” 页面上,确认已列出您创建的策略。 SCPs

  3. 选择通过管道管理的 SCP,并确认它适用于预期目标。

  4. 资源控制策略页面上,确认已列出您创建的策略。 RCPs

  5. 选择通过管道管理的 RCP,并确认它适用于预期目标。

常规 AWS

故障排除

事务解决方案

管道Validate-Plan阶段的清单文件错误

如果scp-management.jsonrcp-management.json文件中存在任何错误,则管道输出中会出现 “清单文件在验证和计划阶段出现管道错误” 消息。可能的错误包括环境名称不正确、字段或值重复 SIDs或无效。执行以下操作:

  1. 按照中查看版本详细信息中的说明进行操作 AWS CodeBuild。

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

  3. 更新相应的.json 文件。

  4. 提交更新后的文件并将其推送到远程存储库。管道重新启动。

  5. 监控状态以确认验证错误已解决。

IAM Access Analyzer 在管道Validate-Plan阶段的调查结果

如果防护栏或策略定义中存在任何错误,则管道输出中会出现 “验证和计划阶段在 IAM Access Analyzer 中发现的结果” 消息。此模式使用 IAM 访问分析器来验证最终策略。执行以下操作:

  1. 按照中查看版本详细信息中的说明进行操作 AWS CodeBuild。

  2. 在构建日志中,找到 IAM 访问分析器验证错误。该错误提供了有关导致构建失败的原因的更多信息。有关调查结果类型的更多信息,请参阅 IAM 策略验证检查参考

  3. 更新护栏或政策的相应.json 文件。

  4. 提交更新后的文件并将其推送到远程存储库。管道重新启动。

  5. 监控状态以确认验证错误已解决。

相关资源

其他信息

基于资源的授权策略示例

以下是基于资源的授权策略示例。 AWS Organizations它允许委派的管理员账户 RCPs 为组织 SCPs 管理和管理。在以下示例策略中,<MEMBER_ACCOUNT_ID>替换为您部署策略管理管道的账户的 ID。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegationToAudit", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<MEMBER_ACCOUNT_ID>:root" }, "Action": [ "organizations:ListTargetsForPolicy", "organizations:CreatePolicy", "organizations:DeletePolicy", "organizations:AttachPolicy", "organizations:DetachPolicy", "organizations:DisablePolicyType", "organizations:EnablePolicyType", "organizations:UpdatePolicy", "organizations:DescribeEffectivePolicy", "organizations:DescribePolicy", "organizations:DescribeResourcePolicy" ], "Resource": "*" } ] }

将现有策略迁移到管道

如果您已有 SCPs 或 RCPs 想要通过此管道进行迁移和管理,则可以使用代码仓库sample-repository/utils文件夹中的 Python 脚本。这些脚本包括:

  • check-if-scp-exists-in-env.py— 此脚本检查指定策略是否适用于您在environments.json文件中定义的特定环境中的任何目标。输入以下命令来运行此脚本:

    python3 check-if-scp-exists-in-env.py \ --policy-type <POLICY_TYPE> \ --policy-name <POLICY_NAME> \ --env-id <ENV_ID>

    替换此命令中的以下内容:

    • <POLICY_TYPE>scp 或者 rcp

    • <POLICY_NAME>是 SCP 或 RCP 的名称

    • <ENV_ID>是您在environments.json文件中定义的环境的 ID

  • create-environments.py— 此脚本根据当前环境 SCPs 和 RCPs 您的环境创建一个 environments.json 文件。它不包括通过部署的策略 AWS Control Tower。输入以下命令来运行此脚本,其中<POLICY_TYPE>scprcp

    python create-environments.py --policy-type <POLICY_TYPE>
  • verify-policies-capacity.py— 此脚本会检查您定义的每个环境,以确定每个 AWS Organizations 与策略相关的配额还剩多少容量。您可以定义要签入environments.json文件的环境。输入以下命令来运行此脚本,其中<POLICY_TYPE>scprcp

    python verify-policies-capacity.py --policy-type <POLICY_TYPE>