网络事件映射

编辑

网络事件捕获一个设备与另一个设备通信的详细信息。发起方称为源,接收方称为目标。根据数据源的不同,网络事件可以包含地址、协议、报头和设备角色的详细信息。

本指南描述了 ECS 中用于网络相关事件的不同字段集,并提供了关于将其映射到 ECS 的最佳实践的指导。

源和目标基线
编辑

当事件包含有关发送和接收主机的详细信息时,捕获这些值的基线将是 目标 字段。

某些事件还可以指示每个主机在交换中的角色:客户端或服务器。如果此信息可用,则应除了sourcedestination字段之外,还使用客户端服务器字段。source/destination下映射的字段和值应复制到client/server下。

网络事件映射示例
编辑

下面是一个 DNS 网络事件。源设备(192.168.86.222)发出 DNS 查询,充当客户端,而 DNS 服务器是目标(192.168.86.1)。

请注意,如果这是一个完整的映射示例,此事件包含其他详细信息,这些详细信息将填充其他字段(例如DNS 字段)。为了专注于网络细节,此处省略了这些附加字段。

{
  "ts":1599775747.53056,
  "uid":"CYqFPH3nOAa0kPxA0d",
  "id.orig_h":"192.168.86.222",
  "id.orig_p":54162,
  "id.resp_h":"192.168.86.1",
  "id.resp_p":53,
  "proto":"udp",
  "trans_id":28899,
  "rtt":0.02272200584411621,
  "query":"example.com",
  "qclass":1,
  "qclass_name":"C_INTERNET",
  "qtype":1,
  "qtype_name":"A",
  "rcode":0,
  "rcode_name":"NOERROR",
  "AA":false,
  "TC":false,
  "RD":true,
  "RA":true,
  "Z":0,
  "answers":["93.184.216.34"],
  "TTLs":[21209.0],
  "rejected":false
}
源和目标字段
编辑

首先,填充source.*destination.*字段集。

  "source": {
    "ip": "192.168.86.222",
    "port": 54162
  }
  "destination": {
    "ip": "192.168.86.1",
    "port": 53
  }
客户端和服务器字段
编辑

回顾原始事件,它显示源设备是 DNS 客户端,目标设备是 DNS 服务器。sourcedestination下映射的值分别复制并映射到clientserver下。

  "client": {
    "ip": "192.168.86.222",
    "port": 54162
  }
  "server": {
    "ip": "192.168.86.1",
    "port": 53
  }

映射这两对字段集可以通过两种方式提供对同一网络事务的查询可见性。

  • source.ip:192.168.86.222返回所有来自192.168.86.222的事件,无论其在事务中的角色如何。
  • client.ip:192.168.86.222返回所有主机192.168.86.222充当客户端的事件。

destinationserver字段也适用。

  • destination.ip:192.168.86.1返回所有目标为192.168.86.1的事件。
  • server.ip:192.168.86.1返回所有192.168.86.1充当服务器的事件。

需要注意的是,虽然单个网络事务中事件之间的sourcedestination字段的值可能会反转,但clientserver的值通常不会反转。下表展示了两个涉及两个客户端和一个服务器的 DNS 事务如何映射到source.ip/destination.ipclient.ip/server.ip

表 1. 源/目标

source.ip destination.ip 事件

192.168.86.222

192.168.86.1

DNS 查询请求 1

192.168.86.1

192.168.86.222

DNS 应答响应 1

192.168.86.42

192.168.86.1

DNS 查询请求 2

192.168.86.1

192.168.86.42

DNS 查询请求 2

表 2. 客户端/服务器

client.ip server.ip 事件

192.168.86.222

192.168.86.1

DNS 查询请求 1

192.168.86.222

192.168.86.1

DNS 应答响应 1

192.168.86.42

192.168.86.1

DNS 查询请求 2

192.168.86.42

192.168.86.1

DNS 应答响应 2

相关字段

编辑

related.ip字段在一个数组中捕获事件中存在的所有 IP 地址。

  "related": {
    "ip": [
      "192.168.86.222",
      "192.168.86.1",
      "93.184.216.34"
    ]
  }

相关字段旨在促进数据透视。由于这些 IP 地址可能出现在许多不同的字段中(source.ipdestination.ipclient.ipserver.ip等),因此无论它出现在哪个字段,您都可以使用单个查询(例如related.ip:192.168.86.222)轻松搜索该 IP。

网络事件不仅限于使用related.ip。如果事件中存在主机名或其他主机标识符,也应填充related.hosts

使用事件字段进行分类
编辑

在考虑事件分类字段时,使用各自允许的值填充categorytype字段,这些值最能对源网络事件进行分类。

  "event": {
    "category": [
      "network"
    ],
    "type": [
      "connection",
      "protocol"
    ],
    "kind": "event"
  }

大多数event.category/event.type ECS 配对本身就已完整。但是,event.category:networkevent.type:protocol的配对是一个例外。当这两个字段/值对都用于对事件进行分类时,还应填充network.protocol字段。

  "network": {
    "protocol": "dns",
    "type": "ipv4",
    "transport": "udp"
  }
结果
编辑

将到目前为止介绍的所有内容放在一起,我们得到了一个最终的 ECS 映射事件。

{
  "event": {
    "category": [
      "network"
    ],
    "type": [
      "connection",
      "protocol"
    ],
    "kind": "event"
  },
  "network": {
    "protocol": "dns",
    "type": "ipv4",
    "transport": "udp"
  },
  "source": {
    "ip": "192.168.86.222",
    "port": 54162
  },
  "destination": {
    "ip": "192.168.86.1",
    "port": 53
  },
  "client": {
    "ip": "192.168.86.222",
    "port": 64734
  },
  "server": {
    "ip": "192.168.86.1",
    "port": 53
  },
  "related": {
    "ip": [
      "192.168.86.222",
      "192.168.86.1",
      "93.184.216.34"
    ]
  },
  "dns": { ... }, 
  "zeek": { "ts":1599775747.53056, ... } 
}

同样,这里没有深入探讨 DNS 字段,但为了完整性而包含。

原始字段可以选择性地保留为自定义字段。