目录
目录README.md

基于eBPF的容器异常检测

首届操作系统开源创新大赛
队伍名称:system.slice
队员姓名:刘冰、高怡香、王月妮
指导教师:谢瑞莲老师
项目导师:程书意
学校名称:西安邮电大学

项目简介

项目名称:基于ebpf的容器异常检测

项目描述:Sequence_Collector 是一款基于 eBPF 技术的容器异常检测数据采集工具,专为深入监控容器内的行为特征及相关性能指标而设计,帮助用户及时发现潜在的安全威胁和性能瓶颈。它通过捕获系统调用(如 execvereadwrite)、网络通信行为(如 sendtorecvfrom 和 TCP 连接)以及内存管理操作(如 malloccallocrealloc),实现对容器内关键活动的细粒度监控。Sequence_Collector 利用线程 ID 追踪调用栈信息,能够快速定位每个线程在异常发生时的执行路径,精确识别导致性能瓶颈或系统错误的代码段。此外,该工具还监测进程运行时间、调度行为和 CPU 使用情况,确保容器内资源得到高效利用。通过与 Prometheus 和 Grafana 的集成,Sequence_Collector 可以收集容器中运行进程的相关数据,并在 Grafana 中实现可视化,能够实时查看容器的运行状况和异常行为,并通过自定义仪表盘轻松分析系统性能,进而优化性能并保障系统的稳定性。这里通过python的pyod库对采集数据的异常检测效果进行测试,来展示所采集数据的有效性。

目标描述

本项目由三部分组成:

  • 可扩展的ebpf数据采集框架,主要使用 C 语言开发, ebpf 自动收集容器相关元信息,并和多种指标相结合,判断异常容器行为。
  • (算法)实现容器异常行为的自动检测。
  • Sequence_Collector集成于 prometheusGrafana,自动收集容器指标并实现各种数据的汇总展示以及异常容器检测时的分析流程展示。

项目进度

截止初赛, 本队项目完成进度如下:

任务编号 项目进度 完成情况
1 监测容器内运行进程的I/O事件,采集指标包括I/O吞吐量 100%
2 监测容器内运行进程的内存管理事件,采集指标包括内存的分配、释放空间并计算内存利用率 100%
3 监测容器内运行进程的网络通信TCP连接行为,采集指标包含源地址、目的地址、源端口、目的端口、TCP连接延迟 100%
4 监测容器内运行进程的系统调用行为,采集指标包括系统调用号以及系统调用序列 100%
5 监测容器内进程的 CPU 占用情况,包括运行时间和使用率 100%
6 利用线程 ID 追踪调用栈信息,快速定位每个线程在异常发生时的执行路径 100%
7 异常监测算法 100%
8 Sequence_Collector 工具集成于prometheus和Grafana,收集容器指标进行数据可视化展示 100%
9 支持对性能指标序列、调用栈序列、系统调用序列进行异常检测 100%
10 Sequence_Collector工具性能测试 100%
11 将Sequence_Collector工具适配于龙蜥操作系统 100%

截至决赛阶段目标

  • 功能扩充:在现有基础上,进一步扩展 Sequence_Collector 的功能,新增对容器内文件访问行为的监控,采集文件读写操作的详细指标,更精确地追踪和分析容器内的文件操作。同时,增强容器网络监控能力,增加对 TCP 流量的深入分析,采集更多的网络流量指标,以更全面地监控容器内部的网络通信行为,确保容器环境的安全性和稳定性。

  • 算法优化:通过对比现有的容器异常检测算法,选择更为合适的算法进行集成,提升在容器化环境中的异常检测准确性和效率。结合容器实际运行中的监控数据,测试和优化不同算法的表现,确保在各种复杂和高负载的容器场景下,Sequence_Collector 都能有效识别和报告异常行为,保障容器的运行安全。

  • 工具集成与优化:进一步优化 Sequence_Collector 工具,使其在高负载容器环境中仍能保持高效运行,并减少对容器性能的影响。同时,将工具与现有的容器监控和日志管理系统(如 ELK Stack )深度集成,提供更加直观的容器异常分析和可视化能力,能够实时监控和诊断容器内的潜在问题,提升容器的整体管理效率。

截止决赛, 本队项目完成进度如下:

任务编号 项目进度 完成情况
1 监测容器内运行进程的I/O事件,采集指标包括I/O吞吐量 100%
2 监测容器内运行进程的内存管理事件,采集指标包括内存的分配、释放空间并计算内存利用率 100%
3 监测容器内运行进程的网络通信TCP连接行为,采集指标包含源地址、目的地址、源端口、目的端口、TCP连接延迟 100%
4 监测容器内运行进程的系统调用行为,采集指标包括系统调用号以及系统调用序列 100%
5 监测容器内进程的 CPU 占用情况,包括运行时间和使用率 100%
6 利用线程 ID 追踪调用栈信息,快速定位每个线程在异常发生时的执行路径 100%
7 异常监测算法 100%
8 Sequence_Collector 工具集成于prometheus和Grafana,收集容器指标进行数据可视化展示 100%
9 支持对性能指标序列、调用栈序列、系统调用序列进行异常检测 100%
10 Sequence_Collector工具性能测试 100%
11 将Sequence_Collector工具适配于龙蜥操作系统 100%
12 Prometheus与Alert Manager通信来进行规则告警 100%
13 结合机器学习去训练异常监测模型 100%
14 实现detector部分,去调用训练好的异常监测模型 100%
15 添加exec_info以及fork_event功能,采集更多的指标点 100%

项目设计

本项目整体架构图如上图所示,项目主要由5个部分组成,分别是 loader、controller、exporter、detector以及Alert Manager。

  • 在用户态,loader负责bpf程序的加载,并将其控制接口暴露在bpf文件系统中;且其会在内存文件系统中创建标志文件,以保证其进程的单例模式,避免本地数据重复采集消耗性能;其启动便捷,主要作为后台进程等待被控制层控制以采集数据。
  • controller负责读取bpf文件系统信息,找出其需要的采集层控制接口并进行工作,其主要功能有采集层插件状态查看和控制,目标容器id展示及添加删除,数据输出,调用栈解析等。其操作方式支持命令行模式及交互模式,命令行模式便于数据输出,单一控制命令提交;交互模式便于多控制命令执行,调用栈解析缓存复用,节省性能消耗。
  • detector负责去做异常监测以及实现规则匹配。具体来说,是在训练好的异常监测模型上,通过输入实时采集的数据,去做异常监测。并对于异常数据,通过相应规则,联合Alert Manager进行规则告警。
  • Alert Manager负责处理客户端应用程序(例如 Prometheus 服务器)发送的警报。它负责管理警报。包括对警报进行重复数据删除、分组,并将其路由到正确的接收器集成。
  • exporter用于将整理好的数据,分别使用Pyroscope以及Prometheus来进行可视化,绘制相关图表。除此以外,该层可以通过拉取数据,并通过Prometheus与Alert Manager通信来进行规则告警。

项目优势

  1. 实时采集多个特定容器特定指标的功能Sequence_Collector能够精确地采集和监控多个容器中的特定指标,提供详细的性能和行为数据。
  2. 统一的交互式命令行管理,各插件易于使用:所有插件通过一个统一的命令行界面进行管理,简化了用户操作,提升了使用体验。
  3. 数据粒度从容器、进程到调用栈Sequence_Collector能够采集从容器级别到进程级别再到调用栈级别的细粒度数据,并捕获各层级之间的关系信息,提供全面的监控视角。
  4. 按需激活功能:支持按需激活功能,用户可以根据需要激活特定功能模块,在不需要时则保持未激活状态,以减少系统资源的占用。
  5. 数据可视化部分 : 求和、求平均、求百分比、分类、状态转换、异常检测、Pyroscope、Prometheus格式等数据格式发送,并绘制火焰图、折线图、状态转移图。
  6. 采集程序可预先加载,且保证其单例运行在本地:采集程序可在系统启动时预先加载,确保在本地以单例模式运行,提高运行效率和稳定性。
  7. 良好的可扩展性和动态加载能力:工具设计具备良好的可扩展性,支持动态加载,用户可以根据需求随时增加或修改监测指标和规则。
  8. 规则告警:Prometheus与Alert Manager通信来进行规则告警,发送警报。
  9. 异常监测:通过对大量数据样本进行训练异常监测模型,并使用实时采集数据输入到异常监测模型中进行监测,以帮助用户判断异常的容器详细信息。

异常监测

支持对性能指标序列、调用栈序列、系统调用序列进行异常检测,有助于尽早发现容器内的性能异常或者容器异常。

如仅使用内存分配释放大小的时间序列,在根据业务场景推算出合适的序列向量化长度后,使用pyod中的iForest算法检测出的非业务程序造成的内存分配异常如下:

其中标红的点即为异常点。当出现与平常业务不符的内存分配行为时会被准确检测到,并获取其pid和调用栈,可执行文件路径信息。

可视化展示

Sequence_Collector 通过捕获和分析每个线程的调用栈信息,将其转化为直观的图形化展示,展示形式为火焰图、折线图等。这些图表不仅展示了函数调用的层级关系和执行路径,还通过颜色和条块宽度等方式直观呈现函数调用的频率和持续时间。当容器内发生异常时,调用栈可视化能够帮助用户精确定位异常发生的具体函数和调用路径,快速识别导致问题的代码段,便于及时排查和解决异常。

prometheus可视化端

pyroscope可视化端 image-20240408204317426

flamegraph image-20240408204317426

与此同时,Sequence_Collector 通过可视化 CPU 运行时间,展示容器内各个进程或线程的 CPU 、内存使用情况。通过时间序列图,用户可以观察到 CPU 使用率随时间的变化趋势,识别出系统负载的峰值和异常波动。通过颜色深浅直观展示了各进程或线程在特定时间段内的 CPU 占用情况,帮助识别资源消耗集中的进程或线程。使得容器内的异常行为和性能瓶颈一目了然,从而优化容器的整体性能并保障系统的稳定性。

grafana集成可视化端 image-20240408204317426

性能测试图

数据结构简单,处理方便,性能消耗非常微小。

controller消耗

prometheus exporter消耗

loader消耗

项目运行

从gitlab上clone本项目,注意,需要添加--recursive以clone子模块

git clone --recurse-submodules https://gitlink.org.cn/mYU42onhWE/jyedrqycjc.git

运行编译命令

make -j

编译完成后的所有可执行文件均会出现,运行eBPF程序预加载器

sudo ./loader &

具体的命令行操作方法可以使用

 sudo ./controller  -h
    Usage: ./controller [options]...
   -a|--start <func>       activate a func
   -d|--stop <func>        deactivate a func
   -s|--status             show status of funcs
   -p|--add <cid>          add a container id to be monitored
   -r|--rm <cid>           rm a container id
   -l|--ls                 ls id of monitered container
   -b|--dump <func>        dump data buffer of a func
   -t|--trace <pid>,<tid>  trans a tid to symbol trace
   -h|--help               show help information

sudo tree /sys/fs/bpf 查看已经加载成功的BPF程序,如下所示,所有的bpf程序均被加载。

/sys/fs/bpf
├── seq_coll
│   ├── cgroups
│   ├── exec_info
│   │   ├── events
│   │   ├── exec_info__bss
│   │   └── fmt
│   ├── fork_event
│   │   ├── events
│   │   ├── fmt
│   │   └── fork_event__bss
│   ├── input_bytes
│   │   ├── events
│   │   ├── fmt
│   │   └── input_bytes__bss
│   ├── memalloc_bytes
│   │   ├── events
│   │   ├── fmt
│   │   └── memalloc_bytes__bss
│   ├── offcpu_ms
│   │   ├── events
│   │   ├── fmt
│   │   └── offcpu_ms__bss
│   ├── oncpu_count
│   │   ├── events
│   │   ├── fmt
│   │   └── oncpu_count__bss
│   ├── syscall_num
│   │   ├── events
│   │   ├── fmt
│   │   └── syscall_num__bss
│   ├── tcpconn_ms
│   │   ├── events
│   │   ├── fmt
│   │   └── tcpconn_ms__bss
│   └── traces
└── snap
    ├── snap_firefox_firefox
    ├── snap_snapd-desktop-integration_snapd-desktop-integration
    └── snap_snap-store_snap-store

使用技巧

while true;do echo dump tcpconn_ms; sleep 1; done | sudo ./controller 2> /dev/null # 每隔1s输出缓存的事件

工具使用详情参考./docs/目录下的文件

.
├── bpf
│   ├── exec_info.bpf.c
│   ├── input_bytes.bpf.c
│   ├── memalloc_bytes.bpf.c
│   ├── offcpu_ms.bpf.c
│   ├── oncpu_count.bpf.c
│   ├── syscall_num.bpf.c
│   └── tcpconn_ms.bpf.c
├── bpf_skel
├── controller
├── docs
│   ├── add_bpf_example
│   │   ├── exmp_loader
│   │   ├── fork_event.bpf.c
│   │   ├── main.c
│   │   └── Makefile
│   ├── images
│   ├── 在龙蜥操作系统应用Sequence_Collector.md
│   ├── 工具详细介绍
│   │   ├── exec_info详细介绍.md
│   │   ├── input_bytes详细介绍.md
│   │   ├── memalloc_bytes详细介绍.md
│   │   ├── offcpu_ms详细介绍.md
│   │   ├── oncpu_count详细介绍.md
│   │   ├── syscall_num详细介绍.md
│   │   └── tcpconn_ms细介绍.md
│   └── 工具说明
│       ├── exec_info.md
│       ├── input_bytes.md
│       ├── memalloc_bytes.md
│       ├── offcpu_ms.bpf.md
│       ├── oncpu_count.md
│       ├── prometheus+granfa配置.md
│       ├── syscall_num.md
│       └── tcpconn_ms.md
├── include
├── lib
│   ├── bpftool
│   ├── loader.c
│   ├── trace.c
│   └── uprobe.c
├── loader
├── Makefile
├── prometheus_exporter
├── pyroscope_exporter
├── README.md
├── src
│   ├── controller
│   │   ├── controller.c
│   │   └── main.c
│   ├── exporter
│   │   ├── k8s
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── k8s_exporter
│   │   │   └── main.go
│   │   ├── prometheus
│   │   │   ├── Exporter.py
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   ├── pyroscope
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   └── README.md
│   └── loader
│       ├── exec_info.c
│       ├── input_bytes.c
│       ├── main.c
│       ├── memalloc_bytes.c
│       ├── offcpu_ms.c
│       ├── oncpu_count.c
│       ├── syscall_num.c
│       └── tcpconn_ms.c
├── 操作系统开源创新大赛_system.slice.pptx
├── 操作系统开源创新大赛原创承诺书.pdf
└── 操作系统开源创新大赛项目功能说明书.docx
关于
193.9 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号