使用 AWS Lambda 自动化功能 AWS 账户 从 AWS Managed Microsoft AD 正面移除 Amazon EC2 条目 - AWS Prescriptive Guidance

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

使用 AWS Lambda 自动化功能 AWS 账户 从 AWS Managed Microsoft AD 正面移除 Amazon EC2 条目

由 Rahul Sharad Gaikwad 博士 () 和 Tamilselvan P () AWS 创作 AWS

摘要

Active Directory (AD) 是一款 Microsoft 脚本工具,用于管理域信息和用户与网络服务的交互。它在托管服务提供商 (MSPs) 中被广泛用于管理员工凭证和访问权限。由于 AD 攻击者可以使用不活跃的帐户来尝试入侵组织,因此找到不活跃的帐户并在例行维护计划中将其禁用非常重要。使用 AWS Directory Service for Microsoft Active Directory,你可以将 Microsoft Active Directory 作为托管服务运行。此模式可以帮助您配置 AWS Lambda 自动化,以快速查找和删除不活跃的帐户。

如果以下情况适用于您的组织,则此模式可以为您提供帮助:

  • 集中式广告管理 — 如果您的组织有多个账户 AWS 账户,每个账户都有自己的 AD 部署,那么在所有账户中一致地管理用户账户和访问权限可能会很困难。借助跨账户 AD 清理解决方案,您可以集中方式禁用或删除所有 AD 实例中的非活动账户。

  • AD 重组或迁移 — 如果您的组织计划重组或迁移其 AD 部署,则跨账户 AD 清理解决方案可以帮助您准备环境。该解决方案可以帮助您删除不必要或不活跃的帐户,简化迁移过程并减少潜在的冲突或问题。

当你使用这种模式时,你可以获得以下好处:

  • 提高数据库和服务器性能,修复来自非活动帐户的安全漏洞。

  • 如果您的 AD 服务器托管在云中,则删除不活跃的帐户还可以降低存储成本,同时提高性能。您的每月账单可能会减少,因为带宽费用和计算资源都可能下降。

  • 使用干净的活动目录将潜在的攻击者拒之门外。

先决条件和限制

先决条件

  • 一个活跃的家长 AWS 账户 和一个或多个子女账户。在这种模式中,父账户是创建活动目录的地方。子帐户托管 Windows 服务器,并通过父帐户 Active Directory 加入。

  • Git 已在本地工作站上安装和配置。

  • 在本地工作站上安装和配置 Terraform。

  • AWS Managed Microsoft AD 在家长帐户中配置并共享给所有子女帐户的目录。有关更多详细信息,请参阅《管理指南》中的教程:共享您的 AWS Managed Microsoft AD 目录以实现无缝EC2域加入。AWS Directory Service

  • (父账户VPC)和亚马逊弹性计算云(亚马逊)实例 AWS Directory Service (子账户)之间可用的虚拟私有云 (EC2) 对等 AWS Transit Gateway 连接或连接。VPC VPC有关更多详细信息,请参阅《AWS Directory Service 管理指南》中的在目录所有者和目录使用者帐户之间配置对VPC等连接

  • 一台 Windows 计算机,在所有父帐户和子帐户上都配置了该EC2WindowsUserdata脚本。该脚本文件位于此模式的代码存储库的根目录中

  • 每个子账户上都有一个跨账户 AWS Identity and Access Management (IAM) 角色,该账户配置了信任策略,允许使用父账户中的 AWS Lambda 功能。有关更多信息,请参阅《亚马逊 EventBridge 用户指南》 AWS 账户 中的在亚马逊 EventBridge之间发送和接收事件

  • 父账户的 AWS Systems Manager 参数存储中提供以下密钥值:

    • domainJoinUser— 目录服务的用户名

    • domainJoinPassword— 目录服务的密码

    有关密钥的更多信息,请参阅《AWS Secrets Manager 用户指南》中的创建 AWS Secrets Manager 密钥

限制

  • Terraform 不会自动在儿童账户中创建资源。您必须使用手动创建以下资源 AWS Management Console:

    • 亚马逊 EventBridge 规定将亚马逊终EC2止事件发送到母账户

    • 使用信任政策在子EC2账户中创建亚马逊跨账户角色

    • VPC对等连接或 Transit Gateway 连接

  • 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅AWS 服务 按地区划分。有关特定终端节点,请参阅服务终端节点和配额,然后选择服务的链接。

产品版本

架构

下图显示了该解决方案的高级架构。

使用 Lambda 自动化从多个AWS账户中删除EC2条目的流程。

架构图说明了以下过程:

  1. 在儿童账户中,该 EventBridge 规则会收集所有 Amazon EC2 终止事件。该规则将父账户中存在的事件发送到 EventBridge 这些事件。

  2. 从父账户 EventBridge 收集所有事件并包含触发 Lambda 函数的规则。ADcleanup-Lambda

  3. 父账户从父账户或子账户接收任何终止事件并触发 Lambda 函数。

  4. Lambda 函数使用 Python boto 模块调用 Amazon A EC2 uto Scaling 群组并获取随机实例 ID。实例 ID 用于执行 Systems Manager 命令。

  5. Lambda 函数使用 boto 模块再次调EC2用亚马逊。Lambda 函数获取正在运行的 Windows 服务器的私有 IP 地址,并将这些地址存储在临时变量中。在步骤 5.1 和 5.2 中,正在运行的 Windows EC2 实例是从子账户中收集的。

  6. Lambda 函数再次调用 Systems Manager 以获取连接到的计算机信息。 AWS Directory Service

  7. AWS Systems Manager 文档有助于在 Amazon EC2 Windows 服务器上执行 PowerShell 命令,以获取连接到 AD 的计算机的私有 IP 地址。(Systems Manager 文档使用在步骤 4 中获得的实例 ID。)

  8. AD 域用户名和密码存储在 AWS Systems Manager 参数存储中。 AWS Lambda 然后 Systems Manager 调用 Parameter Store 并获取用于连接 AD 的用户名和密码值。

  9. 使用 Systems Manager 文档,使用先前在步骤 4 中获得的实例 ID 在亚马逊 EC2 Windows 服务器上执行 PowerShell 脚本。

  10. Amazon 使用 PowerShell 命令EC2连接并移除未使用或处于非活动状态的计算机。 AWS Directory Service

工具

AWS 服务

  • AWS Directory Service提供了多种使用微软 Active Directory (AD) 的方法, AWS 服务 例如亚马逊弹性计算云 (亚马逊EC2)、适用于SQL服务器的亚马逊关系数据库服务 (亚马逊RDS) 和FSx适用于 Windows 文件服务器的亚马逊。

  • AWS Directory Service for Microsoft Active Directory允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS Cloud

  • 亚马逊弹性计算云 (AmazonEC2) 在中提供可扩展的计算容量 AWS Cloud。您可以根据需要启动任意数量的虚拟服务器,并快速扩展或缩减它们。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如, AWS Lambda 函数、使用API目的地的HTTP调用端点或其他 AWS 账户中的事件总线。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。借IAM助,您可以指定谁或什么人可以访问中的服务和资源 AWS,集中管理细粒度的权限,并分析访问权限以细化权限。 AWS

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • AWS Systems Manager 可帮助您管理在 AWS Cloud中运行的应用程序和基础设施。它简化了应用程序和资源管理,缩短了检测和解决操作问题的时间,并帮助您大规模安全地管理 AWS 资源。

  • AWS Systems Manager 文档定义了 Systems Manager 对您的托管实例执行的操作。Systems Manager 包括 100 个预先配置的文档,您可以在运行时通过指定参数进行使用。

  • AWS Systems Manager Parameter Store 是一项 AWS Systems Manager 功能,可为配置数据管理和密钥管理提供安全的分层存储。

其他工具

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

  • PowerShell是一款在 Windows、Linux 和 macOS 上运行的微软自动化和配置管理程序。

  • Python 是通用的计算机编程语言。

代码存储库

此模式的代码可在 GitHub aws-lambda-ad-cleanup-terraform- samples 存储库中找到。

最佳实践

  • 自动加入域名。当您启动要成为 AWS Directory Service 域一部分的 Windows 实例时,请在实例创建过程中加入该域,而不是稍后手动添加该实例。要自动加入域,请在启动新实例时从 “域加入目录” 下拉列表中选择正确的目录。有关更多详细信息,请参阅《AWS Directory Service 管理指南》中的 “将 Amazon EC2 Windows 实例无缝加入您的 AWS Managed Microsoft AD 活动目录”。

  • 删除未使用的帐户。在 AD 中找到从未使用过的账户是很常见的。与保留在系统中的已禁用或非活动帐户一样,被忽视的未使用帐户可能会减慢广告系统的速度或使您的组织容易受到数据泄露的影响。

  • 自动清理活动目录。为了帮助降低安全风险并防止过时的账户影响广告性能,应定期进行广告清理。您可以通过编写脚本来完成大多数 AD 管理和清理任务。示例任务包括删除已禁用和非活动帐户、删除空组和非活动群组以及查找过期的用户帐户和密码。

操作说明

任务描述所需技能

在子账号中创建跨账户角色。

要在儿童账户中创建跨账户角色,请执行以下操作:

  1. 对于每个子账号,使用名为ec2crossaccountrole的托管策略创建一个名为的角色AmazonEC2ReadOnlyAccess(有关更多信息,请参阅IAM文档中的使用自定义信任策略创建角色。)

  2. 在 “自定义信任策略” 部分,添加以下代码:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${Parentaccountid}:role/ADcleanuprole" }, "Action": "sts:AssumeRole" } ] }
DevOps 工程师

在儿童账户中创建活动规则。

要为每个儿童账户创建 EventBridge 规则,请执行以下操作:

  1. 登录孩子的账户 AWS 账户,然后打开亚马逊 EventBridge 控制台,网址为https://console.aws.amazon.com/events/

  2. 在导航窗格中,选择规则

  3. 选择创建规则

  4. 输入规则的名称和描述(可选)。

  5. 对于事件总线,请选择AWS默认事件总线

  6. 对于规则类型选择带有事件模式的规则

  7. 选择下一步

  8. 对于事件模式,请粘贴以下代码:

    { "source": ["aws.ec2"], "detail-type": ["EC2 Instance State-change Notification"], "detail": { "state": ["terminated"] } }
  9. 选择下一步

  10. 对于目标类型,请选择其他账户或区域中的事件总线。对于事件总线作为目标,请输入父账户的事件总线 Amazon 资源名称 (ARN)。

  11. 在 “执行角色” 中,选择 “为此特定资源创建新角色”。

  12. 选择 “下一步” 查看新规则的详细信息,然后选择 “创建”。

有关更多详细信息,请参阅《亚马逊 EventBridge 用户指南中的创建对亚马逊 EventBridge事件做出反应的规则

DevOps 工程师

创建EC2实例并加入 AD。

要为 Windows 创建EC2实例,请执行以下操作:

  1. 使用此模式的代码存储库中可用的EC2WindowsUserdata脚本。

  2. 在用户数据脚本中,修改以下代码以使用您来自父账户的Directory service addresses值:

    set-DnsClientServerAddress -InterfaceIndex 6 -ServerAddresses $(Directory service addresses)

DevOps 工程师
任务描述所需技能

创建项目文件夹并添加文件。

要克隆存储库并创建项目文件夹,请执行以下操作:

  1. 打开此模式的GitHub 存储库

  2. 选择 “代码” 按钮,在 “克隆” 下拉列表中查看要克隆的选项。

  3. HTTPS选项卡上,使用网络复制 Clone 中URL提供的内容URL

  4. 在您的计算机上创建一个文件夹,并使用您的项目名称命名。

  5. 在本地计算机上打开终端,然后导航到该文件夹。

  6. 要克隆 git 存储库,请使用以下命令。

    git clone <repository-URL>.git

  7. 克隆存储库后,使用以下命令转到克隆的目录。

    cd <directory name>/terraform-aws-lambda-ad-cleanup/multiple-account-cleanup

  8. 在克隆的存储库中,在您选择的集成开发环境 (IDE) 中打开此项目。

DevOps 工程师

生成adcleanup.zip文件。

要压缩lambda_function.py文件,请运行以下命令:

zip -r adcleanup.zip lambda_function.py

DevOps 工程师
任务描述所需技能

为 Terraform 变量提供值。

对于子账户,在terraform.tfvars文件中提供以下arn变量的值作为字符串类型:

  • lambda_env_cross_role_arn

  • child_account_cross_role_arn

DevOps 工程师

初始化 Terraform 配置。

要初始化包含 Terraform 文件的工作目录,请运行以下命令:

terraform init

DevOps 工程师

预览更改。

在部署基础架构之前,您可以预览 Terraform 将对基础架构所做的更改。要验证 Terraform 是否会根据需要进行更改,请运行以下命令:

terraform plan —-var-file=examples/terraform.tfvars

DevOps 工程师

执行建议的操作。

要验证terraform plan命令的结果是否符合预期,请执行以下操作:

  1. 运行以下命令:terraform apply

  2. 登录并 AWS Management Console验证资源是否存在。

DevOps 工程师
任务描述所需技能

执行并测试 Lambda 函数。

要验证部署是否成功完成,请执行以下操作:

  1. 登录并打开 Lambda 控制台。 AWS Management Console打开函数页面,然后选择以 ADcleanup-Lambda- * 开头的函数名称。

  2. 在函数概述页面上,在 “代码” 部分的 “代码” 选项卡上选择 “测试”。

  3. 要保存测试事件,请提供该事件的名称并选择保存。要测试事件,请再次选择测试

执行结果显示函数的输出。

DevOps 工程师

查看父账户执行 EventBridge 规则的结果。

要查看基于父账户的 Amazon EC2 终止事件的 EventBridge 规则结果,请执行以下操作:

  1. 终止父账户中的EC2实例。

  2. 打开父账户的 Lambda 控制台。打开函数页面,然后选择以 ADcleanup-Lambda- * 开头的函数名称。

  3. 选择 “监控” 选项卡,然后选择 “查看 CloudWatch 日志”。

在 CloudWatch 控制台中,日志组页面显示 Lambda 函数的结果。

DevOps 工程师

查看子账号执行 EventBridge 规则的结果。

要查看基于子女账户的 Amazon EC2 终止事件的 EventBridge 规则结果,请执行以下操作:

  1. 终止子账号中的EC2实例。

  2. 打开父账户的 Lambda 控制台。打开函数页面,然后选择以 ADcleanup-Lambda- * 开头的函数名称。

  3. 选择 “监控” 选项卡,然后选择 “查看 CloudWatch 日志”。

在 CloudWatch 控制台中,日志组页面显示 Lambda 函数的结果。

DevOps 工程师
任务描述所需技能

清理基础架构。

要清理您创建的基础架构,请使用以下命令:

terraform destroy

要确认该destroy命令,请键入yes

DevOps 工程师

清理后进行验证。

验证资源是否已成功删除。

DevOps 工程师

故障排除

事务解决方案

AWS Directory Service (父账户)和 Amazon EC2 实例(子账户)之间的连接问题 — 即使有对VPC等互连功能,您也无法将子账户的计算机加入到 AD。

在中添加路由VPCs。有关说明,请参阅 AWS Directory Service 文档中的配置目录所有者和目录使用者帐户之间的对VPC等连接

相关资源

AWS 文档

其他资源