基于CentOS73.10内核版本编译安装6.5内核并开启vmlinux
目的 编译安装6.x版本的内核,用于支持ebpf程序,开启/sys/kernel/btf/vmlinux 编译环境 CentOS Linux release 7.9.2009 (Core) 3.10.0-1160.el7.x86_64 编译环境准备 yum groupinstall "Development Tools" -y && \ yum install -y \ openssl-devel \ rpm-build \ dwarves \ redhat-rpm-config \ asciidoc \ hmaccalc \ perl-ExtUtils-Embed \ pesign \ xmlto \ audit-libs-devel \ binutils-devel \ elfutils-devel \ elfutils-libelf-devel \ ncurses-devel \ newt-devel \ numactl-devel \ pciutils-devel \ python-devel \ zlib-devel \ cmake \ scl-utils yum -y install centos-release-scl devtoolset-8-gcc* yum -y install python3 # 没有python3的需要安装一下,有的话忽略 仅在当前终端启用新版本GCC用于编译,不影响系统默认GCC版本 scl enable devtoolset-8 bash 编译安装git 编译内核会强制校验GIT仓库,此时会需要用到 git -C 指令,而yum源安装的git版本很低,不支持该参数,所以需要编译安装新版...
基于Linux3.10内核实现的写入保护和网络出口保护
概述 针对于Linux系统中用户权限分配混乱,以及不明原因的黑客提取root权限,危害到部分重要用户的数据, 实现了几种功能: 用户绑定写入目录 进程绑定写入目录 写入目录白名单 进程网络出口IP和端口控制 此文档仅作为备注,记录一下实现过程及部分细节和问题. 写入拦截的实现的两种方式 一:通过内核kprobe探测技术对 sys_write 函数插入探针拦截所有写入调用 static struct kprobe write_kprobe = { .symbol_name = "sys_write", }; 在探针函数内部实现以下流程: 获取 pt_regs *regs 寄存器的 di 也就是 sys_write 函数的第一个参数 fd 文件描述符, 通过文件描述符读取要写入的路径 通过 get_task_comm 函数从 current 中获取当前进程名进行规则比对. 仅允许 ** 绑定好关系的用户 / 白名单内的目录 / 进程绑定的目录 ** 执行写入操作, 其它操作全部拒绝 需要注意的是, 写入操作的拒绝不要通过在探针函数内 return 错误码来实现, 基本上内核是会炸的. 替代实现的方式可以将 sys_write 函数的 buffer 和 size 重置, 这样可以做到拒绝写入操作, 同时兼顾了内核的稳定性. void reset_buf_to_empty(struct pt_regs *regs) { regs->si = EMPTY_BUFF_PTR; regs->dx = 0; } 二:通过替换系统调用表,替换sys_write的函数指针指向自定的sys_write函数 asmlinkage long (*original_write)(unsigned int, const char __user *, size_t); // 存储原始的 sys_write 地址 asmlinkage long handler_sys_write(unsigned int fd, const char __user *buf, size_t count) { char path[MAX_PATH_LEN]; char* filepath = get_file_path(fd, path, MAX_PATH_LEN); int action = 0; // 文件路径获取失败则不处理 if (NULL == filepath) return original_write(fd, buf, count); // 排除一些系统本身需要使用的路径,加快处理速度减少竞争增加稳定性 if (1 == is_start_with(filepath, "/var/log/") || 1 == is_start_with(filepath, "/tmp/") ) return original_write(fd, buf, count); // 执行规则拦截逻辑 spin_lock(&config_lock); action = protect_rules_filter(filepath, current->comm); spin_unlock(&config_lock); if (PROCESS_ACTION_DENY == action) return -EPERM; return original_write(fd, buf, count); } 网络拦截的实现的几种方式 关于网络拦截部分一开始是想通过 netfilter, hook 到 NF_INET_POST_ROUTING 来实现....