Skip to content
This repository has been archived by the owner on Jul 5, 2023. It is now read-only.
LANTHORA edited this page Sep 30, 2022 · 14 revisions

主机入侵检测与防御系统

缘起

开源社区有类似的产品, 实现方案也大体一致, 如果仅仅是为了达成某项需求, 没必要再造轮子. 我的初衷是学习内核相关的技术, 个人认为没有什么方法比做一个出来更能验证学习成果.

最初的提交非常简陋, 在内核模块加载和移除时打印日志, 这大概是每个学习内核的人, 动手写的第一段代码. 如果你对内核感兴趣却不知道从那里开始, 那么这就是一个很好的开始.

名称的由来

在最初的提交中就确定项目名为 hackernel, 这是 hack 和 kernel 的组合拼写. 关于 hack 的定义可以参考维基百科. 项目实现过程中采用一些非常规的手段对内核数据进行修改. 因此 hackernel 是个符合项目的特点的名称.

核心功能

预期效果

审计操作系统中正在发生的敏感行为,并根据情况进行阻止.

实现原理

本项目的内核模块提供的是核心功能,上层应用可以组合核心功能以达到不同的效果.

原理上: 1.通过修改系统调用表, 将系统调用修改为自定义的 hook 函数, 根据入参决定是否调用真实的系统调用; 2.使用内核提供的 hook 函数, 如网络相关的 netfilter hook 点.

hook 函数有能力决定是否向下层调用. 允许向下调用并记录行为为检测,根据策略禁止向下调用为防御. 也就契合了标题中的检测与防御系统.

多层封装

第一层封装

核心功能部分即内核态中提到的策略, 总归要来自用户态, 标题中的入侵行为也由用户态定义. 因此实现一个用户态的进程, 让它与内核模块作为一层封装, 通过 Unix Domain Socket 对外提供 API.

上面提到的功能由 hackernel 项目实现.

第二层封装

第一层封装相比于直接与内核模块通信, 降低了门槛, 但依旧不够友好. 于是有了第二层封装: 通过 Go 把这些第一层 API 封装成函数以方便开发者调用.

敏感的朋友可能已经发现: 第二层封装本质上是作为客户端使用第一层封装提供的服务, 同时又作为服务被其他应用调用.

为了解耦和方便扩展, 选择用 Go 实现并独立维护 Uranus 项目. 最初技术选型时: 考虑到 Java 运行需要独立的虚拟机, 过于臃肿; Python 也有与 Java 相似的问题, 同时曾经做过的 Python 项目告诉我, 库和语言的版本迭代会让稳定运行两年的服务崩溃; C/C++ 难度较大, 且第一层封装的目的就是为了避开这两个语言; 最后可选的语言只有 Go 和 Rust, 而 Go 刚好有我需要的库, 于是选用了 Go.

此时项目就需要一个名字, 当时 海贼王 三大古代兵器只有天王乌拉诺斯的还没有揭晓, 于是选择了它.

应用

显然第二层封装是库, 于是在第二层封装之上, 实现了三个应用作为给最终用户使用的产品.

示例程序

示例程序 uranus-sample, 展示库的使用方法, 验证底层模块是否正常工作.

Telegram 机器人

uranus-telegram 通过 Telegram Bot 上报系统中正在发生的进程创建事件. 监控入侵事件. 这是相对成熟的应用, 目前部署在我的生产环境中.

网页应用

uranus-web 以网页的形式展示功能.目前后端工作已经基本完成. 前端 Venus 尚不可用. 现在非常希望有对本项目感兴趣且有能力进行前端开发的朋友加入, 完成这部分功能. 我们通过 Postman 维护 API, 并提供了一个可以用于调试的后端环境. 在选择前端项目名时, 发现 Uranus 是罗马神话的神, 罗马神话里维纳斯可能是最合适的选择.

安装

罗马神话中的创造之母 Tellus是专门为了方便安装而存在的项目. 也就是本 Wiki 所在的项目.

安装前需要确认有足够正常的网络环境.

手动安装

执行以下命令,出现问题解决问题直到成功.如果出现无法解决的问题欢迎提 issue.

make
make install

Arch Linux

对于 Arch Linux 用户,提供 AUR 方式安装.使用 yay 或者任何你喜欢的 AUR Helper.

yay -S tellus-git

Gentoo

对于 Gentoo 用户,可以添加 overlay

eselect repository enable ArchFeh
emerge --sync
emerge -a tellus

运行

  1. 安装完成后重启系统或手动加载内核模块 hackernel.
  2. 启动服务 hackernel.service
  3. 运行测试程序 uranus-sample
  4. 修改对应配置后运行 uranus-telegram.service 或 uranus-web.service