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

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

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

Rahul Sharad Gaikwad 博士和 Tamilselvan P,Amazon Web Services

Summary

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 服务器托管在云中,移除不活跃的账户还可以降低存储成本,同时提高性能。您的月度支出可能减少,因为带宽费用和计算资源都可能下降。

  • 借助干净的 Active Directory 将潜在攻击者拒之门外。

先决条件和限制

先决条件

  • 一个活跃的家长 AWS 账户 和一个或多个子女账户。在此模式中,父账户是创建 Active Directory 的位置。子账户托管 Windows 服务器,并通过父账户 Active Directory 加入。

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

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

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

  • (父账户)的 VPC 和亚马逊弹性计算云 (Amazon) 实例 AWS Directory Service (子账户)的 VPC 之间可用的虚拟私有云 (VPC EC2) 对等 AWS Transit Gateway 连接或连接。有关详细信息,请参阅《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 管理控制台手动创建以下资源:

    • 亚马逊 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 Server 的亚马逊关系数据库服务 (Amazon RDS) 和 FSx 适用于 Windows 文件服务器的亚马逊。

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

  • 亚马逊弹性计算云 (Amazon EC2) 在中提供可扩展的计算容量 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 存储库中找到。

最佳实践

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

  • 删除未使用的账户。在 AD 中经常能发现从未使用过的账户。与留在系统中的已禁用或非活动账户一样,被忽视的未使用账户可能会减慢 AD 系统的速度,或者导致您的组织数据容易被泄露。

  • 自动清理 Active Directory。为降低安全风险并防止过期账户影响 AD 性能,应定期执行 AD 清理工作。可以通过编写脚本来完成大部分 AD 管理和清理任务。任务示例包括移除已禁用和非活动账户、删除空组和非活动组,以及查找过期的用户账户和密码。

操作说明

Task说明所需技能

在子账户中创建一个跨账户角色。

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

  1. 对于每个子账号,使用名为 AmazonEC2ReadOnlyAccess 的托管策略创建一个名为 ec2crossaccountrole 的角色。(有关更多信息,请参阅 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 工程师
Task说明所需技能

创建项目文件夹,然后添加文件。

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

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

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

  3. HTTPS 选项卡上,复制使用 Web 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 工程师
Task说明所需技能

提供 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 管理控制台验证资源是否存在。

DevOps 工程师
Task说明所需技能

执行并测试 Lambda 函数。

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

  1. 登录并打开 Lambda 控制台。 AWS 管理控制台打开函数页面,然后选择以 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 工程师
Task说明所需技能

清理基础设施。

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

terraform destroy

要确认 destroy 命令,请键入 yes

DevOps 工程师

清理后验证。

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

DevOps 工程师

问题排查

问题解决方案

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

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

相关资源

AWS 文档

其他资源