Skip to content

Daily Plan

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

#todo

  • [ ]
  • [ ]

Daily Study

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

基于eBPF的容器异常检测Agent

设计背景

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

网络与系统安全 云原生时代(Cloud-Native Era)是近年来随着云计算技术的普及和发展而兴起的。随着企业和开发者越来越多地采用云原生架构和技术,如容器化(Containers)、微服务架构(Microservices)等,软件开发和部署的方式发生了显著的变革。但是,系统的复杂性和分布式特点也带来了巨大的挑战。主要存在两方面挑战:

  1. 安全性挑战:随着应用程序和服务越来越多地部署在云端,保护这些资源免受攻击变得尤为重要。云原生环境的安全策略需要不断更新,以应对新出现的威胁。
  2. 管理性挑战:云原生应用往往运行在分布式环境中,由多个不同的微服务、数据库、第三方API等组成,云原生环境需要有效管理大量的微服务,确保它们之间的有效通信和协同工作 在云原生时代,系统的复杂性和分布式特点带来了巨大的挑战,而可观测性已经成为运维和开发人员确保系统可靠性和性能的关键手段。通过先进的可观测性工具,团队能够更好地了解系统的运行状态,快速定位问题并优化系统性能。

项目目标

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

本Agent云原生监控观测工具旨在解决云原生观测中的典型问题: 架构监控和整合难:微服务架构导致监控和故障排查困难,传统工具整合应用和基础架构指标较为困难。 数据分析和处理差:Kubernetes等环境中数据量大,分析效果差,传统工具处理数据一致性和故障转移的能力差。 资源响应和集成弱:普通开源监控工具在处理大规模集群会遇到性能瓶颈,对资源响应与集成能力较弱。

理论支撑

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

团队长期聚焦在终端异常检测方向,具备一定技术积累。本项目使用到的异常检测方法是基于终端自适应画像的异常检测技术在容器工作负载和eBPF采集技术上的扩展,该技术目前已适配linux和windows平台,相关成果发表在领域顶级会议。首先从工业界实际场景应用的角度识别出现有异常检测工具客户端占用高、告警数量和图规模难以平衡以及服务端内存占用高的三大技术瓶颈,该工作发表在ACM CCS 2023[1](CCF-A类 信息安全顶级会议)。其次,团队在国际上首次提出通过分布式架构设计,解决了终端溯源图检测成本高的难题,系统中有机结合了全局模型、告警聚合、告警语义相似和告警打分和大模型等方法的告警过滤方法,突破了异常检测方法面临的告警疲劳问题,该工作发表在USENIX Security 2023[2](CCF-A类 信息安全顶级会议)和NDSS 2024[3](CCF-A类 信息安全顶级会议).

基于终端自适应画像的异常检测技术不仅获得学术界认可,也在实际场景中得到广泛的应用,产生较大价值。原型系统在1130台实验室终端集群上检测效果不低于现有方法的情况下,检测成本降低56倍,在某企业2w+台终端上检测出900+真实攻击。告警降噪技术在国内某头部家电和某头部物流企业真实告警数据上达到95%以上的降噪率和99%以上的降噪准确率。相关技术以《基于自适应画像的异构终端安全检测技术》入选华为OpenHarmony TSC年度课题,并进行汇报。

[1] Are we there yet? An Industrial Viewpoint on Provenance-based Endpoint Detection and Response Tools[C]. The 30th ACM Conference on Computer and Communications Security (CCS) (ACM CCS 2023, CCF-A 信息安全四大顶会)

[2] DISTDET: A Cost-Effective Distributed Cyber Threat Detection System[C]. Proceedings of The 32th USENIX Security Symposium (USENIX Security 2023, CCF-A 信息安全四大顶会)

[3] NODLINK: An Online System for Fine-Grained APT Attack Detection and Investigation Network and Distributed System Security (NDSS) Symposium 2024(NDSS 2024, CCF-A 信息安全四大顶会)

系统设计

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

设计优势

Agent是一个基于eBPF的轻量级高性能云原生监控程序,使用C/C++开发,旨在提供全生命周期监控解决方案。 架构可扩展与可兼容:提供网络API,核心框架高度可扩展。支持多种ebpf追踪点,架构兼容性显著提升。 数据可视化与轻量即用:拥有网络可视化、安全告警、一键部署功能。静态编译二进制仅60MB,单一二进制或镜像分发,支持多种输出格式。 资源集成与性能优化:可集成Prometheus和Grafana资源。通过eBPF自动收集容器和k8s元信息进行性能优化。

功能亮点

热更新:允许在不中断服务的情况下,动态地通过网络接口 API 启停特定的 ebpf 跟踪器。 可扩展:核心框架高度模块化可扩展,提高了系统的灵活性,还降低了维护升级的复杂性,可以轻松接入其他的 ebpf 程序。 轻量化:避免了复杂环境配置,能够在极小的内存占用下启动。 高性能:在内核层面实现数据过滤、聚合等工作,减少了向用户空间发送的数据量。系统采用C/C++编写,CPU使用率不超过5%

技术栈

BCC是一个用于创建高效的内核追踪和操作程序的工具包,包括多个有用的工具和示例。它利用了扩展的 BPF(Berkeley Packet Filters),正式称为 eBPF,这是首次添加到 Linux 3.15 中的一个新特性。BCC 使用的许多功能需要 Linux 4.1 及更高版本。 libbpf是一个专注于 BPF(Berkeley Packet Filter)程序开发的库,它提供了一套易于使用的 API 来编译、加载、操作及管理内核中的 BPF 对象。这个项目是构建在 Linux 系统上使用 BPF 技术的核心组件,适用于性能监控、网络过滤、系统跟踪等多种场景。 Prometheus作为生态圈 Cloud Native Computing Foundation(简称:CNCF)中的重要一员,其活跃度仅次于 Kubernetes, 现已广泛用于 Kubernetes 集群的监控系统中。 eunomia是一个使用 C/C++ 开发的基于 eBPF的轻量级,高性能云原生监控工具框架,旨在帮助用户了解容器的各项行为、监控可疑的容器安全事件,力求提供覆盖容器全生命周期的轻量级开源监控解决方案。

功能框架

云原生监控系统分为四个核心层次:展示层、告警层、采集层和容器层。

  • 展示层:负责前端展示和前后端通信。
  • 告警层:负责处理告警和分析系统行为。
  • 采集层:采集数据并统一数据格式。
  • 容器层:监控容器环境和实现自动化部署。 ![[attachments/Pasted image 20250404162309.png]]

功能实现

白应用识别方案简述: (1)白应用的特征提取:比如文件的所有者,文件的签名信息,文件的威胁情报信息,进程的行为信息,进程的活跃程度等特征 (2)分类阶段:根据提取到的特征对文件是否属于白应用进行置信度评估(打分),生成本地应用白名单 (3)本地白名单共享:共享各个agent的应用白名单,利用投票机制生成全局白名单 ![[attachments/Pasted image 20250404164320.png]] 数据检测方案是基于终端自适应画像的异常检测技术,将数据抽象为图结构进行存储和匹配,然后再进行相应的采集,管理与告警。如图4所示: ![[attachments/1743756593141_d.png]]

安装编译指南

配置要求

在编译之前,确保您的 Kconfig 包含以下选项:

CONFIG_DEBUG_INFO_BTF=y 
CONFIG_DEBUG_INFO=y

建议的内核版本为 5.10 或更高。如果使用较旧的内核版本,可能需要安装额外的 BTF 信息。

使用预编译的二进制文件

您可以使用我们预编译的二进制文件(请参见最新发布版本)来启动 Agent 服务器:

sudo ./agent server

此命令将启用核心 eBPF 跟踪器,包括进程、TCP 和文件,同时启动安全引擎以检测潜在的安全问题。

您也可以使用 Agent 运行单个 eBPF 跟踪器,例如:

sudo ./agent run files

该命令将在默认间隔 3 秒内跟踪系统中所有文件的读取或写入,并输出结果:

[2024-08-02 14:15:11.688] [info] start agent...
[2024-08-02 14:15:11.688] [info] start ebpf tracker...
[2024-08-02 14:15:11.688] [info] start prometheus server...
[2024-08-02 14:15:11.688] [info] press 'Ctrl C' key to exit...
[2024-08-04 16:22:30.123] [info] pid    container_name reads  writes read_bytes write_bytes type   comm         filename
[2024-08-04 16:22:30.123] [info] 142326 ubuntu          0      1          0          1      R      postgres     oom_score_adj
[2024-08-04 16:22:30.123] [info]   5824 ubuntu          1      0         16          0      R      code         state.vscdb
[2024-08-04 16:22:30.123] [info]   5453 ubuntu          1      0         16          0      R      grafana-server grafana.db
[2024-08-04 16:22:30.123] [info] 142327 ubuntu          1      0         18          0      R      git          .gitignore
[2024-08-04 16:22:30.123] [info] 142327 ubuntu          1      0         18          0      R      git          .gitignore
[2024-08-04 16:22:30.123] [info] 142327 ubuntu          1      0         18          0      R      git          .gitignore
[2024-08-04 16:22:30.123] [info]   5824 ubuntu          1      1          8         12      R      code         state.vscdb-journal

在Linux上编译

请按照以下步骤安装和设置Agent项目:

  1. 克隆仓库:
# 使用docker进行部署
docker build -t agent-test .
docker run -it --rm agent-test /bin/bash

# code init
git clone https://gitlink.org.cn/p4zt3ZfhkI/jyedrqycjc.git && cd jyedrqycjc
git submodule update --init --recursive

# gitlink的子模块貌似无法更新 请自行去子目录更新
  1. 编译部署Agent:
# dependencies
make install-deps

# bpf headers
make generate-tools

# cmake configure
CC=gcc-10 CXX=g++-10 cmake -Bbuild -Dagent_ENABLE_UNIT_TESTING=0 -Dagent_USE_GTEST=0

# 首先创建一个名为 build/libbpf/ 的目录,然后将 bpftools/process/.output/libbpf/ 目录中的 libbpf.a 文件复制到新创建的目录中
mkdir -p build/libbpf/ && cp bpftools/process/.output/libbpf/libbpf.a build/libbpf/libbpf.a

# 在指定的 build 目录中构建项目
cmake --build build --config Release

使用 Docker 部署 Prometheus 和 Grafana

快速启动

  1. 构建并运行Agent Docker镜像:
sudo docker build -t agent:v0.1 .
sudo docker run agent:v0.1

部署 Prometheus

  1. 拉取 Prometheus 镜像:
sudo docker pull prom/prometheus
  1. 配置 Prometheus:
cp ./prometheus.yml /etc/prometheus/prometheus.yml
  1. 运行 Prometheus 容器:
sudo docker run -d --user root -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/prometheus/data:/data/prometheus prom/prometheus --config.file="/etc/prometheus/prometheus.yml" --web.listen-address="0.0.0.0:9090"

部署 Grafana

  1. 拉取 Grafana 镜像:
sudo docker pull grafana/grafana:latest
  1. 运行 Grafana 容器:
sudo docker run -d -p 3000:3000 --name=grafana grafana/grafana:latest
# or on ubuntu
sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.5.4_amd64.deb
sudo dpkg -i grafana-enterprise_8.5.4_amd64.deb
sudo /bin/systemctl start grafana-server

Daily Problem

更新: 5/3/2025 字数: 0 字 时长: 0 分钟

菜就多练

本站访客数 人次 本站总访问量