实现模式

编辑

数据规范化提供了来自各种数据源的事件的一致视图。遵循这些约定将有助于更好地描述、发现、识别和分类事件。

基础字段
编辑

位于 ECS 顶层任何字段集之外的各个字段组称为基础字段。

ECS 事件遵循这些基础字段约定

@timestamp
所有事件都必须使用事件的原始时间戳填充@timestamp
message
大多数事件都应填充message
ecs.version
引用的ecs.version 用于开发数据映射或摄取管道。此值有助于检测映射何时更新或落后。它还可以帮助解释为什么特定数据源未填充与其他数据源相同的字段。
标签
tagslabels 字段添加简单的元数据作为 keyword 值。
主机
编辑

在 ECS 中,host 是发生事件的计算实例。host 可以是物理设备、虚拟机、容器或云实例。

host.* 字段集包含不同计算实例的公共属性。某些主机类型具有更多字段来捕获特定细节,例如 cloud.*container.*

代理和观察者
编辑

代理是收集、观察、测量或检测事件的软件。agent.* 字段捕获有关哪个代理实体捕获事件的详细信息,包括代理的版本。代理的示例包括 Beats 和 Elastic Agent。

observer 是外部监控或中介设备,例如防火墙、APM 服务器或 Web 代理。这些设备监控和检测网络、安全、应用程序事件。在observer.* 字段集中捕获这些设备类型的详细信息。

时间戳
编辑

ECS 要求每个事件都包含 @timestamp 字段。某些事件还包含需要捕获的额外时间戳。

@timestamp
所有事件都必须使用事件的原始时间戳填充@timestamp
event.created
代理或管道看到事件的时间戳。
event.ingested
事件到达中心数据存储(例如 Elasticsearch)的时间戳。

这三个时间戳通常应按时间顺序排列

@timestamp < event.created < event.ingested
event.start
此时间戳标记事件活动的开始。例如,在网络会话中,event.start 是流中第一个观察到的数据包的时间戳。
event.end
此时间戳标记活动的结束。在网络流中,event.end 是流中最后一个观察到的数据包的时间戳。
event.duration
event.endevent.start 之间的差值
event.duration = event.end - event.start
来源
编辑

存在特定的 event.* 字段来捕获事件的来源。

event.provider
包含生成事件的软件或操作系统的名称。
event.module
如果摄取代理或管道具有模块或插件的概念,则使用模块或插件名称填充event.module
event.dataset
用于定义来自事件源的不同类型的日志或指标。推荐的约定是 <moduleName>.<datasetName>。对于 Apache Web 服务器访问日志,event.dataset 值将为 apache.access
分类
编辑

事件分类字段使用四个字段的允许值对类似事件进行分组

  • event.kind
  • event.category
  • event.type
  • event.outcome

使用分类字段 涵盖了更多关于将这四个字段一起使用以对事件进行分类的详细信息。

丰富事件
编辑

监控代理或摄取管道可以向原始事件添加更多详细信息。ECS 具有许多字段来保存这些丰富细节。

查找
编辑
GeoIP
添加有关 IPv4 或 IPv6 地址的地理位置的信息。通常用于填充网络事务字段(如 source.*destination.*client.*server.*)下的 geo.* 字段。
{
  "source": {
    "address": "8.8.8.8",
    "ip": "8.8.8.8",
    "geo": {
      "continent_name": "North America",
      "country_name": "United States",
      "country_iso_code": "US",
      "location": { "lat": 37.751, "lon": -97.822 }
    }
  }
}
自治系统编号
自治系统编号 (ASN) 数据库查找确定与 IP 地址关联的 ASN。
解析
编辑
用户代理
将用户代理分解为各个字段。
{
  "user_agent": {
    "user_agent": {
      "name": "Chrome",
      "original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
      "version": "51.0.2704.103",
      "os": {
        "name": "Mac OS X",
        "version": "10.10.5",
        "full": "Mac OS X 10.10.5",
        "platform": "darwin",
        "type": "macos"
      },
      "device" : {
        "name" : "Mac"
      }
    }
  }
}
URL
URL 也可以分解为其各个部分。
{
  "original" : "http://myusername:[email protected]:80/foo.gif?key1=val1&key2=val2#fragment",
  "url" : {
    "path" : "/foo.gif",
    "fragment" : "fragment",
    "extension" : "gif",
    "password" : "mypassword",
    "original" : "http://myusername:[email protected]:80/foo.gif?key1=val1&key2=val2#fragment",
    "scheme" : "http",
    "port" : 80,
    "user_info" : "myusername:mypassword",
    "domain" : "www.example.com",
    "query" : "key1=val1&key2=val2",
    "username" : "myusername"
  }
}
域名
从完全限定域名 (FQDN) 中提取注册域名(也称为有效的顶级域名加一)、子域名和有效的顶级域名。
{
  "fqdn": "www.example.ac.uk",
  "url": {
    "subdomain": "www",
    "registered_domain": "example.ac.uk",
    "top_level_domain": "ac.uk",
    "domain": "www.example.ac.uk"
}
相关字段
编辑

许多事件具有填充不同字段的类似内容:IP 地址、文件哈希、主机名。使用related.* 字段在这些事件之间进行切换。

例如,在 host.*source.*destination.*client.*server.* 字段集以及 network.forwarded_ip 字段下找到的 IP 地址。通过将事件中的所有 IP 地址添加到 related.ip 字段,现在有一个单一字段可以搜索给定的 IP,而不管它出现在哪个字段。

related.ip: ["10.42.42.42"]