目录
目录README.md

一、项目描述

1.项目名称

基于ebpf的容器异常检测

2.项目概述

frame

BPF 是一种用于网络数据包过滤的机制。eBPF 扩展了 BPF 的功能,使其不仅能够处理网络数据包,还可以在 Linux 内核中运行用户定义的代码,用于实现各种系统监控和网络功能。对于eBPF可以简单的理解成kernel实现了一个虚拟机机制,将类C代码编译成字节码,挂在到内核的钩子上,当钩子被触发时,kernel在虚拟机的”沙盒”中运行字节码,这样既能方便的实现很多功能,也能通过沙箱保证内核的安全性。

本项目是一个基于eBPF技术对容器异常行为进行判定的系统,可对被观测容器进行插桩,依托tracepoint对容器行为进行监测,收集容器的行为特征,使用Teiresias算法判定特征相似度并基于分类算法进行二分类判定容器异常。容器的各项数据及用于判定的系统日志可在grafana中进行可视化观察。

该项目具有如下特点:

  • 实时数据捕获:使用 eBPF 技术捕获容器内的系统调用、cpu磁盘运行负载、网络活动、文件读写,不需修改容器或宿主机的现有运行环境,
  • 特征析取与异常判别:使用机器学习和自然语言处理的手段分析捕获的数据,识别异常行为和异常特征,可供用户进行进一步分析和研究。
  • 数据可视化:通过对grafana提供Prometheus数据源以提供一个图形界面,实时展示监控数据,并可支持自定义查询和报警设置。
  • 安全和高效率:eBPF 确保了监控的低侵入性和高性能,最小化对容器运行的影响。

3.技术栈

  • eBPF: 用于实现核心的数据捕获和处理逻辑。
  • bcc: eBPF工具集和python库,用于编写用户程序和eBPF程序的编译运行及挂载。
  • Libbpf: 用于与 eBPF 程序交互,处理加载和管理 BPF 程序的复杂性。
  • Docker: 用于容器的管理和运行环境的模拟。

下图为容器监测的grafana数据图 grafana

二、工作内容和方案

1.比赛准备和调研

在比赛最初阶段,我们组明确开发的目标(比赛作品)应首先满足赛题所提出的要求,即:

  1. 数据采集(系统调用类型、资源使用量、流量特征),具有扩展能力的框架,可以快速方便地添加新的数据采集类型
  2. 采集框架的性能开销可忽略
  3. 实现容器异常行为的自动检测算法
  4. grafana UI展示

基于上述要求,为了达成所有的目标,我们进行了广泛的技术调研,从论文、网络资料、开源代码中汲取诸如eBPF原理和应用场景、eBPF编程工具链、eBPF trace方法、异常检测算法、机器学习及神经网络的相关知识,并形成文档。具体而言,内容包括但不限于:

  • eBPF 技术:研究了 eBPF 的工作原理及其应用场景,以及它如何在 Linux 内核中提供可编程的、高效的执行环境。eBPF trace则是本项目的关键功能,我们具体分析了eBPF如何在操作系统驱动程序层进行tracepoint插桩,以及XDP技术的作用与实现。

  • 容器技术:分析了容器的运行原理和生命周期管理,docker在Linux操作系统下的部署和使用,以及如何通过 eBPF 跟踪容器创建、执行和终止等关键事件。当前主要主要针对docker技术进行分析,我们同时也对kubernetes集群容器部署技术进行了调查研究和实验,未来考虑在kubernetes上扩展实现本项目的功能。

  • 监控工具:横向比较并分析评估了现有的监控工具和框架,例如 Prometheus、Grafana 以及其他 eBPF 基础的监控工具,如 BCC 和 bpftrace。同时,对相对比较成熟的cilium检测工具Falco异常分析工具进行了深入的研究,其它工具的详细使用方法可以查看Grafana 文档BCC GitHub 仓库.

2.开发计划

在需求分析和调研完成后,进入软件设计及实现阶段。

(1)系统设计

  • 阶段目标:完成系统的详细设计,包括软件架构、数据流程和用户界面。
  • 时间线:WEEK 1
  • 任务:
    • 制定容器部署和测试方案。
    • 确定监控指标和数据收集策略。
    • 设计系统架构,绘制系统架构图,确保模块化和可扩展性。
    • 制定前端展示和交互方案。

(2)环境搭建

  • 阶段目标:在本地搭建开发和测试环境,准备必要的软件和工具。
  • 时间线:WEEK 2
  • 任务:
    • 安装必要的软件包和依赖。
    • 安装异常注入工具,用于容器异常发生。
    • 准备容器化环境和虚拟化工具,配置容器运行时。

(3)实现ebpf监控部分

  • 阶段目标:实现 eBPF 程序来监控和收集容器行为数据。
  • 时间线:WEEK 3-4
  • 任务:
    • 开发后端处理逻辑,包括数据聚合和分析。
    • 创建展示实时数据和历史趋势。

(4)实现可视化

  • 阶段目标:实现 eBPF 程序向外输出Prometheus格式数据、使用Grafana UI控制Prometheus数据源并进行图像展示。
  • 时间线:WEEK 5

(5)实现容器异常检测算法

  • 阶段目标:使用Teiresias算法对系统调用数据进行分析,并给出容器是否异常的判定结果。
  • 时间线:WEEK 6-7

(4)测试和优化

  • 全面测试系统功能,完善系统存在的不足,对初版程序进行改进和bug修复,并进行必要的优化。
  • 时间线:WEEK 7往后
  • 任务:
    • 进行单元测试、集成测试和性能测试。
    • 将测试结果绘制成图像并加入文档。
    • 实现更好的集成。
    • 改进异常检测算法。
    • 组织软件目录结构,适应现代软件部署流程。
    • 提高软件健壮性。
    • 针对kubernetes等应用环境进行扩展。

(5)文档编写

  • 阶段目标:完成开发文档。
  • 任务:
    • 编写文档和系统使用教程。
    • 修正初版图片及文档以适应最新内容。

3.开发内容及重要进展

(1)基于eBPF的基本数据采集

  • 利用eBPF技术,参照我们之前的设计方案,编写了一套用于数据采集的程序。该程序参照bcc及现有代码的编写方式,并针对系统架构进行了相应修改。
    • 容器系统调用数据采集。系统调用是本项目最主要的分析对象,跟踪系统调用的做法是通过eBPF程序在内核系统调用入口设置Tracepoint(即hook),可以通过此方法获取系统调用的名称、参数、返回值和进程信息。
    • 容器文件读取数据采集。文件读取时系统调用的特殊情况,linux中,open系统调用的处理函数为do_sys_open,我们跟踪该处理函数,可以获取相应的文件处理信息。
    • 容器资源占用数据采集。利用bcc自带的工具,可以收集cpu、磁盘占用信息、系统调用数量信息等。

(2)基于Prometheus和Grafana UI的数据可视化展示

  • 编写Prometheus配置文件
  • 使用python中的Prometheus_client库将数据导出成Prometheus格式并对外暴露端口
  • 在Grafana中配置Prometheus数据源信息,进行定制化查询。

(3)基于Teiresias算法的容器异常检测

  • 将系统调用数据处理成”#001#002#003”格式的数据,便于后续处理
  • 获取重复子序列特征
  • 获取系统调用频率特征

三、程序安装及使用

  • 安装所需依赖
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
  libllvm16 llvm-16-dev libclang-16-dev python3 python3-pip zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  liblzma-dev libdebuginfod-dev arping netperf iperf libpolly-16-dev
  • Ubuntu下安装bcc可参照其官方安装教程INSTALL.md
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd
  • 安装docker
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 安装所需的python包
pip install docker prometheus-client 
  • 运行
sudo python main.py
  • 运行结果可在日志文件夹中找到。

Prometheus/Grafana可视化

  • 安装prometheus
sudo apt install prometheus
  • 安装并运行grafana
sudo apt install grafana
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
  • 浏览器打开localhost3000端口,输入用户密码(admin初始密码为admin),进入Dashboard界面。
  • /etc/prometheus/prometheus.yml 中添加以下内容:
  - job_name: Steve
    static_configs:
      - targets: ['localhost:9001']
  • Grafana创建并设置数据源url为http://localhost:9090

  • 查询其uid,填入./grafana.txt中的uid字段

  • 导入Grafana Dashboard配置文件./grafana.txt

  • 启动之后,运行pr.py

sudo python3 ./pr.py
  • 可在浏览器中进入Dashboard查看。

  • 进入src目录

    cd src
  • 运行检测文件

    sudo python main.py

    在控制台中可输出高频重复子序列特征及判定结果。

四、项目目录结构

├── README.md
├── License
├── bpf.c(监控容器访问文件系统、使用系统调用)
├── grafana.txt(grafana配置文件)
├── main.py(接收eBPF程序数据并进行处理)
├── pr.py(Prometheus数据导出)
├── src/
│    ├── main.py(用于异常分析检测)
│    ├── teiresias.py(辅助函数)
│    ├── test.py  
│   
├── docs/
│  
├── logs/
│      ├── file_opne
│      ├── syscall
├── images/
关于
983.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

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