Elasticsearch 实战:使用ES|QL高效分析腾讯云审计日志

在当今数字化的世界里,安全防护能力的构建已成为每个组织不可或缺的重心。特别是在安全分析领域,Elasticsearch 的应用已经超越了传统的搜索引擎功能,成为了一种强大的安全信息和事件的管理及分析工具,尤其是在处理和分析大量复杂数据的场景中。而在众多安全分析应用中,对审计日志的分析无疑占据了一席之地,成为了这一领域的核心。在我接触过的安全项目中,无论是维护网络安全的壁垒,还是揭示潜在的安全漏洞,审计日志的分析总是扮演着不可或缺的角色。从企业的角度来看,能够高效、准确地分析审计日志,就意味着能更好地理解安全威胁,从而采取更加有力的防御措施。

在接下来的篇幅中,我将带您深入了解如何利用 Elasticsearch 最新推出的 ES|QL 这一强大工具,对腾讯云审计日志进行高效的分析。我们不仅会探讨 Elasticsearch 在处理这类数据时的优势,还会分享一些实际的案例和技巧,帮助您将这些理论应用于实际工作之中。

为什么需要专业的安全事件分析工具(SIEM)来分析审计日志?

专业的事情交给专业的工具去做。腾讯云审计日志的操作记录页面,只能做简单的查询,无法进行深入的分析

在处理腾讯云审计日志时,我们面临着一个不争的事实:专业的事情需要交给专业的工具。腾讯云审计日志不仅包含着各类复杂的信息,还涉及多层次的数据结构,这些都超出了一般工具的处理范畴。虽然腾讯云审计日志的控制台能够提供一些基本的过滤功能,但这些通常仅限于表层的数据筛选和初步的日志检视,远远无法满足深入分析的需求。

腾讯云审计控制台只能进行简单的过滤和搜索

在SIEM(安全信息和事件管理)的应用场景中,我们不仅需要捕捉和分析数据,还需要将这些数据转化为具有操作意义的洞见。这就要求分析工具不仅具备强大的数据处理能力,还需要能够进行复杂的事件关联、模式识别,够识别并分析潜在的威胁模式,如不寻常的登录尝试或异常的数据访问行为,这些都可能是安全漏洞或入侵尝试的早期迹象。此外,它还应能够通过整合和关联来自不同源的日志和数据,提供更为全面的安全视角

使用 Elastic Security 分析腾讯云审计日志

Elastic Security 是一个强大的安全信息和事件管理(SIEM)平台,它结合了Elasticsearch的高效数据处理能力和Kibana的直观可视化界面。这个平台不仅提供实时的监控和安全分析功能,还包括端点保护和事件响应机制。Elastic Security 能够高效地聚合、搜索和分析来自各种数据源的大量数据,使其成为处理和分析安全事件的理想工具。

在Forrester的报告中,Elastic安全分析平台处于领先位置

采集并导入腾讯云审计日志

要开始分析,首先需要将腾讯云审计日志导入Elasticsearch。腾讯云审计日志的控制台中,目前不提供完整的日志下载,但通过创建COS跟踪集,我们可以很简单的从COS上采集审计日志。

那么我们要如何将存储在COS中的审计日志保存到Elasticsearch当中呢?我们可以向之前我们介绍过的 腾讯云Elasticsearch GPT助手 询问:

向助手询问如何导入COS中的审计日志

根据指引,我们可以快速配置一个Logstash的实例。将审计日志导出到ES集群当中。

代码语言:json
复制
input {
  s3 {
    "access_key_id"=>"xxx"
    "secret_access_key"=>"xxx"
    "endpoint"=> "https://cos.ap-chengdu.myqcloud.com"
    "bucket"=>"loganalysis-1301873956" 
    "region"=>"ap-chengdu"
    "prefix" => "audit/auditlog/2023/11"
    "codec" => "json_lines"
    "sincedb_path" => "/dev/null"
  }

}

filter {
date {
match => ["eventTime", "UNIX"]
target => "@timestamp"
}
}

output {
elasticsearch {
hosts => ["https://es-7cu6zx9m.public.tencentelasticsearch.com"] # 替换为您的Elasticsearch主机
index => "tencent-cloud-auditlog" # 您想要的索引名称
api_key => "9Co1L4wBRGd0egTBwwJf:tZPfEc11QmunDXrsdSU_0g"
}
}

了解腾讯云审计日志

在开始分析之前,深入理解腾讯云审计日志的结构和内容是非常重要的。这包括了解日志中记录的事件类型、日志数据的格式、以及可能包含的关键信息(如用户身份、操作时间、资源类型等)。通过对这些细节有深入的了解,可以更有效地构建查询语句,从而提取有意义的安全洞察。

通过discovery查看日志

而通过机器学习中的数据视图或者Discovery中的字段统计值,我们可以获得字段和值的一个概览,知道哪些字段重要(比如,Resource, Event, User等大类),字段值的分布:

使用ES|QL对审计日志进行安全分析

一旦日志数据被正确地采集并索引到Elasticsearch中,就可以开始进行安全分析了。这里,我们会使用 Elasticsearch Query Language(ES|QL),它是Elasticsearch的新一代查询语言,ES|QL是一种更加一致、简洁、实用、高效的语言,旨在解决用户在使用Elasticsearch时面临的复杂性问题。借助ESQL,可以根据特定的需求和查询条件来分析审计日志,如检测异常行为、识别潜在的安全威胁或者进行趋势分析等。例如,可以编写查询来识别在短时间内频繁发生的登录失败事件,或者追踪特定用户的操作模式。

ES|QL在腾讯云审计日志上的实战案例

在本节中,我们将深入探讨如何使用 ES|QL 来分析腾讯云审计日志。通过一系列实战案例,我们将展示如何执行有效的日志查询、数据处理、和安全分析。

只要读者简单按照我们上面提供的logstash配置注入了自己的腾讯云审计日志,并且自行创建对应的数据视图(DataView)- tencent-cloud-auditlog,就可以在支持 ES|QL 的Elasticsearch版本上,完全运行我们今天提供的案例。甚至细心的读者可能已经发现了,我们并没有提供任何的索引mapping,因为,在此案例中,我们也将着重展示 ES|QL 弹性的数据检索和处理能力,以及读时建构 (Schema on Read)能力,即使在没有完善建模的情况下,我们也能进行全面的调查分析。

要开始实战之前,我们先在Discovery上切换到ES|QL模式,并选定我们要分析的 tencent-cloud-auditlog数据视图:

1. 基础查询与IP地址过滤

先前,我们已经大致知道了审计日志中包含的数据信息。在本次调查中,我们希望对 sourceIPAddress 进行过滤,以识别特定的IP地址范围。比如,我希望查看那些在内网VPC中,对腾讯云资源的操作。在ESQL中,这可以通过 CIDR_MATCH 函数轻松实现。

代码语言:sql
复制
from tencent-cloud-auditlog
| WHERE CIDR_MATCH(sourceIPAddress, "10.0.0.0/8", "172.27.0.0/16", "192.168.0.0/16")

显然,因为我们并没有进行数据的建模,我们在一开时就遇到了麻烦。在这里,因为sourceIPAddress并非是ip类型,因此,无法应用CIDR_MATCH函数:

但这也说明了 ES|QL 虽然支持 Schema On Read,但在进行处理时,在一些算子上仍然实现了对数据类型的检测,以方便我们在耗费大量资源进行计算之前能够检测到影响计算的类型异常,以规避进行了多步运算之后才出现的不可知错误。

2. 数据格式转换

为了更准确地处理IP地址,我们需要将字符串格式的 sourceIPAddress 转换为 IP 地址格式。这是通过 eval 函数和 to_ip 转换实现的。

代码语言:sql
复制
from tencent-cloud-auditlog
| eval sourceIPAddress = to_ip(sourceIPAddress.keyword)
| WHERE CIDR_MATCH(sourceIPAddress, "10.0.0.0/8", "172.27.0.0/16", "192.168.0.0/16")

3. 用户操作过滤

在进行了数据的转换后,我们来进行更多的过滤。

比如,我们希望反转一下,我希望了解来自公网的资源操作,我们可能只关注特定用户的活动,比如 root 用户,或者我自己。

代码语言:sql
复制
from tencent-cloud-auditlog
| eval sourceIPAddress = to_ip(sourceIPAddress.keyword)
| WHERE NOT CIDR_MATCH(sourceIPAddress, "10.0.0.0/8", "172.27.0.0/16", "192.168.0.0/16")
| WHERE userIdentity.userName.keyword == "李捷"
| keep eventName, eventType, resourceType, resourceName, requestParameters, userIdentity.type, userIdentity.userName

4. 数据聚合

看起来这个用户进行了非常的多操作,并且经常从外网访问。我们想知道他做了什么事情,直观的说,从日志上不太好看。而聚合操作可以帮助我们更好地理解特定类型资源的使用情况,特别是当我们有非常多的数据项的时候。例如,以下查询提供了特定用户 操作的不同资源类型的统计计数。

代码语言:sql
复制
from tencent-cloud-auditlog
| WHERE userIdentity.userName.keyword == "李捷"
| stats count() by resourceType

进一步扩展,我们可以按资源类型和事件区域进行聚合。

代码语言:sql
复制
from tencent-cloud-auditlog
| WHERE userIdentity.userName.keyword == "李捷"
| stats count() by resourceType, eventRegion

从下图可以看出比较多的信息。(我个人没有印象用过apm,rum等功能,莫非泄露了?)

5. 排序与字段保留

我需要知道我最常访问的资源,对结果进行排序,并只保留关键字段,可以使数据更清晰、更直观,这些操作符合我们已有的知识:

代码语言:sql
复制
from tencent-cloud-auditlog
| WHERE userIdentity.userName.keyword == "李捷"
| stats opcount = count() by resourceType, eventRegion
| sort opcount desc

看来 cvm 和 es 是我的最爱。之所以常去 singapore ,是钟爱海外的带GPU的竞价服务器。

6, 可视化操作

我们还可以选择查看图表,以更直观的方式了解数据:

并且,可以对图表进行所需的调整,并保存到仪表板中。

7. 字符串操作和数据丰富

通过字符串操作和数据丰富(Enrich)功能,我们可以添加额外的上下文信息到日志数据中。

接下来,我们想知道用户最常对CVM进行什么样的操作。而操作类型主要保存在 eventName 当中。我们可以查看审计日志的文档,通过eventName的数据定义来一一对比:

但这样比较麻烦,我们希望直接能够在查询的界面上获取对应的信息。

另外,对于同一个eventName的值比如 DescribeInstances,在不同的资源上可能有不同的含义。因此,我们还需要关联查询 resourceType

我们的需求可以描述为:

  • 我们要关联查询另外一个数据表,以了解操作的实际含义
  • 关联查询时,我们还需要组合查询条件,需要同时匹配多个条件,即特定类型的特定操作要与另一个表匹配

要实现以上需求,我们仍然能通过ES|QL完成。这里设计到了数据的处理与丰富,并使用到 enrich policy:

source索引,将是一个包含静态信息的数据表,比如下表(也可以是其他的信息,比如企业员工信息,CMDB数据等):

可以通过文件上传的方式,快速建立起这个索引:

上传静态文件数据

然后需要建立一个enrich policy。enrich policy用于指定源索引,并且告诉Elasticsearch如何将数据与接收到的文档进行匹配

包括:

  • match - 匹配精确值
  • geo match - 匹配地理位置
  • range - 匹配数字、日期或 IP 地址范围

而一旦匹配上之后,我们要将哪个字段丰富到目标索引当中:

而在ES|QL中,我们需要执行的操作包括:

  • 我们需要组合字段,concat(resourceType,"", eventName),使其与source索引中的数据格式匹配,比如 “es_CreateIndex”
  • 指定 enrich policy,并指定传递给 policy 用于匹配的字段:enrich resource_event_lookup on resourceEvent
代码语言:sql
复制
from tencent-cloud-auditlog
| WHERE userIdentity.userName.keyword == "李捷" and resourceType == "cvm"
| eval resourceEvent = concat(resourceType, "
", eventName)
| enrich resource_lookup on resourceEvent
| keep eventName, eventType, resourceType, resourceName, requestParameters, userIdentity.type, userIdentity.userName, eventDesc

执行之后,我们可以看到,多出来一列数据包含了我们所需的信息,这个功能有点像SQL中的join。我们将其称之为 enrich + lookup

8. 关键操作的监控与告警

最后,我们可以监控并响应关键操作,例如es索引的删除或者cvm实例的删除并通过企业微信进行告警通知。

首先,定义关键操作:

代码语言:sql
复制
# 告警
from tencent-cloud-auditlog
| WHERE userIdentity.userName.keyword == "李捷" and resourceType == "cvm" and eventName == "TerminateInstances"
| stats count()

然后,在您需要的时候,添加告警规则:

总结

通过本文的深入探讨和实战案例,我们已经展示了如何利用 Elasticsearch Security(ES)和 Elasticsearch Query Language(ES|QL)来高效地分析腾讯云审计日志。从基础查询到复杂的数据处理和安全分析,ES|QL展现了其强大的灵活性和效率。

  • 更快的查询速度:利用 Elasticsearch 查询引擎,可在多个阶段同时执行搜索和聚合,从而提高速度和效率。
  • 简化 Elasticsearch 和数据摄取: Elasticsearch 的搜索功能非常丰富,但需要投资学习。ES|QL 语法大大简化了对 Elasticsearch 及其功能的使用和理解。
  • 全新的变革性搜索引擎: ES|QL 查询引擎提供了lookup等新功能。只需一次查询,即可轻松实现搜索、聚合、计算和数据转换。未来,ES|QL 还将提供 inline stats 和 joins等其他功能
  • 快速洞察: 直接从 Kibana Discover 创建可视化、计算和聚合,将调查工作流程浓缩在一个屏幕中,从而更快地获得答案。
  • 减少将数据引入 Elasticsearch 的摩擦: 无论数据来源、结构、复杂性或数量如何,ES|QL 都能简化 Elasticsearch 中的数据摄取。
  • 警报: 利用 ES|QL 写入可观测性和安全警报,并将汇总值作为阈值。通过强调有意义的趋势而非孤立的事件、减少误报并提供更具操作性的通知,提高检测准确性。

我们鼓励所有对安全日志分析感兴趣的用户尝试使用 Elastic Security 和 ES|QL。无论是基本的日志审计,还是复杂的安全威胁检测,ES|QL都能提供强大的支持。通过实践,您将能够更加深入地理解其潜力,并将其应用于您的安全分析工作中。