基于GuardDuty检测自动禁用AWS托管Microsoft AD用户账户

本文详细介绍如何利用Amazon GuardDuty检测安全威胁,并通过EventBridge、Step Functions和Systems Manager实现自动禁用AWS托管Microsoft AD中可疑用户账户的完整自动化流程。

基于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:

  1. 转到AWS管理控制台上的GuardDuty。
  2. 如果您是首次激活GuardDuty,在“使用GuardDuty尝试威胁检测”下,选择“所有功能”,然后选择“开始使用”。
  3. 如果您之前使用过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:

  1. 转到Directory Service控制台。
  2. 选择“设置目录”并选择“AWS托管Microsoft AD”。
  3. 选择“标准版”并输入目录DNS名称和密码。
  4. 选择一个虚拟私有云(VPC),本示例使用默认VPC。
  5. 选择“创建目录”。

目录管理EC2实例

此目录管理EC2实例将用于通过AWS Systems Manager控制Microsoft Active Directory。

部署目录管理EC2实例:

  1. 如果您部署了新目录,可能需要等待20-45分钟,直到目录状态变为“Active”。
  2. 选择目录ID。
  3. 选择“操作”并选择“启动目录管理EC2实例”,使用默认选项。

或者,您可以构建自己的Windows EC2实例,其角色具有AmazonSSMManagedInstanceCore策略,将其加入Active Directory域,并安装Active Directory管理工具。

远程连接到目录管理EC2实例:

  1. 转到Systems Manager控制台。
  2. 从导航窗格打开Fleet Manager。
  3. 选择名称以managementInstance结尾的实例的节点ID。
  4. 选择“节点操作”(右上角),选择“连接”,然后选择“使用远程桌面连接”。
  5. 输入用户名admin和您之前设置的目录密码。

创建测试Active Directory用户

您将使用此测试用户账户登录EC2实例并启动模拟可疑活动的命令,导致该账户被禁用。

使用目录管理EC2实例在Active Directory上创建测试用户:

  1. 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“Active Directory用户和计算机”。
  2. 浏览到您的域、域OU,然后用户OU,右键单击并选择“新建”,然后选择“用户”。
  3. 创建一个TestUser用户,确保未选择“账户已禁用”。

创建特权域服务账户

您将创建此域用户账户,并授予委托权限,供Systems Manager Windows服务使用。

使用目录管理EC2实例在AD中创建服务账户:

  1. 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“Active Directory用户和计算机”。
  2. 浏览到您的域、域OU,然后用户OU。右键单击并选择“新建”,然后选择“用户”。
  3. 创建一个SSMService用户,确保未选择“账户已禁用”。

在AD中为服务账户委托权限:

  1. 右键单击用户OU并选择“委托控制”。
  2. 在委托控制向导上选择“下一步”。
  3. 添加您之前创建的新服务用户,然后选择“下一步”。
  4. 选择“创建自定义任务以委托”并选择“下一步”。
  5. 选择“仅文件夹中的以下对象”并选择“用户对象”,然后选择“下一步”。
  6. 选择“常规”和“属性特定”以显示权限,选择“读取userAccountControl”和“写入userAccountControl”(靠近列表末尾),然后选择“下一步”和“完成”。

将服务账户添加到本地管理员组:

  1. 从管理EC2实例,打开开始菜单,选择“Windows管理工具”,然后打开“计算机管理”。
  2. 浏览到“本地用户和组”,然后到“组”。
  3. 右键单击“管理员”并选择“属性”。
  4. 选择“添加”以添加您之前创建的新服务用户,然后选择“确定”。

配置Systems Manager

在目录管理EC2实例上配置Systems Manager,并授予管理Active Directory的权限。

配置Systems Manager:

  1. 从管理EC2实例的开始菜单,选择“Windows管理工具”,然后打开“服务”。
  2. 找到Amazon SSM Agent,右键单击并选择“属性”。
  3. 选择“登录”选项卡并选择“此账户”。
  4. 在“此账户”中输入您之前创建的特权域用户名,后跟@和域名,例如SSMService@corp.example.com。输入您的密码并选择“确定”。

图3:Microsoft Windows服务显示Systems Manager代理设置

  1. 在“此账户已被授予作为服务登录的权利”和“新登录名将在停止并重新启动服务后生效”弹出窗口上选择“确定”。
  2. 右键单击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文档以禁用域用户账户:

  1. 转到AWS Systems Manager控制台。
  2. 在“变更管理工具”下选择“文档”。
  3. 选择“创建文档”并选择“命令或会话”。
  4. 输入名称,例如DisableADUser。
  5. 选择文档类型“命令”。
  6. 选择YAML,然后输入以下代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
---
schemaVersion: "2.2"
description: "Disable AD Users"
parameters:
  UserName:
    type: String
    description: "(Required) The username to disable."
mainSteps:
- action: "aws:runPowerShellScript"
  name: "DisableUser"
  inputs:
    runCommand:
    - "import-module activedirectory"
    - "$disableuser = get-aduser {{ UserName }} | select-object -ExpandProperty DistinguishedName"
    - "dsmod user $disableuser -disabled yes"
  1. 选择“创建文档”。

创建带有bash命令的Run Command文档以从UserID查找用户名:

  1. 遵循上述过程的步骤1-3。
  2. 输入名称,例如GetUsernameFromID。
  3. 选择文档类型“命令”。
  4. 选择YAML,然后输入以下代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
---
description: "Get Username from Linux"
schemaVersion: "2.2"
parameters:
  UserId:
    type: String
    description: "(Required) The User ID to find."
    default: "1000"
mainSteps:
- action: aws:runShellScript
  name: GetLinuxUsername
  precondition:
    StringEquals:
    - platformType
    - Linux
  inputs:
    timeoutSeconds: 7200
    runCommand:
      - "#!/bin/bash"
      - "#"
      - "UserName=$(id -nu {{ UserId }})"
      - "if [[ $UserName == *'@'* ]]; then"
      - "echo ${UserName%@*} "
      - "else if [[ $UserName == *'\\'* ]]; then"
      - "echo $UserName | sed 's/.*\\\\//g'"
      - "fi"
      - "fi"
  outputs:
    - Name: output
      Selector: $.Payload.output
      Type: String
  1. 选择“创建文档”。

Step Functions

Step Functions是一项无服务器编排服务,您可以使用它将多个AWS服务、微服务和第三方集成协调到业务关键应用程序中。Step Functions广泛用于编排复杂工作流,如贷款处理、欺诈检测、风险管理和合规流程。通过将这些过程分解为一系列步骤,Step Functions提供了整个工作流的清晰概述和控制。这有助于确保每个阶段正确且按顺序执行。在受监管行业中使用Step Functions的关键方面是安全性和数据保护的重要性。

在本节结束时,您的状态机应具有顺序流,以选择开始,默认情况下未找到UserID,如果存在UserID,则包括步骤“查找用户名”、“等待”、“获取用户名”和“禁用AD用户”。如果没有,您可以将操作拖到正确顺序或更改与每个操作关联的下一个状态。或者,复制此状态机定义JSON并直接导入到Step Functions。

创建Step Functions状态机以执行Systems Manager Run Commands:

  1. 转到Step Functions控制台。
  2. 选择“开始使用”。
  3. 选择“创建您自己的”。
  4. 输入状态机名称,选择“标准”,然后选择“继续”。
  5. 选择JSONPath作为状态机查询语言。
  6. 从导航窗格搜索并添加“传递”操作,将操作拖到中心窗口。
  7. 添加“Systems Manager: SendCommand”操作以使用Run Command查找用户名。
  8. 选择“SendCommand”,将状态名称更改为“查找用户名”,然后在屏幕右侧的API参数中输入以下代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "DocumentName": "GetUsernameFromID",
  "Parameters": {
    "UserId.$": "States.Array(States.JsonToString($.detail.service.runtimeDetails.process.euid))"
  },
  "Targets": [
    {
      "Key": "InstanceIds",
      "Values.$": "States.Array($.detail.resource.instanceDetails.instanceId)"
    }
  ]
}
  1. 选择“SendCommand”后,选择“输入/输出”选项卡,选择“使用ResultPath将原始输入添加到输出”,选择“将原始输入与结果合并”,并输入以下内容:
1
$.RunCommand.State
  1. 添加“等待”操作,并将恢复执行前的等待秒数设置为5秒。
  2. 添加“Systems Manager: GetCommandInvocation”操作,该操作将从Run Command获取用户名值,并将状态名称更改为“获取用户名”,然后输入以下API参数:
1
2
3
4
{
  "CommandId.$": "$.RunCommand.State.Command.CommandId",
  "InstanceId.$": "$.detail.resource.instanceDetails.instanceId"
}
  1. 在“输入/输出”选项卡上,选择“使用ResultSelector转换结果”并输入以下内容:
1
2
3
{
  "StandardOutputContent.$": "States.StringSplit($.StandardOutputContent,'\n')"
}
  1. 添加“Systems Manager: SendCommand”操作,该操作将使用Run Command禁用Active Directory用户。将状态名称更改为“禁用AD用户”,然后输入以下API参数,将InstanceIds值更改为您的Active Directory管理服务器的ID:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "DocumentName": "DisableADUser",
  "Parameters": {
    "UserName.$": "$.StandardOutputContent"
  },
  "Targets": [
    {
      "Key": "InstanceIds",
      "Values": [
        "i-0b22a22eec53b9321"
      ]
    }
  ]
}
  1. 添加“选择”操作,选择规则#1旁边的铅笔图标,选择“编辑条件”,输入变量$.detail.service.runtimeDetails.process.euid,选择操作符“存在”,值“true”,将“Not”留空,然后选择“保存条件”。
  2. 重新排列状态机布局,使其与图4所示结构相同,具有顺序流,以选择开始,默认情况下未找到UserID,如果存在UserID,则包括步骤“查找用户名”、“等待”、“获取用户名”和“禁用AD用户”。

图4:Step Functions状态机结构

  1. 选择“创建”(右上角),然后选择“确认”以创建步骤函数状态机。

添加权限以启用状态机运行System Manager命令:

  1. 在新创建的状态机中,选择“配置”(顶部中心)。
  2. 在“权限”下的“执行角色”中选择“在IAM中查看”。
  3. 选择“添加权限”,“附加策略”(中右)。
  4. 搜索并选择AmazonSSMAutomationRole,然后选择“添加权限”。

EventBridge

EventBridge通过使用事件路由、过滤和转换连接松散耦合的发布者和消费者,帮助开发人员构建事件驱动架构(EDA)。创建EventBridge规则以触发您之前创建的Systems Manager Run Command文档:

  1. 转到Amazon EventBridge控制台并选择“使用EventBridge规则创建规则”。
  2. 输入名称,例如GuardDutyDisableADuser。
  3. 选择“带有事件模式的规则”并选择“下一步”。
  4. 在“事件模式JSON”窗口下,选择“编辑模式”并输入以下内容:
1
2
3
4
{
  "source": ["aws.guardduty"],
  "detail-type": ["GuardDuty Finding"]
}
  1. 选择“下一步”。
  2. 选择“AWS服务”。
  3. 选择“Step Functions状态机”作为目标。
  4. 选择您之前创建的状态机,例如MyStateMachine-A123456789。
  5. 选择“下一步”两次,然后选择“创建规则”。

创建测试EC2实例

为了在GuardDuty上生成警报,您创建一个加入域的Linux EC2实例。在本示例中,您将使用两个独立的EC2实例,以便可以在GuardDuty内监控每个实例的活动,并使用EventBridge创建自动化。

创建AWS Identity and Access Management(IAM)角色以允许EC2实例加入AD:

  1. 转到IAM控制台。
  2. 从导航窗格选择“策略”。
  3. 选择“创建策略”(右上角)。
  4. 选择“策略编辑器JSON”,输入以下代码并选择“下一步”:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
"Version": "2012-10-17",
"Statement": [
	{
		"Effect": "Allow",
		"Action": [
			"secretsmanager:GetSecretValue",
			"secretsmanager:DescribeSecret"
			],
		"Resource": "*"
	}
	]
}
  1. 输入策略名称,例如SecretsManagerGetSecrets,然后选择“创建策略”。

  2. 从导航窗格选择“角色”。

  3. 选择“创建角色”(右上角)。

  4. 选择“AWS服务”并从服务或用例选择中选择EC2,然后选择“下一步”。

  5. 搜索并选择以下策略,然后选择“下一步”:

    • AmazonSSMDirectoryServiceAccess
    • AmazonSSMManagedInstanceCore
    • SecretsManagerGetSecrets(之前创建)
  6. 输入角色名称,例如EC2DomainJoin,然后选择“创建角色”。

创建用于存储用于将EC2实例加入域的特权凭据的密钥:

  1. 转到Secrets Manager控制台。

  2. 选择“存储新密钥”。

  3. 选择“其他类型的密钥”。

  4. 添加以下键,其值为具有将计算机加入域权限的域用户名和密码:

    • awsSeamlessDomainUsername
    • awsSeamlessDomainPassword
  5. 选择“下一步”。

  6. 输入以下密钥名称,将<d-1234567890>替换为您的目录ID:

1
aws/directory-services/<d-1234567890>/seamless-domain-join
  1. 选择“下一步”两次,然后“存储”。

有关更多信息,请参阅将Amazon EC2 Linux实例无缝加入您的AWS托管Microsoft AD Active Directory。

创建加入域的EC2实例以测试此GuardDuty自动化:

  1. 转到Amazon EC2控制台。
  2. 从导航窗格选择“实例”。
  3. 选择“启动实例”。
  4. 选择Amazon Linux AMI。
  5. 选择现有密钥对或创建新密钥对。
  6. 滚动到底部并选择“高级详细信息”。
  7. 在“加入目录”中,选择域。
  8. 在“IAM实例配置文件”中,选择您之前创建的EC2DomainJoin角色。
  9. 选择“启动实例”。

测试

为了模拟威胁,使用GuardDuty测试域,GuardDuty将识别该域为命令和控制服务器。

  1. 转到Amazon EC2控制台。
  2. 从导航窗格选择“实例”。
  3. 选择您之前创建的测试EC2实例。
  4. 选择“连接”,选择“Session Manager”选项卡,然后选择“连接”。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计