使用 Cloud Cust AWS odian 自动将 Systems Manager 的托管策略附加到EC2实例配置文件和 AWS CDK - AWS Prescriptive Guidance

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

使用 Cloud Cust AWS odian 自动将 Systems Manager 的托管策略附加到EC2实例配置文件和 AWS CDK

由 Ali Asfour (AWS) 和 Aaron Lennon () 创作 AWS

环境:PoC 或试点

技术: DevOps; DevelopmentAndTesting; 管理和治理; 安全、身份、合规; 基础架构

工作负载:开源

AWS服务:亚马逊SNS;亚马逊;;SQSAWS CodeBuildAWS CodePipeline;S AWS ystems Manager;AWS CodeCommit

Summary

您可以将亚马逊弹性计算云 (AmazonEC2) 实例与 Syst AWS ems Manager 集成,以自动执行操作任务并提供更多的可见性和控制力。要与 Systems Manager 集成,EC2实例必须安装一个 S AWSystems Manager SSM 代理(代理IAM),并在其实例配置文件上附加AmazonSSMManagedInstanceCoreAWS身份和访问管理 () 策略。 

但是,如果您想确保所有EC2实例配置文件都附加了AmazonSSMManagedInstanceCore策略,则在更新没有EC2实例配置文件的新实例或EC2具有实例配置文件但没有AmazonSSMManagedInstanceCore策略的实例时可能会遇到困难。在多个 Amazon Web Services (AWS) 账户和AWS地区中添加此政策也可能很困难。

这种模式通过在您的AWS账户中部署三个 Cloud Custodian 策略来帮助解决这些挑战:

  • 第一个 Cloud Custodian 策略会检查是否有实例配置文件但没有该AmazonSSMManagedInstanceCore策略的现有EC2实例。然后附上 AmazonSSMManagedInstanceCore 策略。 

  • 第二个 Cloud Custodian 策略会检查没有EC2实例配置文件的现有实例,并添加附加了该AmazonSSMManagedInstanceCore策略的默认实例配置文件。

  • 第三个 Cloud Cust AWSodian 策略在您的账户中创建 Lambda 函数,以监控实例和实例EC2配置文件的创建。这样可以确保在创建EC2实例时自动附加AmazonSSMManagedInstanceCore策略。

这种模式使用AWS DevOps工具将云托管人策略持续大规模部署到多账户环境,而无需配置单独的计算环境。 

先决条件和限制

先决条件

  • 两个或更多活跃AWS账户。一个账户是安全账户,其他账户是成员账户

  • 在安全账户中配置AWS资源的权限。此模式使用管理员权限,但您应根据贵组织的要求和策略授予权限。

  • 能够担任从安全账户到成员账户的IAM角色并创建所需的IAM角色。有关这方面的更多信息,请参阅IAM文档中的使用IAM角色委派跨AWS账户访问权限

  • AWS命令行界面 (AWSCLI),已安装和配置。出于测试目的,您可以使用aws configure命令或设置环境变量进行配置AWSCLI。重要:不建议在生产环境中这样做,我们建议仅向该账户授予访问的最低权限。有关这方面的更多信息,请参阅IAM文档中的授予最低权限

  • devops-cdk-cloudcustodian.zip 文件(附件)下载到本地计算机中。

  • 熟悉 Python。

  • 已安装和配置所需的工具(Node.js、AWS Cloud Development Kit (AWSCDK) 和 Git)。您可以使用 install-prerequisites.sh 文件中的 devops-cdk-cloudcustodian.zip 文件来安装这些工具。确保以根权限运行此文件。 

限制

  • 尽管这种模式可以在生产环境中使用,但请确保所有IAM角色和策略都符合组织的要求和政策。 

软件包版本

  • 云托管人版本 0.9 或更高版本

  • TypeScript 版本 3.9.7 或更高版本

  • Node.js 版本 14.15.4 或更高版本

  • npm 版本 7.6.1 或更高版本

  • AWSCDK版本 1.96.0 或更高版本

架构

AWS CodePipeline workflow with CodeCommit, CodeBuild, and deployment to member accounts.

图表显示了以下工作流:

  1. 云托管人策略被推送到安全账户中的AWS CodeCommit 存储库。Amazon E CloudWatch vents 规则会自动启动AWS CodePipeline 管道。

  2. 管道从中获取最新的代码,并将其发送到由处理的持续集成 CodeCommit 和持续交付 (CI/CD) 管道的持续集成部分。AWS CodeBuild

  3. CodeBuild 执行完整的 DevSecOps 操作,包括对 Cloud Custodian 策略进行策略语法验证,并在--dryrun模式下运行这些策略以检查识别了哪些资源。

  4. 如果没有错误,则下一个任务会提醒管理员查看更改并批准向成员账户部署。

技术堆栈

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自动化和扩缩

pipelin AWS CDK es 模块提供了一个 CI/CD 管道,除了使用 CodePipeline 堆栈部署AWS资源外 CodeBuild,该管道还用于协调源代码的构建和测试。AWS CloudFormation 您可以对贵组织中的所有成员账户和区域使用此模式。您还可以扩展Roles creation堆栈以在您的成员账户中部署其他IAM角色。 

工具

  • AWSCloud Development Kit (AWSCDK) 是一个软件开发框架,用于在代码中定义云基础架构并通过它进行配置AWS CloudFormation。

  • AWSCommand Line Interface (AWSCLI) 是一个开源工具,可让您使用命令行外壳中的命令与AWS服务进行交互。

  • AWS CodeBuild是云端完全托管的生成服务。

  • AWS CodeCommit是一项版本控制服务,可用于私下存储和管理资产。

  • AWS CodePipeline是一项持续交付服务,可用于对发布软件所需的步骤进行建模、可视化和自动化。

  • AWSIdent@@ ity and Access Managem ent 是一项网络服务,可帮助您安全地控制对AWS资源的访问。

  • 云托管人是一种工具,可将大多数组织用于管理其公共云账户的数十种工具和脚本统一到一个开源工具中。

  • Node.js 是一个基于谷歌浏览器 V8 JavaScript 引擎构建的 JavaScript 运行时。

代码

有关此模式中使用的模块、账户函数、文件和部署命令的详细列表,请参阅 devops-cdk-cloudcustodian.zip 文件(附件)中的 README 文件。

操作说明

任务描述所需技能

设置 CodeCommit 存储库。

  1. devops-cdk-cloudcustodian.zip 文件(附件)解压缩到本地计算机上的工作目录中。

  2. 使用您的安全帐户登录AWS管理控制台,打开 CodeCommit 控制台,然后创建新的devops-cdk-cloudcustodian存储库。

  3. 进入项目目录并将 CodeCommit 存储库设置为源,提交更改,然后通过运行以下命令将其推送到 origin 分支:

  • cd devops-cdk-cloudcustodian 

  • git init --initial-branch=main

  • git add . git commit -m 'initial commit' 

  • git remote add origin https://git-codecommit.us-east-1.amazonaws.com/v1/devops-cdk-cloudcustodian 

  • git push origin main

有关这方面的更多信息,请参阅AWS CodeCommit 文档中的创建 CodeCommit 存储库

开发人员

安装所需工具。

使用该 install-prerequisites.sh 文件在 Amazon Linux 上安装所有必需的工具。这不包括在内,AWSCLI因为它是预先安装的。

有关这方面的更多信息,请参阅AWSCDK文档AWSCDK中入门的 “先决条件” 部分。

开发人员

安装所需的AWSCDK软件包。

  1. 通过在中运行以下命令来设置您的虚拟环境 AWSCLI:$ python3 -m venv .env

  2. 运行以下命令来设置虚拟环境:$ source .env/bin/activate

  3. 激活虚拟环境后,通过运行以下命令来安装所需依赖项:$ pip install -r requirements.txt

  4. 要添加其他依赖项(例如,其他AWSCDK库),请将其添加到requirements.txt文件中,然后运行以下命令:pip install -r requirements.txt

以下软件包是必需的,AWSCDK并且包含在requirements.txt文件中:

  • aws-cdk.aws-cloudwatch

  • aws-cdk.aws-codebuild

  • aws-cdk.aws-codecommit

  • aws-cdk.aws-codedeploy

  • aws-cdk.aws-codepipeline

  • aws-cdk.aws-codepipeline-actions

  • aws-cdk.aws-events

  • aws-cdk.aws-events-targets

  • aws-cdk.aws-iam

  • aws-cdk.aws-logs

  • aws-cdk.aws-s3

  • aws-cdk.aws-sns

  • aws-cdk.aws-sns-subscriptions

  • aws-cdk.aws-sqs

  • aws-cdk.core

开发人员
任务描述所需技能

更新所需变量。

打开 CodeCommit 存储库根文件夹中的vars.py文件并更新以下变量:

  •  var_deploy_region = ‘us-east-1’使用您想要部署管道的AWS区域进行更新。

  •  var_codecommit_repo_name = “cdk-cloudcustodian”使用 CodeCommit 存储库的名称进行更新。

  •  var_codecommit_branch_name = “main”使用 CodeCommit 分支的名称进行更新。

  •  使用批准更改的管理员的电子邮件地址更新 var_adminEmail=notifyadmin@email.com’

  • 使用用于在更改时发送云托管人通知的 Slack Webhook 更新 var_slackWebHookUrl = https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX’。

  •  使用贵组织 ID 更新 var_orgId = ‘o-yyyyyyyyyy’

  • security_account = ‘123456789011’使用部署管道的账户的账户 ID 进行更新。AWS

  • member_accounts = [‘111111111111’,’111111111112’,’111111111113’]使用要在其中引导AWSCDK堆栈并部署所需IAM角色的成员账户进行更新。

  • True如果您cdk_bootstrap_member_accounts = True希望管道自动引导到您的成员账户,请AWSCDK将其设置为。 如果设置为,True则还需要成员账户中现有IAM角色的名称,该角色可以从安全账户中担任。此IAM角色还必须具有引导所需的权限。AWS CDK

  • cdk_bootstrap_role = ‘AWSControlTowerExecution’使用成员账户中的现有IAM角色进行更新,该角色可以从安全账户中担任。此角色还必须具有引导权限。AWS CDK注意:仅在 cdk_bootstrap_member_accounts 设置为 True 时适用。

开发人员

使用成员账户信息更新 account.yml 文件。

要对多个账户运行 c7n-org Cloud Custodian 工具,必须将 accounts.yml 配置文件放在存储库的根目录中。以下是云托管人配置文件的示例:AWS

accounts: - account_id: '123123123123' name: account-1 regions: - us-east-1 - us-west-2 role: arn:aws:iam::123123123123:role/CloudCustodian vars: charge_code: xyz tags: - type:prod - division:some division - partition:us - scope:pci
开发人员
任务描述所需技能

引导安全账户。

运行以下命令,使用 cloudcustodian_stack 应用程序引导 deploy_account

cdk bootstrap -a 'python3 cloudcustodian/cloudcustodian_stack.py
开发人员

选项 1 – 自动引导成员账户。

如果在 vars.py 文件中将 cdk_bootstrap_member_accounts 变量设置为 True,则管线会自动引导 member_accounts 变量中指定的账户。

如果需要,您可以使用可以从安全账户中担任且具有引导所需权限的IAM角色进行更新*cdk_bootstrap_role*。AWS CDK

管线会自动引导添加到 member_accounts  变量中的新账户,以便可以部署所需角色。

开发人员

选项 2 – 手动引导成员账户。

尽管我们不建议使用这种方法,但您可以将 cdk_bootstrap_member_accounts 的值设置为 False,然后通过运行以下命令手动执行此步骤:

$ cdk bootstrap -a 'python3 cloudcustodian/member_account_roles_stack.py' \ --trust {security_account_id} \ --context assume-role-credentials:writeIamRoleName={role_name} \ --context assume-role-credentials:readIamRoleName={role_name} \ --mode=ForWriting \ --context bootstrap=true \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess

重要:请务必使用可以从安全账户担任{security_account_id}且具有引导所需权限的IAM角色名称来更新和{role_name}值。AWS CDK

您也可以使用其他方法来引导成员帐户,例如,使用AWS CloudFormation。有关这方面的更多信息,请参阅文档中的AWSCDK引导

开发人员
任务描述所需技能

在成员账户中创建IAM角色。

运行以下命令部署member_account_roles_stack堆栈并在成员账户中创建IAM角色:

cdk deploy --all -a 'python3 cloudcustodian/member_account_roles_stack.py' --require-approval never
开发人员

部署云托管人管线堆栈。

运行以下命令以创建部署到安全账户的云托管人 cloudcustodian_stack.py 管线:

cdk deploy -a 'python3 cloudcustodian/cloudcustodian_stack.py'
开发人员

相关资源

附件

要访问与此文档相关联的其他内容,请解压以下文件:attachment.zip