亚马逊AWS官方博客
GuardDuty 可视化安全管理
背景介绍
Amazon GuardDuty 是一种威胁检测服务,可以持续监控恶意活动和未经授权的行为,从而保护您的 AWS 账户、工作负载和在 Amazon S3 中存储的数据。GuardDuty 会对来自多个 AWS 数据源(例如 AWS CloudTrail 事件日志、Amazon VPC 流日志和 DNS 日志)的数百亿事件进行分析 。您只需在 AWS 管理控制台中几次点击,就可以启用 GuardDuty,无需部署或维护任何软件或硬件。
对数百亿事件进行的分析会产生海量的 GuardDuty 调查结果,例如可疑的 EC2 被后门控制进行的 DNS DDoS 行为、可疑的IAM实体调用 API 修改网络访问权限行为、可疑的公开S3存储桶的行为。这些行为可以从不同的维度进行分类,如使用的资源、时间与次数、威胁目的、严重性等,合理的分类可以帮助您有针对性、分优先级地去查看和处理这些安全隐患。本文将向您展示通过无服务器化的方式,将 GuardDuty 与ElasticSearch 相结合,并使用 Kibana 可视化呈现 GuardDuty 的发现结果,使您能直观地对安全状况进行整体把控,以及有针对性地浏览、查询和统计不同维度的安全调查数据。
架构与工作原理
解决方案的工作原理如下图:
工作流程介绍
(1)使用CloudWatch Events收集GuardDuty的发现结果
(2)CloudWatch Events触发Lambda,并捕获到的GuardDuty发现结果发送至Lambda函数
(3)Lambda将数据写入Amazon Elasticsearch Service
(4)使用ElasticSearch Service自带的Kibana对数据进行可视化呈现
使用方法
开始使用之前的注意事项
(1)在正式开始前,请先启用GuardDuty。
默认情况下GuardDuty是没有启用的,如果您第一次使用GuardDuty,看到的界面如下图。
点击【开始使用】按钮,在下一个页面中点击【启用GuardDuty】按钮,您就可以使用GuardDuty的功能了。
(2)部署好之后,guardduty检测及发送至CloudWatch Event均有延迟。当有新findings时需要等待约半小时后才会显示。您会看到如下图所示的finding list。
步骤一:创建Elasticsearch
您可以参考文档中的Elasticsearch创建指南创建ElasticSearch服务。由于GuardDuty产生的都是您账户的安全数据,所以建议您做好ElasticSaerch中数据的访问控制。如果您创建ElasticSearch时选择Internet,意味着它所在的环境是对公网开放的,建议您启用精细访问控制,并通过签名访问,来确保能够访问这些安全数据的用户都是经过授权的;如果您创建ElasticSearch时选择VPC,意味着它处在您可控的VPC网络环境中,只要控制好ElasticSearch服务所在子网的网络连通性(例如放置在私有子网中),就可以避免公网的访问。本文以部署在VPC中的ElasticSearch为例,使用公开访问模式,允许VPC内的网络资源进行访问。
请注意:这种设置仅在ElasticSearch所在子网是私有子网,并且VPC内的其他资源都是您可管控、允许访问安全数据的前提下,才不会带来安全问题。如果要在生产环境中部署,请先确保这一点。
创建成功后,记录下Elasticsearch的VPC终端节点及Kibana链接。
步骤二:创建IAM角色
(1)进入IAM控制台,在左侧选择角色,然后点击【创建角色】。在创建角色页面,选择Lambda,点击【下一步:权限】。
(2)设置Lambda的执行权限。由于本文使用VPC模式,Lambda权限中选择的IAM角色需有EC2的权限、CloudWatch log的写入权限。
步骤三:添加Lambda函数
(1)下载Lambda示例代码和代码依赖项。您可以从Github的项目上获取到所有的文件:https://github.com/sharon-librae/guardduty-elasticsearch,分别为一个Lambda函数zip文件和两个依赖的层的zip文件。
(2)创建Lambda层。进入Lambda服务控制台,分别将layer1.zip和layer2.zip 上传到Lambda层中。如下图所示,输入您自定义的名称,选择【上传.zip文件】选项,分别将两个zip文件上传,运行时选择Node.js 12.x。
(3)创建Lambda函数。输入函数名称,如cloudwatch_event_to_elasticsearch,运行时选择Node.js 12.x。在更改默认执行角色中,选择【使用现有角色】,使用步骤二中创建的角色。在高级设置中,选择Elasticsearch所在的VPC、子网及安全组,安全组使用默认安全组即可。
(4)将代码导入Lambda。点击右上角的【操作】按钮,选择上传.zip文件,上传您之前下载的Lambda代码文件。
(5)自定义代码以适配ElasticSearch。根据之前创建的ElasticSearch终端节点和所在区域,修改代码中的esDomain部分的endpoint与region两个参数。
(6)为Lambda函数添加依赖层。点击Layers,点击【添加层】,在之后的页面中选择【自定义层】,添加之前创建的两个自定义层。
(7)发布Lambda函数新版本,完成Lambda函数的创建。
步骤四:创建CloudWatch Event
(1)进入CloudWatch控制台,在左侧导航栏中选择【规则】。
(2)点击【创建规则】,创建一个新的事件模式规则,当新的安全调查结果出现时,触发lambda。
(3)如上图所示,服务名称选择【GuardDuty】,事件类型选择【GuardDuty finding】,并添加一个目标指向Lambda函数,选择之前创建的Lambda函数。最后点击【配置详细信息】,设置一个名称,完成创建。
步骤五:使用Kibana展示数据
(1)创建Windows实例作为可视化媒介。在ElasticSearch所在VPC的公有子网中创建一台Windows实例,并在创建完成后使用远程连接工具进行登录。
(2)配置index pattern。等待ElasticSearch中有安全数据后,在Windows实例的浏览器中输入Kibana链接,选择explore on my own,进入Kibana首页。在页面中点击【Connect to your Elasticsearch index】,选择【Create index pattern】,创建一个名称为guarddutylogs的index pattern。在之后的设primary time field为service.eventLastSeen。
(3)可视化探索。进入Discover,选择时间窗口,即可看到GuardDuty采集到的具体的安全数据。
(4)之后您就可以根据需求创建visualization ,来直观地统计和呈现GuardDuty收集到的安全调查数据。以攻击ip为例,您可以使用柱状图来展示不同IP的攻击次数,从而判断主要攻击来源,或者使用时间序列图来展示不同时间发生的可疑行为次数,如下图所示。
小结
综上所述,使用本方案可以帮助您可视化地展示GuardDuty的发现结果,帮助您对账户安全有更直观和深入的洞察,让您在安全方面有更多的决策依据。借助本方案,您可以快速了解可疑行为发生的趋势变化,直观感受不同来源IP对您的攻击次数,整体把控不同类型资源的安全风险等级,即时感知不同严重性的威胁并分级处理,以及更简便地浏览和搜索安全数据。
对于安全团队而言,本方案使用AWS托管服务构建,部署简单、可用性高、维护容易,可以助您轻松对AWS云中环境的安全威胁和安全管理有全面、清晰的认识,支持您基于数据进行分析和洞察,并将洞察结果直观呈现给决策者和其他团队(例如直观呈现攻击来源的地域分布、攻击重点目标、攻击方式分布、定位攻击者经纬度等),以便更快地发现根本原因、进行数据驱动的讨论和采取相应的对策。GuardDuty可视化安全管理方案,帮助您在安全可视化方面快人一步。
参考资料
(1)Amazon GuardDuty服务介绍:https://docs.aws.amazon.com/zh_cn/guardduty/latest/ug/what-is-guardduty.html
(2)AWS IAM角色介绍:https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles.html
(3)Amazon ElasticSearch Service服务介绍:https://docs.aws.amazon.com/zh_cn/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html
(4)Amazon CloudWatch Events服务介绍:https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html