ebpf不仅可以用于网络数据包过滤和性能监控,还可以应用于安全领域,特别是在与 LSM(Linux Security Modules)结合使用时。通过 eBPF 和 LSM 的结合,可以实现更灵活和高效的安全策略,包括访问控制、安全审计和入侵检测等。
安全审计:
使用 eBPF 程序记录特定系统调用的审计日志。
SEC("lsm/file_open")
int BPF_PROG(audit_file_open, struct file *file) {
u32 uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;
bpf_printk("audit: UID %d opened file %s\n", uid, file->f_path.dentry->d_name.name);
return 0;
}
char LICENSE[] SEC("license") = "GPL";
入侵检测:
使用 eBPF 程序检测并记录特定系统调用的异常行为。
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/lsm_hooks.h>
#include <linux/cred.h>
#include <linux/sched.h>
SEC("lsm/bprm_check_security")
int BPF_PROG(detect_execve, struct linux_binprm *bprm) {
u32 uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;
// 检测未授权的二进制文件执行
if (uid != 0 && bpf_strncmp(bprm->filename, "/bin/authorized_binary", 21) != 0) {
bpf_printk("intrusion_detection: unauthorized execve by UID %d: %s\n", uid, bprm->filename);
return -EACCES; // 拒绝执行
}
return 0; // 允许执行
}
char LICENSE[] SEC("license") = "GPL";
访问控制
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/lsm_hooks.h>
#include <linux/cred.h>
#include <linux/fs.h>
SEC("lsm/inode_permission")
int BPF_PROG(access_control, struct inode *inode, int mask) {
u32 uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;
// 检查是否是特定用户(UID 1000)
if (uid == 1000) {
// 检查是否是 /secret 目录
char path[256];
bpf_d_path(&inode->i_dentry.first, path, sizeof(path));
if (__builtin_strncmp(path, "/secret", 7) == 0) {
bpf_printk("access_control: denying access to /secret for UID 1000\n");
return -EACCES; // 拒绝访问
}
}
return 0; // 允许访问
}
char LICENSE[] SEC("license") = "GPL";
支持的 LSM 钩子点:
以下是一些常见的 LSM 钩子点及其对应的 eBPF 段名:
文件和目录操作
- 文件打开
钩子点:file_open
段名:SEC("lsm/file_open") - 文件读取
钩子点:file_permission
段名:SEC("lsm/file_permission") - 文件写入
钩子点:file_permission
段名:SEC("lsm/file_permission") - 文件删除
钩子点:inode_unlink
段名:SEC("lsm/inode_unlink") - 目录创建
钩子点:inode_mkdir
段名:SEC("lsm/inode_mkdir")
进程管理 - 进程执行
钩子点:bprm_check_security
段名:SEC("lsm/bprm_check_security") - 进程 fork
钩子点:task_alloc
段名:SEC("lsm/task_alloc") - 进程退出
钩子点:task_free
段名:SEC("lsm/task_free")
网络操作 - socket 创建
钩子点:socket_create
段名:SEC("lsm/socket_create") - socket 连接
钩子点:socket_connect
段名:SEC("lsm/socket_connect") - socket 绑定
钩子点:socket_bind
段名:SEC("lsm/socket_bind")
内存管理 - 内存映射
钩子点:file_mmap
段名:SEC("lsm/file_mmap")
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。