系统套接字数据集

编辑

此功能为 Beta 版,可能会发生更改。其设计和代码不如官方 GA 功能成熟,并按“原样”提供,不提供任何保证。Beta 版功能不受官方 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_ADMIN特权 容器中运行。运行 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"
    }
}