首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >bpflock:基于eBPF实现的Linux设备安全审计工具

bpflock:基于eBPF实现的Linux设备安全审计工具

作者头像
FB客服
发布于 2023-03-30 11:24:43
发布于 2023-03-30 11:24:43
1.2K00
代码可运行
举报
文章被收录于专栏:FreeBufFreeBuf
运行总次数:0
代码可运行

 关于bpflock 

bpflock是一款基于eBPF驱动的Linux设备安全审计工具,该工具使用了eBPF来帮助广大研究人员增强Linux设备的安全性。通过限制对各种Linux功能的访问,bpflock能够减少攻击面并阻止一些众所周知的攻击技术。

bpflock只允许类似容器管理器、systemd和其他以主机PID或网络命名空间运行的容器/程序访问完整的Linux功能,并限制那些以自己命名空间运行的容器或程序。如果bpflock在受限配置文件下运行,则所有程序/容器(包括特权程序/容器)都将被拒绝访问。

除此之外,bpflock还可以通过各种安全功能来保护Linux设备安全,比如说Linux安全模块+BPF等等。

 功能介绍 

1、内存保护:内核镜像锁定、内核模块保护、BPF保护; 2、进程保护:无文件内存执行、命名空间保护; 3、硬件攻击测试:USB保护; 4、系统和应用程序跟踪:跟踪应用程序执行、跟踪特权系统操作; 5、文件系统保护:只读Root文件系统保护、sysfs保护; 6、网络保护;

 工具开发 

依赖组件

bpflock需要使用下列组件:

1、Linux内核版本 >= 5.13,相关配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CONFIG_BPF_SYSCALL=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_KPROBES=y
CONFIG_LSM="...,bpf"
CONFIG_BPF_LSM=y

2、一个启用了BTF的内核

启用BPF LSM支持

1、使用高级权限打开/etc/default/grub文件;

2、将下列内容添加到GRUB_CMDLINE_LINUX变量并保存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"lsm=lockdown,capability,yama,apparmor,bpf"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GRUB_CMDLINE_LINUX="lsm=lockdown,capability,yama,apparmor,bpf"

3、更新grub配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo update-grub2

4、重启设备

Docker使用

下列命令可以使用默认的配置文件运行工具:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host \
  --pid=host --privileged \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

无文件代码执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  -e "BPFLOCK_FILELESSLOCK_PROFILE=restricted" \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

内核模块执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  -e "BPFLOCK_KMODLOCK_PROFILE=restricted" \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

使用样例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo unshare -p -n -f
# modprobe xfs
modprobe: ERROR: could not insert 'xfs': Operation not permitted

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time="2022-02-07T06:50:25+01:00" level=info msg="event=syscall_execve tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=/usr/sbin/modprobe retval=0" bpfprog=execsnoop subsys=bpf


time="2022-02-07T06:50:25+01:00" level=info msg="event=lsm_kernel_read_file operation=loading module tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=xfs.ko retval=-1 reason=denied (restricted)" bpfprog=kmodlock subsys=bpf

内核镜像锁定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  -e "BPFLOCK_KIMGLOCK_PROFILE=baseline" \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

使用样例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo unshare -f -p -n bash
# head -c 1 /dev/mem
head: cannot open '/dev/mem' for reading: Operation not permitted

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time="2022-02-07T06:57:22+01:00" level=info msg="event=syscall_execve tgid=52428 pid=52428 ppid=52288 uid=0 cgroupid=7014 comm=head pcomm=bash filename=/usr/bin/head retval=0" bpfprog=execsnoop subsys=bpf


time="2022-02-07T06:57:22+01:00" level=info msg="event=lsm_locked_down operation=/dev/mem,kmem,port tgid=52428 pid=52428 ppid=52288 uid=0 cgroupid=7014 comm=head pcomm=bash retval=-1 reason=denied (baseline)" bpfprog=kimglock subsys=bpf

BPF保护

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  -e "BPFLOCK_BPFRESTRICT_PROFILE=baseline" \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

使用样例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo unshare -f -p -n bash
# bpftool prog
Error: can't get next program: Operation not permitted

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time="2022-02-04T15:40:56Z" level=info msg="event=lsm_bpf tgid=2378 pid=2378 ppid=2364 uid=0 cgroupid=9458 comm=bpftool pcomm=bash filename= retval=-1 reason=baseline" bpfprog=bpfrestrict subsys=bpf


time="2022-02-04T15:40:56Z" level=info msg="event=lsm_bpf tgid=2378 pid=2378 ppid=2364 uid=0 cgroupid=9458 comm=bpftool pcomm=bash filename= retval=-1 reason=baseline" bpfprog=bpfrestrict subsys=bpf

 工具配置&环境配置 

假设你项目的bpflock目录中已经包含了 bpflock.yaml和bpf.d这两个配置文件了,接下来运行下列命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ls bpflock/
  bpf.d  bpflock.d  bpflock.yaml
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  -v $(pwd)/bpflock/:/etc/bpflock \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

我们也可以使用“--env-file”命令来传递环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
  --env-file bpflock.env.list \
  -v /sys/kernel/:/sys/kernel/ \
  -v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock

许可证协议

本项目的开发与发布遵循Apache-2.0开源许可证协议。

项目地址

https://github.com/linux-lock/bpflock

参考资料

https://ebpf.io/

https://man7.org/linux/man-pages/man7/namespaces.7.html

https://docs.kernel.org/bpf/prog_lsm.html

https://github.com/linux-lock/bpflock/tree/main/deploy/configs/

https://github.com/linux-lock/bpflock/tree/main/docs/

https://github.com/linux-lock/bpflock/tree/main/docs/memory-protections.md#3-bpf-protection

https://github.com/libbpf/bpftool

https://go.dev/doc/install

https://docs.docker.com/develop/develop-images/build_enhancements/

精彩推荐

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
eBPF 入门实践指南七:捕获进程执行/退出时间,通过 perf event array 向用户态打印输出
eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。
云微
2023/02/24
4880
eBPF 入门实践教程七:捕获进程执行/退出时间,通过 perf event array 向用户态打印输出
eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。
云微
2023/08/14
7210
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2024/01/17
8490
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
eBPF学习 – 入门
BPF是Berkeley Packet Filter(伯克利数据包过滤器)得缩写,诞生于1992年,其作用是提升网络包过滤工具得性能,并于2014年正式并入Linux内核主线。 BPF提供一种在各种内核事件和应用程序事件发生时允许运行一小段程序的机制,使得内核完全可编程,允许用户定制和控制他们的系统以解决相应的问题。 BPF是一项灵活而高效的技术,由指令集、存储对象和辅助函数等几部分组成。其采用了虚拟指令集规范,运行时BPF模块提供两个执行机制:解释器和即时编译器(JIT)。在实际执行前,BPF指令必须通过验证器(verifer)的安全性检查以确保BPF程序自身不会崩溃或者损坏内核。 扩展后的BPF通常缩写为eBPF,但是官方的说法仍然是BPF,并且内核中也只有一个执行引擎即BPF(扩展后的BPF)。
全栈程序员站长
2022/11/08
1.2K0
eBPF学习 – 入门
eBPF编程入门与工具使用
将 eBPF 程序附加到跟踪点以及内核和用户应用探针点的能力,使得应用程序和系统本身的运行时行为具有前所未有的可见性。通过赋予应用程序和系统两方面的检测能力,可以将两种视图结合起来,从而获得强大而独特的洞察力来排除系统性能问题。
五分钟学SRE
2023/11/26
9950
eBPF编程入门与工具使用
技术实践 | 如何用 libbpf 来开发一个 eBPF 程序
使用 libbpf 开发 eBPF 程序分为两部分:第一,内核态的 eBPF 程序;第二,用户态的加载、挂载、映射读取以及输出程序等。
穿过生命散发芬芳
2025/07/25
2280
eunomia-bpf 0.3.0 发布:只需编写内核态代码,轻松构建、打包、发布完整的 eBPF 应用
eBPF 源于 BPF,本质上是处于内核中的一个高效与灵活的虚拟机组件,以一种安全的方式在许多内核 hook 点执行字节码,开发者可基于 eBPF 开发性能分析工具、软件定义网络、安全等诸多场景。但是,目前对于开发和使用 eBPF 应用而言还可能存在一些不够方便的地方:
云微
2023/02/24
6810
在 WebAssembly 中使用 C/C++ 和 libbpf 编写 eBPF 程序
eBPF(extended Berkeley Packet Filter)是一种高性能的内核虚拟机,可以运行在内核空间中,用来收集系统和网络信息。随着计算机技术的不断发展,eBPF 的功能日益强大,进而被用来构建各种效率高效的在线诊断和跟踪系统,以及安全的网络和服务网格。
云微
2023/02/12
7150
在 WebAssembly 中使用 C/C++ 和 libbpf 编写 eBPF 程序
如何利用eBPF程序监控Kubernetes
对 Kubernetes 集群进行监控对于确保容器化应用程序的健康、性能和可靠性至关重要。Kubernetes 提供了强大的监控工具套件和集成,但是当您需要深入内核和网络级别的复杂性时,eBPF(扩展的伯克利包过滤器)就成为了无价的资源。在本文中,我们将探索惊人的 eBPF 功能,以及如何利用它提升 Kubernetes 监控策略。
云云众生s
2024/03/28
3490
如何利用eBPF程序监控Kubernetes
三分钟学会编写 eBPF 程序:使用 eBPF 程序监控打开文件路径并使用 Prometheus 可视化
通过对 open 系统调用的监测,opensnoop可以展现系统内所有调用了 open 系统调用的进程信息。
云微
2023/02/24
1.1K0
三分钟学会编写 eBPF 程序:使用 eBPF 程序监控打开文件路径并使用 Prometheus 可视化
原创Paper | 在 Android 中开发 eBPF 程序学习总结(一)
其实是想学习一下ecapture是怎么实现的,但是实际在我xiaomi 10手机上测试的过程中(已经有root权限)发现,并没办法运行,因为ecapture需要内核开启CONFIG_DEBUG_INFO_BTF,这个配置信息可以通过/proc/config.gz中来查看是否开启。
Seebug漏洞平台
2023/01/05
2.4K0
测试用 - 4.使用eBPF逃逸容器技术分析与实践
容器安全是一个庞大且牵涉极广的话题,而容器的安全隔离往往是一套纵深防御的体系,牵扯到 AppArmor、Namespace、Capabilities、Cgroup、Seccomp 等多项内核技术和特性,但安全却是一处薄弱则全盘皆输的局面,一个新的内核特性可能就会让看似无懈可击的防线存在突破口。随着云原生技术的快速发展,越来越多的容器运行时组件在新版本中会默认配置 AppArmor 策略,原本我们在《红蓝对抗中的云原生漏洞挖掘及利用实录》介绍的多种容器逃逸手法会逐渐失效;因此我们希望能碰撞出一些攻击手法,进而突破新版本容器环境的安全能力,并使用更契合容器集群的新方式把 “任意文件写” 转化为“远程代码执行”,从而提前布防新战场。
用户3830325
2022/12/20
8560
eBPF 开发实践:使用 eBPF 隐藏进程或文件信息
eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。
云微
2023/08/14
7550
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
在Kubernetes生产环境中,我们曾遇到一个典型故障:某Node上的Pod间歇性无法访问Service,但tcpdump和kubectl describe endpoints均未显示异常。最终发现是CNI插件的ARP表溢出导致,这个案例暴露了传统工具的三大缺陷:
大熊计算机
2025/07/15
1500
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
eunomia-bpf: 让 eBPF 程序的开发和部署尽可能简单
传统来说, eBPF 的开发方式主要有 BCC、libbpf 等方式。要完成一个 BPF 二进制程序的开发,需要搭建开发编译环境,要关注目标系统的内核版本情况,需要掌握从 BPF 内核态到用户态程序的编写,以及如何加载、绑定至对应的 HOOK 点等待事件触发,最后再对输出的日志及数据进行处理。
云微
2023/02/24
8940
eunomia-bpf: 让 eBPF 程序的开发和部署尽可能简单
Linux探测工具BCC(网络)
首先看下促使我学习bcc的这篇文章中的程序traceicmpsoftirq.py,使用该程序的本意是找出对ping响应的进程位于哪个CPU core上,然后使用perf扫描该core,找出造成网络延迟的原因。源码如下:
charlieroro
2020/07/13
2.8K0
eBPF入门与实践:深入解析Linux系统的可观测引擎
在Linux系统中,内核是“操作系统的核心”,负责管理硬件资源、进程调度、网络交互等核心功能。但长期以来,内核的可编程性一直是个难题——如果想自定义内核行为(比如监控进程、过滤网络包),传统方式要么依赖内核模块(风险高、兼容性差,内核模块加载后拥有与内核相同的权限,错误的代码可能导致系统崩溃或安全漏洞。),要么只能修改内核源码重新编译(成本极高)。
宅蓝三木
2025/08/18
3630
【eBPF笔记中篇】运行原理、交互、event触发 解析(未完)
从之前的分析已经得知,.c的eBPF程序会通过BCC等工具编译并加载到内核中,但是具体在内核中,ebpf是如何工作的呢?
历久尝新
2022/02/15
3.7K0
【eBPF笔记中篇】运行原理、交互、event触发 解析(未完)
搭建centos7 ebpf编译环境
安装的是 devtoolset-7 和 devtoolset-8, 安装完成后全部文件在/opt/rh目录下:
cdh
2024/01/03
1.7K0
基于ebpf的性能工具-bpftrace
在现代计算机系统中,了解系统的内部运行情况对于诊断问题、优化性能以及进行安全监控至关重要。bpftrace作为一款强大的跟踪工具,为开发人员和系统管理员提供了一种独特的方式来监视和分析Linux系统的内部运行。本文描述bpftrace的原理和使用。
Rice加饭
2023/09/02
1.1K0
基于ebpf的性能工具-bpftrace
推荐阅读
相关推荐
eBPF 入门实践指南七:捕获进程执行/退出时间,通过 perf event array 向用户态打印输出
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档