系统套接字数据集编辑

此功能处于测试阶段,可能会发生变化。设计和代码不如正式的 GA 功能成熟,并且按原样提供,不提供任何保证。测试版功能不受正式 GA 功能的支持 SLA 的约束。

这是系统模块的 socket 数据集。它允许监控进出正在运行的进程的网络流量。其主要特点是

  • 支持 IPv4 和 IPv6 上的 TCP 和 UDP 套接字。
  • 输出每个流的字节和数据包计数器。
  • 使用 进程用户 信息丰富流。
  • 提供类似于 Packetbeat 的流量监控信息,但 CPU 和内存使用量减少。
  • 适用于库存内核,无需自定义模块、外部库或开发标头。
  • 将 IP 地址与 DNS 请求相关联。

此数据集不分析应用程序层协议,也不提供 Packetbeat 中存在的任何其他高级功能:- 监控目标不是本地进程的网络流量,例如流量转发。- 监控第 2 层流量、ICMP 或原始套接字。

实现编辑

它仅针对 Linux 实现,目前支持 x86(32 位和 64 位)架构。

该数据集使用 基于 KProbe 的事件跟踪 来监控 IPv4 和 IPv6 上的 TCP 和 UDP 套接字,提供流量监控,包括字节和数据包计数器,以及参与流的本地进程和用户。它通过插入 TCP/IP 堆栈来生成自定义跟踪事件,从而避免了将网络流量复制到用户空间的需要。

通过不依赖定期轮询,这种方法使数据集能够执行系统的近实时监控,而不会丢失短暂连接或进程的风险。

要求编辑

socket 数据集使用的功能需要最低 Linux 内核版本 3.12(vanilla)。但是,一些发行版已将这些功能移植到较旧的内核。以下(非详尽)列表列出了已知数据集在其下工作的不同发行版

发行版 内核版本 工作?

CentOS 6.5

2.6.32-431.el6

[1]

CentOS 6.9

2.6.32-696.30.1.el6

CentOS 7.6

3.10.0-957.1.3.el7

RHEL 8

4.18.0-80.rhel8

Debian 8

3.16.0-6

Debian 9

4.9.0-8

Debian 10

4.19.0-5

SLES 12

4.4.73-5

Ubuntu 12.04

3.2.0-126

[1]

Ubuntu 14.04.6

3.13.0-170

Ubuntu 16.04.3

4.4.0-97

AWS Linux 2

4.14.138-114.102

[1]:这些系统缺少 PERF_EVENT_IOC_ID ioctl。 未来版本可能会添加支持。

数据集需要 CAP_SYS_ADMIN 和 CAP_NET_ADMIN 才能工作。

内核配置编辑

需要启用以下配置选项构建的内核

  • CONFIG_KPROBE_EVENTS:启用 KProbes 子系统。
  • CONFIG_DEBUG_FS:对于缺少 tracefs 支持的内核(<4.1)。
  • CONFIG_IPV6:即使使用 socket.enable_ipv6: false 禁用,也需要内核中的 IPv6 支持。

默认情况下,大多数发行版都启用了这些设置。

以下配置设置可能会阻止数据集启动

  • /sys/kernel/debug/kprobes/enabled 必须为 1。
  • 使用 IPv6 运行时,需要 /proc/sys/net/ipv6/conf/lo/disable_ipv6(在回环设备中启用 IPv6)。

在 Docker 上运行编辑

数据集可以在容器内运行时监控 Docker 主机。但是,它需要在具有 CAP_NET_ADMINprivileged 容器上运行。运行 Auditbeat 的 Docker 容器需要访问主机的 tracefs 或 debugfs 目录。这是通过绑定挂载 /sys 来实现的。

配置编辑

以下选项可用于 socket 数据集

  • socket.tracefs_path(默认值:无)

必须指向 tracefs 的挂载点或 debugfs 内的 tracing 目录。如果未指定此选项,Auditbeat 将查找默认位置:/sys/kernel/tracing/sys/kernel/debug/tracing。如果未找到,它将尝试在其默认位置挂载 tracefsdebugfs

  • socket.enable_ipv6(默认值:未设置)

确定是否必须监控 IPv6。未设置时(默认),将自动检测 IPv6 支持。即使禁用 IPv6,为了运行数据集,您仍然需要具有 IPv6 支持的内核(如果编译为模块,则必须加载 ipv6 模块)。

  • socket.flow_inactive_timeout(默认值:30 秒)

确定流必须处于非活动状态多长时间才能被视为已关闭。

  • socket.flow_termination_timeout(默认值:5 秒)

确定套接字关闭后等待乱序数据包的时间。使用 TCP 时,在套接字关闭后不久可能会收到一些数据包。如果设置得太低,将为这些数据包生成额外的流。

  • socket.socket_inactive_timeout(默认值:1 分钟)

套接字可以处于非活动状态多长时间才能从内部缓存中逐出。较低的值会减少内存使用量,但代价是某些流会被报告为多个部分流。

  • socket.perf_queue_size(默认值:4096)

可以排队等待处理的跟踪样本数。较大的值使用更多内存,但减少了系统负载过重时样本丢失的可能性。

  • socket.lost_queue_size(默认值:128)

可以排队的丢失样本通知数。

  • socket.ring_size_exponent(默认值:7)

控制为每个 CPU 环形缓冲区分配的内存页数,用于从内核接收样本。实际使用的内存量为 CPU 数量 x 页面大小(4KB)x 2ring_size_exponent。也就是说,默认情况下每个 CPU 0.5 MiB 的 RAM。

  • socket.clock_max_drift(默认值:100 毫秒)

定义内核内部时钟与用于对事件进行时间戳记的参考时间之间的最大差异。

  • socket.clock_sync_period(默认值:10 秒)

控制生成时钟同步事件以测量内核时钟和数据集参考时钟之间漂移的频率。

  • socket.guess_timeout(默认值:15 秒)

允许单个猜测运行的最长时间。

  • socket.dns.enabled(默认值:true)

如果必须监控 DNS 流量以使用 DNS 信息丰富网络流。

  • socket.dns.type(默认值:af_packet)

用于监控 DNS 流量的方法。目前,仅支持 af_packet

  • socket.dns.af_packet.interface(默认值:any)

将监控 DNS 的网络接口。

  • socket.dns.af_packet.snaplen(默认值:1024)

为每个捕获的数据包复制的最大字节数。

字段编辑

有关数据集中每个字段的描述,请参阅 导出字段 部分。

以下是此数据集生成的示例文档

{
    "@timestamp":"2019-08-22T20:46:40.173Z",
    "@metadata":{
        "beat":"auditbeat",
        "type":"_doc",
        "version":"7.4.0"
    },
    "server":{
        "ip":"151.101.66.217",
        "port":80,
        "packets":5,
        "bytes":437
    },
    "user":{
        "name":"vagrant",
        "id":"1000"
    },
    "network":{
        "packets":10,
        "bytes":731,
        "community_id":"1:jdjL1TkdpF1v1GM0+JxRRp+V7KI=",
        "direction":"outbound",
        "type":"ipv4",
        "transport":"tcp"
    },
    "group":{
        "id":"1000",
        "name":"vagrant"
    },
    "client":{
        "ip":"10.0.2.15",
        "port":40192,
        "packets":5,
        "bytes":294
    },
    "event":{
        "duration":30728600,
        "module":"system",
        "dataset":"socket",
        "kind":"event",
        "action":"network_flow",
        "category":"network",
        "start":"2019-08-22T20:46:35.001Z",
        "end":"2019-08-22T20:46:35.032Z"
    },
    "ecs":{
        "version":"1.0.1"
    },
    "host":{
        "name":"stretch",
        "containerized":false,
        "hostname":"stretch",
        "architecture":"x86_64",
        "os":{
            "name":"Debian GNU/Linux",
            "kernel":"4.9.0-8-amd64",
            "codename":"stretch",
            "platform":"debian",
            "version":"9 (stretch)",
            "family":"debian"
        },
        "id":"b3531219b5b4449eadbec59d47945649"
    },
    "agent":{
        "version":"7.4.0",
        "type":"auditbeat",
        "ephemeral_id":"f7b0ab1a-da9e-4525-9252-59ecb68139f8",
        "hostname":"stretch",
        "id":"88862e07-b13a-4166-b1ef-b3e55b4a0cf2"
    },
    "process":{
        "pid":4970,
        "name":"curl",
        "args":[
            "curl",
            "https://elastic.ac.cn/",
            "-o",
            "/dev/null"
        ],
        "executable":"/usr/bin/curl",
        "created":"2019-08-22T20:46:34.928Z"
    },
    "system":{
        "audit":{
            "socket":{
                "kernel_sock_address":"0xffff8de29d337000",
                "internal_version":"1.0.3",
                "uid":1000,
                "gid":1000,
                "euid":1000,
                "egid":1000
            }
        }
    },
    "destination":{
        "ip":"151.101.66.217",
        "port":80,
        "packets":5,
        "bytes":437
    },
    "source":{
        "port":40192,
        "packets":5,
        "bytes":294,
        "ip":"10.0.2.15"
    },
    "flow":{
        "final":true,
        "complete":true
    },
    "service":{
        "type":"system"
    }
}