本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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 准备的执行摘要,这有助于他们了解变更。
先决条件和限制
先决条件
限制
架构
下图显示了策略管理管道及其相关资源的工作流程。

图表显示了以下工作流:
用户提交对远程仓库主分支中的
scp-management.json
或rcp-management.json
清单文件所做的更改。对
main
分支的更改会启动管道。 AWS CodePipelineCodePipeline 启动
Validate-Plan
CodeBuild 项目。此项目使用远程仓库中的 Python 脚本来验证策略和策略清单文件。该 CodeBuild 项目执行以下操作:检查 SCP 和 RCP 清单文件是否包含唯一语句 IDs ()
Sid
。使用
scp-policy-processor/main.py
和rcp-policy-processor/main.py
Python 脚本将护栏文件夹中的护栏连接成单个 RCP 或 SCP 策略。它结合了具有相同Resource
Action
、和的护栏。Condition
AWS Identity and Access Management Access Analyzer 用于验证经过优化的最终策略。如果有任何发现,管道就会停止。
创建
scps.json
和rcps.json
文件,Terraform 使用这些文件来创建资源。运行
terraform plan
命令,该命令将创建 Terraform 执行计划。
(可选)该
Validate-Plan
CodeBuild 项目使用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 启动
Apply
CodeBuild 项目。该项目使用 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 是一项完全托管的 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-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 |
Connect 远程存储库。 | 在上一步中,Terraform 创建了与第三方 CodeConnections 存储库的连接。在AWS 开发者工具控制台 | AWS DevOps |
订阅 Amazon SNS 主题。 | Terraform 创建了一个亚马逊 SNS 话题。为终端节点订阅主题并确认订阅,以便批准者收到有关管道中待审批操作的通知。有关说明,请参阅创建 Amazon SNS 订阅主题。 | 常规 AWS |
Task | 描述 | 所需技能 |
---|---|---|
填充远程存储库。 | 从克隆的存储库中,将该 | DevOps 工程师 |
定义您的环境。 |
| DevOps 工程师 |
定义您的护栏。 |
| DevOps 工程师 |
定义您的政策。 |
| DevOps 工程师 |
Task | 描述 | 所需技能 |
---|---|---|
配置清单文件。 |
| DevOps 工程师 |
启动管道。 | 提交更改并将其推送到您在 | DevOps 工程师 |
批准更改。 |
| 常规 AWS,政策批准者 |
验证部署。 |
| 常规 AWS |
故障排除
事务 | 解决方案 |
---|---|
管道 | 如果
|
IAM Access Analyzer 在管道 | 如果防护栏或策略定义中存在任何错误,则管道输出中会出现 “验证和计划阶段在 IAM Access Analyzer 中发现的结果” 消息。此模式使用 IAM 访问分析器来验证最终策略。执行以下操作:
|
相关资源
JSON 策略元素参考(IAM 文档)
资源控制政策(AWS Organizations 文档)
服务控制策略(AWS Organizations 文档)
添加或移除对亚马逊 Bedrock 基础模型的访问权限(亚马逊 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>