本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS CodePipeline 和 Amazon Bedrock 将 AWS Organizations 政策作为代码进行管理
Andre Cavalcante 和 Mariana Pessoa de Queiroz,Amazon Web Services
Summary
您可以使用中的授权策略 AWS Organizations 来集中配置和管理成员账户中委托人和资源的访问权限。服务控制策略 (SCPs) 定义组织中 AWS Identity and Access Management (IAM) 角色和用户的最大可用权限。资源控制策略 (RCPs) 定义组织中资源可用的最大权限。
此模式可帮助您管理通过持续集成 SCPs 和 RCPs 持续部署 (CI/CD) 管道部署的基础架构即代码 (IaC)。通过使用 AWS CloudFormation 或 Hashicorp Terraform 来管理这些策略,您可以减轻与构建和维护多个授权策略相关的负担。
此模式包括下列功能:
您可以使用清单文件(
scp-management.json和rcp-management.json)创建、删除和更新授权策略。您使用的是护栏,而不是政策。可以在清单文件中定义护栏及其目标。
该管道使用 AWS CodeBuild 和 AWS CodePipeline,合并并优化了清单文件中的护栏。对于清单文件中的每个语句,管道会将护栏组合成单个 SCP 或 RCP,然后将其应用于定义的目标。
AWS Organizations 将策略应用于您的目标。目标可以是 AWS 账户、组织单位 (OU)、环境(这是一组帐户或 OUs 您在
environments.json文件中定义的帐户)或一组共享AWS 标签的帐户。Amazon Bedrock 将读取管道日志并汇总所有政策变更。
管道要求人工审批。审批者可以查看 Amazon Bedrock 准备的执行摘要,这有助于他们了解变更。
先决条件和限制
先决条件
限制
架构
下图所示为策略管理管道及其关联资源的工作流。

下图显示了如下工作流:
用户提交对远程存储库主分支中的
scp-management.json或rcp-management.json清单文件所做的更改。对
main分支的更改会启动管道。 AWS CodePipelineCodePipeline 启动
Validate-PlanCodeBuild 项目。此项目使用远程存储库中的 Python 脚本验证策略和策略清单文件。该 CodeBuild 项目执行以下操作:检查 SCP 和 RCP 清单文件是否包含唯一语句 IDs ()
Sid。使用
scp-policy-processor/main.py和rcp-policy-processor/main.pyPython 脚本将护栏文件夹中的护栏串联起来,形成单一的 RCP 或 SCP 策略。它会将具有相同Resource、Action和Condition的护栏相结合。AWS Identity and Access Management Access Analyzer 用于验证经过优化的最终策略。如有任何发现,管道会停止。
创建 Terraform 用于创建资源的
scps.json和rcps.json文件。运行将创建 Terraform 执行计划的
terraform plan命令。
(可选)该
Validate-PlanCodeBuild 项目使用bedrock-prompt/prompt.py脚本向 Amazon Bedrock 发送提示。您可以在bedrock-prompt/prompt.txt文件中定义提示。Amazon Bedrock 使用 Anthropic Claude Sonnet 3.5,通过分析 Terraform 和 Python 日志来生成拟议变更的摘要。CodePipeline 使用亚马逊简单通知服务 (Amazon SNS) Service 主题来通知批准者必须对更改进行审查。如果 Amazon Bedrock 生成变更摘要,则通知中将包含此摘要。
策略批准者在中批准该操作。 CodePipeline如果 Amazon Bedrock 生成了变更摘要,则批准者可以在批准 CodePipeline 之前查看该摘要。
CodePipeline 启动
ApplyCodeBuild 项目。该项目使用 Terraform 来应用 RCP 和 SCP 的更改。 AWS Organizations
与此架构关联的 IaC 模板还部署了以下支持策略管理管道的资源:
用于存储 CodePipeline 项目和脚本的 Amazon S3 存储桶,例如
scp-policy-processor/main.py和bedrock-prompt/prompt.py用于加密此解决方案创建的资源的 AWS Key Management Service (AWS KMS) 密钥
工具
AWS 服务
Amazon Bedrock 是完全托管式人工智能服务,通过统一的 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-pipelinesample-repository 文件夹中包含的关键文件:
在
environments文件夹中,environments.json包含环境列表。环境是一组目标,它们可以包含 AWS 账户 IDs 或组织单位 (OUs)。在
rcp-management文件夹中:该
guardrails文件夹包含您的个人护栏 RCPs该
policies文件夹包含个人 RCPsrcp-management.json清单文件可帮助您管理 RCP 护栏(已满)及其 RCPs相关目标。
在
scp-management文件夹中:该
guardrails文件夹包含您的个人护栏 SCPs该
policies文件夹包含个人 SCPsscp-management.json清单文件可帮助您管理 SCP 护栏(已满)及其 SCPs相关目标。
该
utils文件夹包含脚本,可以帮助您迁移当前脚本 SCPs , RCPs 以便您可以通过管道对其进行管理。有关更多信息,请参阅此模式的其他信息部分。
最佳实践
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
创建存储库。 | 创建一个存储库,供您的安全运营团队管理策略。使用 AWS CodeConnections 支持的第三方存储库提供商之一。 | DevOps 工程师 |
委派策略管理。 | 将 AWS Organizations 策略的管理委托给您部署管道的成员账户。有关说明,请参阅使用创建基于资源的委托策略。 AWS Organizations有关策略示例,请参阅此模式其他信息部分的基于资源的委托策略示例。 | AWS 管理员 |
(可选)启用基础模型。 | 如果您想生成政策变更摘要,请在部署管道的 Amazon Bedrock 中启用对 Anthropic Claude 3.5 Sonnet 基础模型 AWS 账户 的访问权限。有关说明,请参阅添加或移除对 Amazon Bedrock 基础模型的访问权限。 | 常规 AWS |
| Task | 说明 | 所需技能 |
|---|---|---|
克隆存储库。 | 输入以下命令以从中克隆organizations-policy-pipeline
| DevOps 工程师 |
定义您的部署方法。 |
| DevOps 工程师 |
部署管道。 |
| DevOps 工程师,Terraform |
连接远程存储库。 | 在上一步中,Terraform 创建了与第三方 CodeConnections 存储库的连接。在 AWS 开发人员工具控制台 | AWS DevOps |
订阅 Amazon SNS 主题。 | Terraform 创建了一个 Amazon SNS 主题。为端点订阅主题并确认订阅,以便审批者收到有关管道中存在待审批操作的通知。有关说明,请参阅创建对 Amazon SNS 主题的订阅。 | 常规 AWS |
| Task | 说明 | 所需技能 |
|---|---|---|
填充远程存储库。 | 从克隆的存储库中,将 | DevOps 工程师 |
定义您的环境。 |
| DevOps 工程师 |
定义护栏。 |
| DevOps 工程师 |
定义政策。 |
| DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
配置清单文件。 |
| DevOps 工程师 |
启动管道。 | 提交更改并将其推送到您在 | DevOps 工程师 |
审批更改。 |
| AWS 总负责人、策略审批者 |
验证部署。 |
| 常规 AWS |
问题排查
| 问题 | 解决方案 |
|---|---|
管道 | 如果
|
IAM Access Analyzer 在管道的 | 如果护栏或策略定义中存在任何错误,管道输出中会出现“验证与计划阶段 IAM Access Analyzer 中的发现”的消息。此模式使用 IAM Access Analyzer 验证最终策略。执行以下操作:
|
相关资源
JSON 策略元素参考(IAM 文档)
资源控制政策(AWS Organizations 文档)
服务控制策略(AWS Organizations 文档)
添加或移除对 Amazon Bedrock 基础模型的访问权限(Amazon Bedrock 文档)
附加信息
基于资源的委派策略示例
以下是基于资源的授权策略示例。 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>为scp或rcp:python create-environments.py --policy-type <POLICY_TYPE>verify-policies-capacity.py— 此脚本会检查您定义的每个环境,以确定每个 AWS Organizations 与策略相关的配额还剩多少容量。可以在environments.json文件中定义要检查的环境。输入以下命令运行此脚本,其中<POLICY_TYPE>为scp或rcp:python verify-policies-capacity.py --policy-type <POLICY_TYPE>