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