eBpf技术总结

一、 ebpf基本原理

eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,其在内核中的实现为一个基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,运行本地即时编译(JIT)的 “BPF 程序, 并能访问内核功能和内存的一个子集。
在这里插入图片描述参考链接:探索eBPF:Linux内核的黑科技
eBPF 是一个在内核中运行的虚拟机,它所有的接口都是通过 BPF 系统调用来跟内核进行交互,eBPF 程序通过 LVM 和 Cline 进行编译,产生 eBPF 的字节码,通过 BPF 系统调用,加载到内核,验证代码的安全性,从而通过 JIT 实时的转化成 Native 的 X86 的指令。很多架构 (x86-64, SPARC, PowerPC, ARM, arm64, MIPS, and s390)已经支持即时(JIT)编译。
在这里插入图片描述对eBPF来说,是通过特定的Hook点监听内核中的特定事件,进而执行用户定义的处理。这些Hook点包括:

  1. 静态tracepoint
  2. 动态内核态探针(Dynamic Kernel probes)
  3. 动态用户态探针(Dynamic User Probes)
  4. 其他hook点

针对主要是监控、跟踪使用的eBPF应用来说,主要通过这种方式取得内核运行时的一些参数和统计信息。
参考链接:
ebpf深入理解和应用介绍
Kernel调试追踪技术之 eBPF on ARM64

eBpf对内核配置的依赖:
CONFIG_DEBUG_INFO_BTF=y
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_CLS_ACT=y
CONFIG_BPF_JIT=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y

二、 Kprobes原理

kprobes Kretprobes是linux系统的一个动态调试机制,使用它可以向内核添加探针(Probe),在代码执行前或执行后触发一个回调函数。这个机制通常用于调试内核代码,跟踪应用程序执行或收集性能统计信息。通过使用kprobe,开发人员可以在不影响系统运行逻辑的情况下,对操作系统进行深入的分析和调试。
它的基本工作机制是:用户指定一个探測点。并把一个用户定义的处理函数关联到该探測点。当内核运行到该探測点时,对应的关联函数被运行。然后继续运行正常的代码路径。
参考链接:https://zhuanlan.zhihu.com/p/645909745

三、 Bpf与kprobes的关系

根据BPF程序的主要目的,可以将其分为两类。一类是跟踪,一类是网络。
BPF kprobe程序类型允许使用BPF程序作为kprobe的处理程序,当被检测内核函数触发时,执行BPF程序,程序类型被定义为BPF_PROG_TYPE_KPROBE。kprobe 是动态附加到内核调用点的函数,编写附加到kprobe模块上的BPF程序时,需要确定BPF程序的执行时机,也就是确定BPF程序是在内核函数调用开始时执行,还是内核函数调用结束返回时执行。
如果是在内核函数调用开始时执行BPF程序,我们可以设置BPF程序的SEC为:
SEC(“kprobe/内核函数”)
如果是在内核函数调用结束返回时执行BPF程序,我们可以设置BPF程序的SEC为:
SEC(“kretprobe/内核函数”)
参考链接:https://blog.csdn.net/qq_34258344/article/details/114522060

四、 ebpf与lsm

在 Linux 5.7 引入 BPF LSM 后,系统开发人员已经能够自由地实现函数粒度的安全检查能力,可通过SEC(“lsm/socket_connect”)的方式对lsm函数进行挂载。

使用ebpf的lsm前提条件

  1. 内核版本高于5.7
  2. 确认CONFIG_BPF_LSM=y时开启状态,使用命令:cat /boot/config-$(uname -r) | grep BPF_LSM
  3. 确认cat /sys/kernel/security/lsm是否支持bfp,如果没有需要修改/etc/default/grub是能bpf;通过update-grub2更新后重启系统。

Demo ebpf-lsm

在这里插入图片描述

程序主要功能为通过lsm的socket_connect接口,实现禁止链接IP:1.1.1.1

  • 编译:$ ecc lsm-connect.bpf.c
  • 运行:sudo ecli run package.json
  • 测试:
    $ ping 1.1.1.1
    ping: connect: Operation not permitted

参考链接:
eBPF 入门实践教程:使用 LSM 进行安全检测防御

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值