基于GuardDuty检测自动禁用AWS托管Microsoft AD用户账户
组织面临的安全威胁日益增多,特别是用户账户被盗用的情况。手动监控和响应可疑活动不仅耗时,而且容易出错。缺乏对安全事件的自动化响应可能导致灾难性后果,如数据泄露和财务损失。
在本博文中,我将展示如何使用Amazon GuardDuty检测可疑事件,并基于这些发现创建自动化流程,以在AWS Directory Service for Microsoft Active Directory中禁用用户账户。
本文适用于以下场景:例如,您有一个使用Microsoft Active Directory用户账户(服务账户)访问其他服务器上的应用程序或数据库资源的Web服务器,并且希望在检测到可疑活动时自动禁用该用户账户。
我将逐步指导您如何在AWS Directory Services中部署Microsoft Active Directory,设置GuardDuty以监控Amazon Elastic Compute Cloud(Amazon EC2)实例,并配置Amazon EventBridge与AWS Step Functions,以触发AWS Systems Manager Run Command来获取用户名并在Active Directory中禁用该用户。
解决方案概述
在本示例中(如图1所示),您将部署一个测试EC2实例并启用GuardDuty运行时监控。检测结果将触发一个EventBridge规则,该规则执行一个Step Functions状态机,运行两个Systems Manager Run Command文档,通过目录管理EC2实例发现用户名并禁用该用户。
图1:解决方案架构
GuardDuty
GuardDuty是一项自动威胁检测服务,持续监控可疑活动和未经授权的行为,以保护您的AWS账户、工作负载以及存储在Amazon Simple Storage Service(Amazon S3)中的数据。
激活GuardDuty:
- 转到AWS管理控制台上的GuardDuty。
- 如果您是首次激活GuardDuty,在“使用GuardDuty尝试威胁检测”下,选择“所有功能”,然后选择“开始使用”。
- 如果您之前使用过GuardDuty,选择“运行时监控”,然后在“运行时监控”下选择“启用”。
图2:启用GuardDuty运行时监控与EC2监控
AWS托管Microsoft AD
AWS托管Microsoft AD在AWS云中提供完全托管的Microsoft Active Directory(AD)服务。创建目录时,AWS会在不同的可用区部署两个域控制器,这些控制器专供您使用以实现高可用性。对于在特定AWS区域或特定时间内需要更高弹性和性能的用例,您可以通过部署额外的域控制器来扩展AWS托管Microsoft AD以满足需求。这些域控制器可以帮助负载均衡、提高整体性能或提供额外节点以防止临时可用性问题。使用AWS托管Microsoft AD,您可以根据用例定义目录的正确域控制器数量。
部署新的AWS托管Microsoft AD:
- 转到Directory Service控制台。
- 选择“设置目录”并选择“AWS托管Microsoft AD”。
- 选择“标准版”并输入目录DNS名称和密码。
- 选择一个虚拟私有云(VPC),本示例使用默认VPC。
- 选择“创建目录”。
目录管理EC2实例
此目录管理EC2实例将用于通过AWS Systems Manager控制Microsoft Active Directory。
部署目录管理EC2实例:
- 如果您部署了新目录,可能需要等待20-45分钟,直到目录状态变为“Active”。
- 选择目录ID。
- 选择“操作”并选择“启动目录管理EC2实例”,使用默认选项。
或者,您可以构建自己的Windows EC2实例,其角色具有AmazonSSMManagedInstanceCore策略,将其加入Active Directory域,并安装Active Directory管理工具。
远程连接到目录管理EC2实例:
- 转到Systems Manager控制台。
- 从导航窗格打开Fleet Manager。
- 选择名称以managementInstance结尾的实例的节点ID。
- 选择“节点操作”(右上角),选择“连接”,然后选择“使用远程桌面连接”。
- 输入用户名admin和您之前设置的目录密码。
创建测试Active Directory用户
您将使用此测试用户账户登录EC2实例并启动模拟可疑活动的命令,导致该账户被禁用。
使用目录管理EC2实例在Active Directory上创建测试用户:
- 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“Active Directory用户和计算机”。
- 浏览到您的域、域OU,然后用户OU,右键单击并选择“新建”,然后选择“用户”。
- 创建一个TestUser用户,确保未选择“账户已禁用”。
创建特权域服务账户
您将创建此域用户账户,并授予委托权限,供Systems Manager Windows服务使用。
使用目录管理EC2实例在AD中创建服务账户:
- 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“Active Directory用户和计算机”。
- 浏览到您的域、域OU,然后用户OU。右键单击并选择“新建”,然后选择“用户”。
- 创建一个SSMService用户,确保未选择“账户已禁用”。
在AD中为服务账户委托权限:
- 右键单击用户OU并选择“委托控制”。
- 在委托控制向导上选择“下一步”。
- 添加您之前创建的新服务用户,然后选择“下一步”。
- 选择“创建自定义任务以委托”并选择“下一步”。
- 选择“仅文件夹中的以下对象”并选择“用户对象”,然后选择“下一步”。
- 选择“常规”和“属性特定”以显示权限,选择“读取userAccountControl”和“写入userAccountControl”(靠近列表末尾),然后选择“下一步”和“完成”。
将服务账户添加到本地管理员组:
- 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“计算机管理”。
- 浏览到“本地用户和组”,然后到“组”。
- 右键单击“管理员”并选择“属性”。
- 选择“添加”以添加您之前创建的新服务用户,然后选择“确定”。
配置Systems Manager
在目录管理EC2实例上配置Systems Manager,并授予管理Active Directory的权限。
配置Systems Manager:
- 从管理EC2实例的开始菜单,选择“Windows管理工具”,然后打开“服务”。
- 找到Amazon SSM Agent,右键单击并选择“属性”。
- 选择“登录”选项卡并选择“此账户”。
- 在“此账户”中输入您之前创建的特权域用户名,后跟@和域名,例如SSMService@corp.example.com。输入您的密码并选择“确定”。
图3:Microsoft Windows服务显示Systems Manager代理设置
- 在“此账户已被授予作为服务登录的权利”和“新登录名将在停止并重新启动服务后生效”弹出窗口上选择“确定”。
- 右键单击Amazon SSM Agent并选择“重新启动”。
Systems Manager Run Command
Run Command是Systems Manager的一项功能,可以远程安全地管理托管节点的配置。您可以使用Run Command自动化常见管理任务并大规模执行一次性配置更改。您可以从控制台、AWS命令行界面(AWS CLI)、AWS Tools for PowerShell或AWS SDK使用Run Command。Run Command免费提供。
创建带有PowerShell命令的Run Command文档以禁用域用户账户:
- 转到AWS Systems Manager控制台。
- 在“变更管理工具”下选择“文档”。
- 选择“创建文档”并选择“命令或会话”。
- 输入名称,例如DisableADUser。
- 选择文档类型“命令”。
- 选择YAML,然后输入以下代码:
|
|
- 选择“创建文档”。
创建带有bash命令的Run Command文档以从UserID查找用户名:
- 遵循上述过程的步骤1-3。
- 输入名称,例如GetUsernameFromID。
- 选择文档类型“命令”。
- 选择YAML,然后输入以下代码:
|
|
- 选择“创建文档”。
Step Functions
Step Functions是一项无服务器编排服务,您可以使用它将多个AWS服务、微服务和第三方集成协调到业务关键应用程序中。Step Functions广泛用于编排复杂工作流,如贷款处理、欺诈检测、风险管理和合规流程。通过将这些过程分解为一系列步骤,Step Functions提供了整个工作流的清晰概述和控制。这有助于确保每个阶段正确且按顺序执行。在受监管行业中使用Step Functions的关键方面是安全性和数据保护的重要性。
在本节结束时,您的状态机应具有顺序流,以选择开始,默认情况下未找到UserID,如果存在UserID,则包括步骤“查找用户名”、“等待”、“获取用户名”和“禁用AD用户”。如果没有,您可以将操作拖到正确顺序或更改与每个操作关联的下一个状态。或者,复制此状态机定义JSON并直接导入到Step Functions。
创建Step Functions状态机以执行Systems Manager Run Commands:
- 转到Step Functions控制台。
- 选择“开始使用”。
- 选择“创建您自己的”。
- 输入状态机名称,选择“标准”,然后选择“继续”。
- 选择JSONPath作为状态机查询语言。
- 从导航窗格搜索并添加“传递”操作,将操作拖到中心窗口。
- 添加“Systems Manager: SendCommand”操作以使用Run Command查找用户名。
- 选择“SendCommand”,将状态名称更改为“查找用户名”,然后在屏幕右侧的API参数中输入以下代码:
|
|
- 选择“SendCommand”后,选择“输入/输出”选项卡,选择“使用ResultPath将原始输入添加到输出”,选择“将原始输入与结果合并”,并输入以下内容:
|
|
- 添加“等待”操作,并将恢复执行前的等待秒数设置为5秒。
- 添加“Systems Manager: GetCommandInvocation”操作,该操作将从Run Command获取用户名值,并将状态名称更改为“获取用户名”,然后输入以下API参数:
|
|
- 在“输入/输出”选项卡上,选择“使用ResultSelector转换结果”并输入以下内容:
|
|
- 添加“Systems Manager: SendCommand”操作,该操作将使用Run Command禁用Active Directory用户。将状态名称更改为“禁用AD用户”,然后输入以下API参数,将InstanceIds值更改为您的Active Directory管理服务器的ID:
|
|
- 添加“选择”操作,选择规则#1旁边的铅笔图标,选择“编辑条件”,输入变量
$.detail.service.runtimeDetails.process.euid
,选择操作符“存在”,值“true”,将“Not”留空,然后选择“保存条件”。 - 重新排列状态机布局,使其与图4所示结构相同,具有顺序流,以选择开始,默认情况下未找到UserID,如果存在UserID,则包括步骤“查找用户名”、“等待”、“获取用户名”和“禁用AD用户”。
图4:Step Functions状态机结构
- 选择“创建”(右上角),然后选择“确认”以创建步骤函数状态机。
添加权限以启用状态机运行System Manager命令:
- 在新创建的状态机中,选择“配置”(顶部中心)。
- 在“权限”下的“执行角色”中选择“在IAM中查看”。
- 选择“添加权限”,“附加策略”(中右)。
- 搜索并选择AmazonSSMAutomationRole,然后选择“添加权限”。
EventBridge
EventBridge通过使用事件路由、过滤和转换连接松散耦合的发布者和消费者,帮助开发人员构建事件驱动架构(EDA)。创建EventBridge规则以触发您之前创建的Systems Manager Run Command文档:
- 转到Amazon EventBridge控制台并选择“使用EventBridge规则创建规则”。
- 输入名称,例如GuardDutyDisableADuser。
- 选择“带有事件模式的规则”并选择“下一步”。
- 在“事件模式JSON”窗口下,选择“编辑模式”并输入以下内容:
|
|
- 选择“下一步”。
- 选择“AWS服务”。
- 选择“Step Functions状态机”作为目标。
- 选择您之前创建的状态机,例如MyStateMachine-A123456789。
- 选择“下一步”两次,然后选择“创建规则”。
创建测试EC2实例
为了在GuardDuty上生成警报,您创建一个加入域的Linux EC2实例。在本示例中,您将使用两个独立的EC2实例,以便可以在GuardDuty内监控每个实例的活动,并使用EventBridge创建自动化。
创建AWS Identity and Access Management(IAM)角色以允许EC2实例加入AD:
- 转到IAM控制台。
- 从导航窗格选择“策略”。
- 选择“创建策略”(右上角)。
- 选择“策略编辑器JSON”,输入以下代码并选择“下一步”:
|
|
-
输入策略名称,例如SecretsManagerGetSecrets,然后选择“创建策略”。
-
从导航窗格选择“角色”。
-
选择“创建角色”(右上角)。
-
选择“AWS服务”并从服务或用例选择中选择EC2,然后选择“下一步”。
-
搜索并选择以下策略,然后选择“下一步”:
- AmazonSSMDirectoryServiceAccess
- AmazonSSMManagedInstanceCore
- SecretsManagerGetSecrets(之前创建)
-
输入角色名称,例如EC2DomainJoin,然后选择“创建角色”。
创建用于存储用于将EC2实例加入域的特权凭据的密钥:
-
转到Secrets Manager控制台。
-
选择“存储新密钥”。
-
选择“其他类型的密钥”。
-
添加以下键,其值为具有将计算机加入域权限的域用户名和密码:
- awsSeamlessDomainUsername
- awsSeamlessDomainPassword
-
选择“下一步”。
-
输入以下密钥名称,将
<d-1234567890>
替换为您的目录ID:
|
|
- 选择“下一步”两次,然后“存储”。
有关更多信息,请参阅将Amazon EC2 Linux实例无缝加入您的AWS托管Microsoft AD Active Directory。
创建加入域的EC2实例以测试此GuardDuty自动化:
- 转到Amazon EC2控制台。
- 从导航窗格选择“实例”。
- 选择“启动实例”。
- 选择Amazon Linux AMI。
- 选择现有密钥对或创建新密钥对。
- 滚动到底部并选择“高级详细信息”。
- 在“加入目录”中,选择域。
- 在“IAM实例配置文件”中,选择您之前创建的EC2DomainJoin角色。
- 选择“启动实例”。
测试
为了模拟威胁,使用GuardDuty测试域,GuardDuty将识别该域为命令和控制服务器。
- 转到Amazon EC2控制台。
- 从导航窗格选择“实例”。
- 选择您之前创建的测试EC2实例。
- 选择“连接”,选择“Session Manager”选项卡,然后选择“连接”。