動態

詳情 返回 返回

ebpf--入門06(lsm 應用場景) - 動態 詳情

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

Add a new 評論

Some HTML is okay.