
關於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,相關配置如下:
CONFIG_BPF_SYSCALL=yCONFIG_DEBUG_INFO=yCONFIG_DEBUG_INFO_BTF=yCONFIG_KPROBES=yCONFIG_LSM="...,bpf"CONFIG_BPF_LSM=y2、一個啟用了BTF的內核
啟用BPFLSM支持
1、使用高級權限打開/etc/default/grub文件;
2、將下列內容添加到GRUB_CMDLINE_LINUX變量並保存:
"lsm=lockdown,capability,yama,apparmor,bpf"或
GRUB_CMDLINE_LINUX="lsm=lockdown,capability,yama,apparmor,bpf"3、更新grub配置:
4、重啟設備
Docker使用
下列命令可以使用默認的配置文件運行工具:
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無文件代碼執行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內核模塊執行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
使用樣例:
$ sudo unshare -p -n -f# modprobe xfsmodprobe: ERROR: could not insert 'xfs': Operation not permitted輸出結果:
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=bpftime="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內核鏡像鎖定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
使用樣例:
$ sudo unshare -f -p -n bash# head -c 1 /dev/memhead: cannot open '/dev/mem' for reading: Operation not permitted輸出結果:
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=bpftime="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=bpfBPF保護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
使用樣例:
$ sudo unshare -f -p -n bash# bpftool progError: can't get next program: Operation not permitted輸出結果:
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=bpftime="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這兩個配置文件了,接下來運行下列命令:
ls bpflock/ bpf.d bpflock.d bpflock.yamldocker 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」命令來傳遞環境變量:
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/