亚马逊AWS官方博客

借助 Amazon OpenSearch Service 实现持续安全审计和自动告警

1. 背景

Amazon OpenSearch Service 是 AWS 托管的搜索和分析引擎,它能够帮助企业轻松地存储、搜索和分析海量数据,并从中获取有用的见解。

越来越多的企业和组织开始利用大数据分析来管理和监控他们的业务,利用 Amazon OpenSearch Service 提供的内置事件监控和警报功能,使用户能够监控集群中存储的数据,并根据预先配置的阈值自动发送通知。此功能使用 OpenSearch 警报插件构建,使用 OpenSearch 控制面板界面和 REST API 配置和管理警报。您可以通过自定义 webhook 和 Amazon Simple Notification Service (SNS) 接收通知。

但是在实际使用中,大部分用户对如何使用 OpenSearch 实现持续的日志监控以及构建复杂告警内容并不熟悉,OpenSearch 的使用尤其是如何编写 Query DSL(OpenSearch 专用查询语言)、如何配置 IAM 的关联权限以便 OpenSearch 可以通过 Amazon SNS 发送通知等都需要学习专门的技术栈,带来额外的技术成本。

本文的目的是借用一个例子说明整个流程,帮助用户的安全和运维团队一步一步操作以实现持续的日志监控,快速构建更高效的自动告警流程,以便网络、安全、应用等团队能够更加及时定位安全风险,快速做出响应。

2. 解决方案

日志通(英文名:Centralized Logging with OpenSearch,曾用名 Log Hub)是亚马逊云科技提供的一站式集中日志管理和分析平台,帮助客户轻松创建日志分析管道,并获取业务洞察。该解决方案基于 Amazon OpenSearch 构建,您可以同时高效完成日志摄取、日志处理和日志可视化。

针对业务系统, 通过对导入到 Amazon OpenSearch 的日志进行分析,把应用程序的报错或者非正常请求统计出来,及时帮助企业及时识别和解决潜在的问题,从而提高了业务的可用性和可靠性。

针对云上和 IT 安全设备,通过对云上基础设施以及 AWS 原生服务(比如 WAF/CloudTrail/S3/VPC Flowlog 等)的操作日志的分析,分析异常访问的请求、统计异常访问的 IP、找出异常的访问的用户主体等,可以帮助企业构建基于云原生的安全威胁告警,更好的保障云上资源的安全。

Amazon CloudTrail 是一项支持对亚马逊云科技账户进行监管、合规性检查、操作审核和风险审核的服务。借助 CloudTrail,您可以记录日志、持续监控并保留与整个亚马逊云科技基础设施中的操作相关的账户活动。

很多企业会使用一些固定的 IP 出口来访问互联网,对 AWS 服务的操作也是通过这些出口 IP 完成,把超出这些出口 IP 范围的异常 IP 找到从而帮忙企业快速发现安全风险对网络、安全团队至关重要。

本文我们将基于导入到 Amazon OpenSearch 中的 Amazon CloudTrail 日志,介绍如何查找异常访问 AWS 资源的 IP 地址,并一步一步配置实现通过 Amazon SNS 把访问最多的异常 IP 发送给订阅主题的邮箱。

3. 整体架构

4. 先决条件

把此方案部署到您的亚马逊云科技账号中,您应满足以下先决条件:

  • 一个 AWS 账户
  • 账号中已经部署用来收集日志的 OpenSearch 服务
  • 账号中的 CloudTrail 日志已经注入到 OpenSearch 中

5. 部署过程

5.1 创建 Amazon SNS 主题,并使用 Email 订阅

1. 打开亚马逊云科技控制台,进入 Amazon SNS 服务,创建 Amazon SNS 主题,选择标准主题,输入主题名称。

2. 打开创建的主题,点击“创建订阅”,选择“电子邮件”协议,在终端节点中输入要订阅的邮箱地址,点击“创建订阅”。

3. 检查订阅该主题的邮箱,点击“完成订阅”链接,SNS 主题中的订阅状态变成“已确认”,如下图所示。

5.2 创建 IAM 角色,该角色授予 OpenSearch 访问 SNS 发送通知的权限

1. 打开 IAM 控制台,选择角色,点击创建角色,在使用案例中点击“自定义信任策略”,输入如下的自定义策略,点击下一步。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "opensearchservice.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

2. 创建 IAM 策略,把下面模版中的“REPLACE_CREATED_SNS_ARN”替换为上一步骤中创建 SNS 主题的 ARN,点击“下一步”,给策略命名,来创建 IAM 策略。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": "sns:Publish",
			"Resource": "REPLACE_CREATED_SNS_ARN"
		}
	]
}

3. 在创建角色的面板中,选择创建的策略,点击下一步,输入角色名称,点击下一步完成角色创建,记录创建角色的 ARN。

5.3 在 OpenSearch 控制面板中创建发送通知的通道

打开 OpenSearch 控制面板,选择 “Notification”-> “Channels”,点击“Create Channel”,如下图所示输入 Channel 名称,上面创建的 SNS 主题 ARN 和 IAM 角色 ARN。

5.4 配置 OpenSearch 查询,找出异常 IP 地址以及 IP 地址出现的次数

1. 打开 OpenSearch 控制面板,选择 “OpenSearch Dashboard”-> “Discover”。
OpenSearch 专用的查询语言 Query DSL,写起来比较复杂,在这里我们可以使用控制面板查询语言(DQL)方便的进行查询,关于 DQL 的详细信息可以参考如下内容:https://opensearch.org/docs/latest/dashboards/discover/dql/#searching-with-terms-queries

2. 创建过滤器

本例中,我们选择对 CloudTrail 索引进行查询和过滤,得到异常访问的 IP 地址。我们使用的 DQL 语言如下, 您可以按照规则修改自己 DQL 作为过滤条件来生成合适的过滤器。

not sourceIPAddress:*.amazonaws.com and not sourceIPAddress:172.31.* and not sourceIPAddress:10.255.* and userIdentity.type:IAMUser and eventCategory:Management and not userAgent.keyword:AWS Internal

此处使用了多个条件的过滤来筛选异常 IP 访问:

  • 非亚马逊云科技服务的 IP 地址
  • 非 172.31 网段的内网 IP
  • 非 10.255 网段的 IP
  • 是 IAMUser
  • 是托管的事件
  • 非亚马逊云科技服务之间的内部调用

点击右上角的“Save”,将过滤器命名为“AbnormalIPFilter”。

3. 创建统计分析的视图

打开 OpenSearch 控制面板,选择 “OpenSearch Dashboard”-> “Visualize”-> “Create Visualize”,  选择 “Data Table”,下一步选择数据源 Cloudtrail 日志,选择刚才创建的过滤器“AbnormalIPFilter”。

创建 Buckets 并定义属性,在右边的 Buckets 栏,点击 “Add”-> “Split Rows”,按照如下说明选择或者输入参数,然后点击 Update。

  • Aggregation,此处选择 Terms,根据条件进行聚合
  • Field,此处选择 SourceIpAddress,源 IP 是我们要发现的高危访问来源
  • Order by,此处我们选择根据计数次数进行排序
  • Custom Label,此处可自定义一个标签,此处我们填入 SourceIpAddress

这样我们就可以看到每一个 IP 地址以及访问资源的总次数,如下图所示。左边的视图栏我们也可以在视图页面增加过滤条件进行二次过滤。

通过上面的例子,我们快速的找到异常的 IP,如果需要找到其他的异常,比如非法访问的 KMS 密钥、异常的登陆、越权的访问等等,我们都可以通过创建自己的过滤器和分析视图来完成。

5.5 配置告警

上一步我们实现了异常 IP 的发现,但是还需要运维团队登录控制台才能发现。接下来我们通过配置告警,结合 SNS 服务自动化发送警报给安全和运维团队。

1. 根据配置得到查询异常 IP 的 Query DSL 查询语句

告警信息需要 OpenSearch 专用的 Query DSL 查询语句来获取,此处我们可以通过 OpenSearch 自带的功能生成 DSL 语句,获取上一个步骤中告警视图得到的 IP 和访问统计信息。

点击 “Inspect”-> “View:Requests”-> “Request”-> “Copy”我们很容易就得到了生成这个聚合查询的 DSL 查询语句模版。我们也可以点击 “Save”保存这个聚合视图,方便后续使用。

2. 创建告警:打开 OpenSearch 控制面板,选择 “Alerting”-> “Monitors”,点击“Create Monitor”,如下图所示输入 Monitor 名称。按照如下图所示分别输入。

  • 监控类型,按查询语句进行监控
  • 监控的频率,此处定义为每 2 分钟运行一次
  • 数据源,选择 CloudTrail 对应的索引或者别名

3. 输入查询语句,在 Query 输入框中复制在步骤 Query DSL 查询语句,因为自动生成的查询语句使用的是固定时间,我们需要将查询的固定时间修改为相对时间,比如修改为查询过去 10 分钟的聚合数据。

固定时间查询的语句段如下:

{
    "range": {
      "@timestamp": {
        "gte": "2023-09-01T08:15:00.323Z",
        "lte": "2023-09-01T08:30:00.323Z",
        "format": "strict_date_optional_time"
      }
    }
}

相对时间查询过去 10 分钟的的语句段如下:

{
    "range": {
        "@timestamp": {
            "from": "{{period_end}}||-10m",
            "to": "{{period_end}}",
            "include_lower": true,
            "include_upper": true,
            "format": "epoch_millis",
            "boost": 1
        }
    }
}

4. 执行查询,点击右边的 Run 按钮,我们可以得到过去 10 分钟内的聚合查询结果,如下图所示:

5. 创建触发器,本例中过去 10 分钟出现不在规定范围内的 IP 为触发条件。点击 “Add Trigger”,输入触发器名称,以及对应的触发条件,本例的条件为默认值(ctx.results[0].hits.total.value > 0),点击 “Preview condition response”,  我们可以看到条件是否被满足。

6. 创建告警邮件信息,点击 “Add Action”,输入名称,选择我们在上面步骤创建的通道,输入我们发送邮件的主题后,在消息体里面,我们可以编辑消息体的内容,把找到的 IP 地址以及命中的次数发送到邮件中,见如下截图。

消息体内容如下:

Monitor {{ctx.monitor.name}} just entered alert status. Please investigate the issue.
  - Trigger: {{ctx.trigger.name}}
  - Severity: {{ctx.trigger.severity}}
  - Period start: {{ctx.periodStart}}
  - Period end: {{ctx.periodEnd}}
  - Abnormal IP Found:{{ctx.results.0.aggregations.2.buckets.0.key}}, Count: {{ctx.results.0.aggregations.2.buckets.0.doc_count}}

5.6 问题处置

当有异常的行为被 OpenSearch 的规则检测到后,我们会收到邮件,邮件内容中我们会看到异常的 IP 地址和访问的次数。针对出现的问题,可以采取如下的处置办法:

  • 在企业防火墙侧将异常 IP 加入黑明单
  • 根据异常 IP 的访问找到对应的 IAM 用户,禁止其访问权限
  • 利用 OpenSearch 中该 IP 或者 IAM 的行为来分析问题发生的原因

结论

在这篇博客文章中,我们展示了如何使用 Amazon OpenSearch 配置告警来发现异常 IP 访问的情况。

如果我们需要检测其他安全审计或者发现其他异常行为,比如对 KMS 密钥非法访问、异常登陆、越权访问等等,我们也可以根据需要修改过滤器,来生成对应的 OpenSearch 查询语句,快速构建对其他异常行为的自动告警,从而提升业务业务系统的可用性和可靠性。

参考链接

本篇作者

程红波

亚马逊云科技解决方案架构师,负责企业级客户的架构咨询及设计优化,同时致力于容器和无服务器技术在国内和全球企业客户的应用和推广。

曹磊

亚马逊云科技资深解决方案架构师,负责基于亚马逊云科技云计算方案的咨询与架构设计,同时致力于亚马逊云科技云服务在国内和全球的应用和推广。

王颢

西云数据技术客户经理,负责为亚马逊云科技中国客户提供企业级技术支持和专业指导。在加入西云数据之前,曾就职于全球领先的 IT 解决方案公司,服务于政府,医疗,教育行业客户。