亚马逊AWS官方博客

基于 Amazon GuardDuty 威胁级别的自动化通知

一.方案背景

客户希望能对AWS环境中的网络活动和账户行为进行持续监控,Amazon GuardDuty正是这样一个服务,它可以通过分析多个日志数据源,持续监测AWS平台内账号和负载的运行情况和而且利用Amazon CloudWatch 事件和 AWS Lambda 执行自动化的通知和修复操作,本文介绍如何通过结合使用Amazon CloudWatch event,AWS Lambda,Amazon SNS和Amazon Connect实现对来自Amazon GuardDuty不同风险级别的自动通知.对于中等风险的通知我们采用邮件通知管理员,对于高等风险的通知我们使用电话直接通知管理员。

 

二.GuardDuty介绍

Amazon GuardDuty 是一种威胁检测服务,可持续监控恶意活动和未经授权的行为,从而保护您的 AWS 账户和工作负载。迁移到云后,账户和网络活动的收集与聚合变得异常简单,但安全团队对事件日志数据进行持续的分析以发现潜在的威胁,则可能十分耗时。GuardDuty 为您提供了经济高效的智能选项,从而持续检测在 AWS 云中发生的威胁。此服务使用机器学习、异常检测和集成威胁情报等手段,识别潜在的威胁并确定优先级别。GuardDuty 对来自多个 AWS 数据源(例如 AWS CloudTrail、Amazon VPC Flow Logs 和 DNS 日志)的数百亿事件进行分析。只需在 AWS 管理控制台中几次点击,就可以启用 GuardDuty,无需部署或维护任何软件或硬件。GuardDuty 警报与 AWS CloudWatch Events 集成,具有极好的可行动性,非常便于跨多个账户聚合,并且可以直接推送到现有的事件管理和工作流程系统。

GuardDuty 调查结果定义的严重性等级和值:

每个 GuardDuty 调查结果都将分配到一个严重级别和值,这样您就无需将一个调查结果的优先级设置为高于另一个调查结果,并且可以帮助您确定您对调查结果强调的潜在安全问题的响应。严重性的值的范围可能为 0.1 到 8.9。
以下是当前为 GuardDuty 调查结果定义的严重性级别和值:

1.High (高)(GetFindings 响应中 severity 参数值的
范围为 7.0 到 8.9)– 指示有问题的资源(一个 EC2 实例或一组 IAM 用户凭证)已遭泄露,并且不断被用于未经授权的目的。我们建议您将此安全问题视为高优先级并立即采取补救措施。例如,清除您的 EC2 实例或终止该实例,或轮换 IAM 凭证。

 

2.Medium (中)(GetFindings 响应中 severity 参数值的范围为 4.0 到 6.9)– 指示可疑活动,例如,大量流量返回到隐藏在 Tor 网络后面的远程主机,或偏离通常情况下观察到的行为的活动。我们建议您尽可能早调查牵涉的资源。以下是一些可能的补救措施:

    • 检查是否有授权用户安装新的软件,更改了资源的行为 (例如,允许高于正常流量,或者在新端口上启用了通信)。
    • 检查是否有授权用户更改了控制面板设置,例如,修改了安全组设置
    • 在牵涉的资源上运行反病毒扫描,检测未经授权的软件。
    • 验证附加到所牵涉的 IAM 角色、用户、组或一组凭证的权限。可能需要更改或轮换它们。

 

3.Low (低)(GetFindings 响应中的 severity 参数的值介于 0.1 到 3.9 之间)- 表示尝试进行的可疑活动未危及您的网络,例如端口扫描或失败的入侵尝试。不需要立即采取行动,但此信息值得注意,因为它可能表明有人正在寻找网络中的弱点。

 

三.方案架构


此方案中使用到Amazon Cloudwatch,AWS Lambda,Amazon Connect和Amazon SNS服务,其中Amazon Cloudwatch用于Guardduty消息的感知转发,AWS Lambda用于消息的处理和定向到Amazon Connect,Amazon Connect用于对用户进行电话呼叫,Amazon SNS用于邮件形式通知客户

处理流程

1.GuardDuty收集来自VPC flowlog,Cloudtrail和DNSlog里的数据进行分析并存放在S3中

2.通过Cloudwatch event采集特定的安全事件或风险等级事件

3.对于中等风险我们通过SNS服务邮件通知管理员

4.对于高风险我们通过Connect结合Lambda以电话形式通知客户

 

四.方案部署过程

对于不同风险级别我们使用不同的处理流程,首先我们需要检查当前Region是否已经启用Guardduty(默认是启用状态),后续的操作我们同时使用命令行和控制台进行操作,进行以下操作需要对管理员或主机具备以下权限:

  • CLoudWatchFullaccess
  • AmazonGuardDutyFullAccess
  • AmazonSNSFullAccess
  • CloudWatchEventFullAccess

下面的操作在日本区域ap-northeast-1进行.

配置中等风险邮件通知

1.在命令行下输入以下命令创建Cloudwatch event 规则

aws events put-rule --name GuardDuty-Medium-alert --event-pattern "{\"source\":[\"aws.guardduty\"],\"detail-type\":[\"GuardDuty Finding\"],\"detail\":{\"severity\":[4.0,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5.0,5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6.0,6.1,6.2,6.3,6.4,6.5,6.6,6.7,6.8,6.9]}}" --region ap-northeast-1

创建后记的记录输出的RuleARN

 

2.在命令行下输入以下命令创建创建SNS Topic

aws sns create-topic --name guardduty-alert-topic --region ap-northeast-1

创建后记的记录输出的TopicARN

 

3.使用管理员邮箱订阅这个告警的Topic

aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:accountID:guardduty-alert-topic --protocol email --notification-endpoint ####@qq.com --region ap-northeast-1

创建后需要在邮箱中确认这个订阅.

 

4.在命令中输入以下命令为Cloudwatch Event 规则的配置到SNS的目标

aws events put-targets --rule GuardDuty-Medium-alert --targets "Id"="1","Arn"="arn:aws:sns:ap-northeast-1:accountID:guardduty-alert-topic" --region ap-northeast-1

 

5.为了增加邮件内容的可读性,我们在主题目标下增加转换器

参考下图

  • 路径中填充:
{
    "time": "$.time",
    "region": "$.region",
    "instanceId": "$.detail.resource.instanceDetails.instanceId",
    "count": "$.detail.service.count",
    "severity": "$.detail.severity",
    "title": "$.detail.title",
    "description": "$.detail.description"
}	
  • 模板中填充:

"您的主机<instanceId>,在<time>发生了等级为<severity>的可疑行为,该行为是<title>,具体描述为<description>,到目前已发生<count>次,请尽快处理"

后点击配置信息更新现有配置.

配置高等风险电话通知

1.在命令行下输入以下命令创建Cloudwatch event 规则

aws events put-rule --name GuardDuty-High-alert --event-pattern "{\"source\":[\"aws.guardduty\"],\"detail-type\":[\"GuardDuty Finding\"],\"detail\":{\"severity\":[7.0,7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5,8.6,8.7,8.8,8.9]}}" --region ap-northeast-1

创建后记的记录输出的RuleARN

 

2.配置Connect用于通知管理员.

  • 在控制台中找到Amazon connect,点击开始,选择将用户存储在Amazon connect中,输入唯一的URL(如提示冲突请更换)

配置一个管理员(后期用于登陆管理Amazon Connect)

  • 设置日志存放地址(保持默认即可)
  • 检查资源配置并点击完成,注意记录访问URL
  • 进入Connect控制台,这里选择一个国家和电话号码,这个号码是后期联系管理员的电话
  • 下一步点击继续申请完成.
  • 在页面下方找到 “5.创建联系流”


    在联系流左边找到设置语音拖拽到编辑区并配置为中文
  • 在交互选项中找到播放提示并拖拽到编辑区
  • 播放提示中进行如图配置
  • 终止/转接中找到断开/挂断拖拽到编辑区
  • 拖拽白点将组件按图进行连接并保存,此处保存为Alert-workflow
  • 点击发布,记的保存左方的ARN记录

    至此我们创建好了Amazon Connect

 

3.配置Lambda用于将消息转发至Amazon Connect中

  • 在AWS服务中,找到Lambda并创建空白Lambda
    基本信息进行如下配置:

    • 函数名称:alert_call
    • 运行时 Python2.7
    • 执行角色:创建具有基本 Lambda 权限的新角色
  • 在IAM中找到新创建的Lambda执行角色并增加访问connect权限后保存
  • 在Lambda代码编辑界面粘贴如下代码:
# -*- coding: utf-8 -*-
import json
import boto3

client = boto3.client('connect')

def lambda_handler(event, context):
    info= '<speak><break time="3s"/>您好,请注意'+ event.encode('utf8')+'</speak>'
    response = client.start_outbound_voice_contact(
    DestinationPhoneNumber='+86137********',
    InstanceId='06d82dff-b50f-4ae8-8987-c7d8704dfe9b',
    ContactFlowId='131bc124-4d5b-4970-a1e2-5202a3fab313',
    SourcePhoneNumber='+815031551939',
    Attributes={
        'message': info
    }
    )

    return {
        'statusCode': 200,
        'body': json.dumps(response)

 }
  • 其中需要替换代码中的:
    • DestinationPhoneNumber 为管理员的手机号码
    • InstanceId 为Amazon connect中arn里InstanceId
    • ContactFlowId 为mazon connect中arn里的contact-flow
    • SourcePhoneNumber为mazon connect注册的电话号码

      修改完成后保存就完成了Lambda的创建

 

4.配置Cloudwatch Event rule 目标为alert_call Lambda

  • 在命令中输入以下命令为Cloudwatch Event 规则的配置到Lambda的目标
aws events put-targets --rule GuardDuty-High-alert --targets Id=1,Arn=arn:aws:lambda:ap-northeast-1:accountID:function:alert_call --region ap-northeast-1

 

其中ARN是Lambda的ARN号码.

 

5.为了将语音更加人性化,我们我们在主题目标下增加转换器

参考下图

路径中填充:

{
    "time": "$.time",
    "region": "$.region",
    "instanceId": "$.detail.resource.instanceDetails.instanceId",
    "count": "$.detail.service.count",
    "severity": "$.detail.severity",
    "title": "$.detail.title",
    "description": "$.detail.description"
}

模板中填充:
"您在东京区域的的主机<instanceId>,发生了等级为<severity>的可疑行为,到目前已发生<count>次,请尽快处理"

后点击配置信息更新现有配置.
至此我们创建完成了低风险和高风险事件的处理流程,接下来我们来进行模拟.

 

五.方案验证

在服务中找到Guardduty,点击生成示例结果

然后我们在结果选项卡中可以看到已经有模拟生成的结果

在等待约5分钟后,你的邮箱和电话中分别会收到中风险的邮件告警以及高风险的电话通知,其中邮件内容中包含风险发生的时间,风险的等级,风险的名称和描述以及风险的实例ID和风险发生的次数,电话的内容中包含风险的等级,风险的实例ID和出现次数.


管理员收到通知后,可以在Guardduty上看到详细的风险情况,并结合系统的描述和提示加以处理.

 

附.Amazon GuardDuty调查结果的处理

GuardDuty 在AWS 环境中检测到意外和潜在的恶意活动时,将生成调查结果。

推荐在检测到调查结果后根据不同的威胁目的采取响应的处理方式,从https://docs.aws.amazon.com/zh_cn/guardduty/latest/ug/guardduty_finding-types-active.html

找到不同调查结果类型的说明和处理建议

此外,如果某些告警在你的预料和可控范围内,或者该活动不是您需要采取行动的威胁,您可以使用 GuardDuty 调查结果禁止规则来禁止特定行为的告警。禁止规则可降低生成的调查结果的噪声级别。当调查结果与禁止规则相匹配时,仍会生成调查结果并在 GuardDuty 中存储 90 天。但是,它会自动标记为“archived (已存档)”。相应地,它不会显示在控制台的“current findings (当前调查结果)”部分,清除掉噪声,并使您能够专注于具有更高安全价值以及表示 AWS 环境意外行为的调查结果。您仍然可以在调查结果表的存档部分查看禁止的调查结果。禁止的调查结果不会发送到 AWS Security Hub、Amazon S3、CloudWatch Events。如果您通过 Security Hub 或第三方 SIEM、警报和票证应用程序使用 GuardDuty 调查结果,这有助于降低噪声级别,关于禁止规则的常用案例和最佳实践可以参考

https://docs.aws.amazon.com/zh_cn/guardduty/latest/ug/guardduty_findings.html#guardduty_filter-suppression-rule

 

本篇作者

王非

AWS解决方案架构师,负责基于AWS云计算方案的架构咨询和设计实现,同时致力于物联网服务的应用以及推广和推进企业服务迁移上云进程