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")

putao
8 声望1 粉丝

推动世界向前发展,改善民生。