本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Terraform 自动 GuardDuty 为组织启用亚马逊
由 Aarthi Kannan 创作 () AWS
摘要
亚马逊会 GuardDuty 持续监控您的 Amazon Web Services (AWS) 账户,并使用威胁情报来识别您的AWS环境中意外和潜在的恶意活动。跨多个AWS区域或通过AWS管理控制台 GuardDuty 为多个账户或组织手动启用可能很麻烦。您可使用基础设施即代码(IaC)工具(例如 Terraform)实现流程自动化,该工具可在云中配置和管理多账户、多区域的服务和资源。
AWS建议使用 Or AWS ganizations 在中设置和管理多个帐户 GuardDuty。这种模式符合此建议。这种方法的一个好处是,在创建或向组织中添加新账户时, GuardDuty 将在这些账户中自动为所有受支持的地区启用这些账户,而无需手动干预。
此模式演示如何使用 HashiCorp Terraform GuardDuty 为组织中的三个或更多亚马逊网络服务 (AWS) 账户启用亚马逊。此模式所提供的示例代码执行以下操作:
GuardDuty 为 Organizations 中AWS目标组织当前成员的所有AWS帐户启用
在中启用 “自动启用” 功能 GuardDuty,该功能会自动 GuardDuty 为将来添加到目标组织的所有帐户启用
允许您选择要启用的区域 GuardDuty
使用组织的安全账户作为 GuardDuty 委派管理员
在日志账户中创建 Amazon Simple Storage Service (Amazon S3) 存储桶,并 GuardDuty 配置为发布该存储桶中所有账户的汇总结果
默认情况下,分配生命周期策略,在 365 天后将调查发现从 S3 存储桶转移至 Amazon S3 Glacier Flexible Retrieval 存储
您可手动运行此示例代码,也可以将其集成至持续集成和持续交付 (CI/CD) 管道。
目标受众
建议有使用 Terraform、 GuardDuty Python 和 Organizations 经验的用户使用这种模式。AWS
先决条件和限制
先决条件
一个活动的 AWS 账户。
在 Organizations 中设置了一个AWS组织,它至少包含以下三个帐户:
管理账户 — 这是您从中部署 Terraform 代码的账户,可为是独立的,也可以作为 CI/CD 管道的一部分。Terraform 状态也存储至此账户。
安全帐户-此帐户用作 GuardDuty 委派管理员。有关更多信息,请参阅 GuardDuty 委派管理员的重要注意事项(GuardDuty 文档)。
日志账户 — 此账户包含 S3 存储桶,用于 GuardDuty 发布所有成员账户的汇总结果。
有关如何使用所需配置设置组织的更多信息,请参阅创建账户结构(Well-Architecte
AWS d Labs)。 一个 Amazon S3 存储桶和一个 Amazon DynamoDB 表,用作远程后端,将 Terraform 状态存储至管理账户中。有关使用远程后端获得 Terraform 状态的更多信息,请参见 S3 后端
(Terraform 文档)。有关使用 S3 后端设置远程状态管理的代码示例,请参阅 remote-state-s3 后端 (Terraform Registry)。请注意以下要求: 一个 S3 存储桶,用于存储 GuardDuty 将在其中发布发现结果的 S3 存储桶的访问日志。有关更多信息,请参阅启用 Amazon S3 服务器访问日志记录(Amazon S3 文档)。如果您要部署到 Cont AWS rol Tower 着陆区,则可以为此目的重复使用日志存档账户中的 S3 存储桶。
已安装并配置了 Terraform 版本 0.14.6 或更高版本。有关更多信息,请参阅入门-AWS
(Terraform 文档)。 Python 3.9.6 或更高版本已安装并配置。有关更多信息,请参见源版本
(Python 网站)。 AWSSDK已安装适用于 Python (Boto3)。更多信息,请参阅安装
(Boto3 文档)。 安装并配置了 jq。有关更多信息,请参阅下载 jq
(jq 文档)。
限制
此模式支持 macOS 和Amazon Linux 2 操作系统。此模式尚未经测试,无法在 Windows 操作系统中使用。
注意
亚马逊 Linux 2 的支持已接近终止。欲了解更多信息,请参阅亚马逊 Linux 2 FAQs
。 GuardDuty 必须尚未在任何目标区域的任何账户中启用。
这种模式的 IaC 解决方案不部署先决条件。
此模式专为符合以下最佳实践的AWS着陆区而设计:
着陆区是使用 Cont AWS rol Tower 创建的。
使用单独的AWS帐户进行安全性和日志记录。
产品版本
Terraform 版本 0.14.6 或更高版本。示例代码已经过 1.2.8 的测试。
Python,版本 3.9.6 或更高版本。
架构
本节概括介绍此解决方案,以及由示例代码建立的架构。下图显示了在单个AWS区域内跨组织中不同账户部署的资源。
Terraform 在安全账户和日志账户中创建 Ident GuardDutyTerraformOrgRoleAWSity and Access Management (IAM) 角色。
Terraform 在日志账户的默认AWS区域中创建一个 S3 存储桶。此存储桶用作发布目的地,用于汇总组织中所有区域和所有账户的所有 GuardDuty 调查结果。Terraform 还在安全账户中创建AWS密钥管理服务 (AWSKMS) 密钥,该密钥用于加密 S3 存储桶中的调查结果,并配置将结果从 S3 存储桶自动存档到 S3 Glacier 灵活检索存储中。
在管理帐户中,Terraform 将安全帐户指定为的委托管理员。 GuardDuty这意味着安全账户现在可以管理包括管理账户在内的所有成员账户的 GuardDuty 服务。个人成员账户不能自行暂停或 GuardDuty 禁用。
Terraform 在安全账户中为 GuardDuty 委托的管理员创建 GuardDuty 探测器。
如果尚未启用,Terraform 将在中启用 S3 保护。 GuardDuty有关更多信息,请参阅亚马逊中的 Amazon S3 保护 GuardDuty(GuardDuty 文档)。
Terraform 将组织中所有当前活跃的成员帐户注册为成员。 GuardDuty
Terraform 将 GuardDuty 委派管理员配置为将所有成员账户的汇总结果发布到日志账户中的 S3 存储桶。
Terraform 会为你选择的每个AWS区域重复步骤 3 到 7。
自动化和扩缩
提供的示例代码为模块化特点,因此您可以将其集成至您的 CI/CD 管道中以实现自动部署。
工具
AWS 服务
Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。
Amazon GuardDuty 是一项持续的安全监控服务,可分析和处理日志,以识别您的AWS环境中意外和可能未经授权的活动。
AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。
AWS密钥管理服务 (AWSKMS) 可帮助您创建和控制加密密钥以保护您的数据。
AWSO rganizations 是一项账户管理服务,可帮助您将多个AWS账户整合到一个由您创建和集中管理的组织中。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
AWSSDKf@@ or Python (Boto3)
是一个软件开发套件,可帮助你将 Python 应用程序、库或脚本与AWS服务集成。
其他工具和服务
HashiCorp Terraform
是一款命令行界面应用程序,可帮助您使用代码来配置和管理云基础架构和资源。 Python
是通用的编程语言。 jq
是一个命令行处理器,可以帮助你处理文件。JSON
代码存储库
此模式的代码可在 GitHub amazon-guardduty-for-aws-organizations-with-terraform
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
克隆存储库。 | 在 Bash Shell 中,运行以下命令。在 “其他信息” 部分的 “克隆存储库” 中,您可以复制包含 GitHub 存储库URL的完整命令。这会从中克隆 amazon-guardduty-for-aws-organizations-with-terraform
| DevOps 工程师 |
编辑 Terraform 配置文件。 |
| DevOps 工程师、将军、Terraform AWS、Python |
为新IAM角色生成 CloudFormation 模板。 | 此模式包括用于创建两个 CloudFormation 模板的 IaC 解决方案。这些模板创建了 Terraform 在设置过程中使用的两个IAM角色。这些模板遵循最低权限安全最佳实践。
| DevOps 工程师,将军 AWS |
创建IAM角色。 | 按照创建堆栈(CloudFormation 文档)中的说明,执行以下操作:
| DevOps 工程师,将军 AWS |
在管理账户中IAM扮演该角色。 | 作为安全最佳实践,我们建议您在继续操作之前先担任新management-account-roleIAM角色。在AWS命令行界面 (AWSCLI) 中,在 “其他信息” 部分的 “承担管理账户IAM角色” 中输入命令。 | DevOps 工程师,将军 AWS |
运行安装脚本。 | 在存储库
full-setup.sh脚本将执行以下操作:
| DevOps 工程师,Python |
任务 | 描述 | 所需技能 |
---|---|---|
运行清理脚本。 | 如果您使用此模式 GuardDuty 为组织启用并想要禁用 GuardDuty,请在存储库
此脚本在目标组织 GuardDuty 中禁用,删除所有已部署的资源,并将组织恢复到使用 Terraform 启用之前的状态。 GuardDuty 注意此脚本不会从本地和远程后端删除 Terraform 状态文件或锁定文件。如果需要执行此操作,则必须手动执行这些操作。此外,此脚本不会删除已导入的组织或由其管理的账户。在清理脚本中,并 GuardDuty 未禁用对的可信访问。 | DevOps 工程师、将军、Terraform AWS、Python |
移除IAM角色。 | 删除使用 role-to-assume-for-role-c reation.yaml 和.yaml 模板创建的堆栈。management-account-role CloudFormation 有关更多信息,请参阅删除堆栈(CloudFormation 文档)。 | DevOps 工程师,将军 AWS |
相关资源
AWS 文档
AWS市场营销
其他资源
其他信息
克隆存储库
运行以下命令来克隆 GitHub 存储库。
git clone https://github.com/aws-samples/amazon-guardduty-for-aws-organizations-with-terraform
担任管理账户IAM角色
要在管理账户中IAM扮演该角色,请运行以下命令。<IAM role ARN>
替换ARN为IAM角色的。
export ROLE_CREDENTIALS=$(aws sts assume-role --role-arn <IAM role ARN> --role-session-name AWSCLI-Session --output json) export AWS_ACCESS_KEY_ID=$(echo $ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g') export AWS_SECRET_ACCESS_KEY=$(echo $ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g') export AWS_SESSION_TOKEN=$(echo $ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')