系统套接字数据集

编辑

此功能处于测试阶段,可能会发生变化。其设计和代码不如正式 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数据集使用的功能需要最低 3.12 版(原始)的 Linux 内核。但是,某些发行版已将这些功能反向移植到较旧的内核。以下是已知数据集可在其中运行的不同发行版(非详尽列表)

发行版 内核版本 是否运行?

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"
    }
}