eHIDS 一款基于eBPF的HIDS开源工具

一 前言IDS一般指入侵检测系统 。入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备 。
HIDS全称是Host-based Intrusion Detection System,即基于主机型入侵检测系统,部署在主机内的,主要是对主机的异常行为进行检测,比如新建文件,创建进程,连接等 。
二 eHIDS 介绍和使用2.1 eHIDS 基本介绍目前来说eHIDS只算是一个HIDS的雏形,很多功能还没有完成,但是因为我最近对eBPF比较感兴趣,这个是基于eBPF实现的,所以了解下 。
官方说明:

eBPF内核技术实现的HIDS . 功能实现:
TCP网络数据捕获
UDP网络数据捕获
uprobe方式的DNS信息捕获
进程数据捕获
uprobe方式实现JAVA的RASP命令执行场景事件捕获
eBPF的go框架实现,针对kprobeuprobe挂载方式,多类型event进行抽象实现 。
开发者只需要实现内核态C文件,用户态go文件,用户态event消息结构体三个文件即可,框架会自动加载执行 。
使用者可以按照logger的interface自行实现数据的上报处理,比如上报到ESkafka等日志中心 。网址: [ehids/ehids-agent: A linux Host-based Intrusion Detection System based on eBPF. (github.com)](
https://github.com/ehids/ehids-agent)
原理:
eHIDS 一款基于eBPF的HIDS开源工具

文章插图
 
运行在内核态用C写eBPF代码,llvm编译为eBPF字节码 。
用户态使用golang编写,cilium/ebpf纯go类库,做eBPF字节码的内核加载,kprobe/uprobe HOOK对应函数 。
用户态使用golang做事件读取、解码、处理 。
2.2 实践【eHIDS 一款基于eBPF的HIDS开源工具】git clone https://github.com/ehids/ehids-agent.gitcd ehidsmake./bin/ehids-agent编译的时候,会报错,报错原因是go-bindata无法下载,将go.sum的配置更改如下: 需要删除原来的go-bindata的配置,然后添加
github.com/shuLhan/go-bindata v4.0.0+incompatible h1:xD8LkuVZLV5OOn/IEuFdt6EEAW7deWiqgwaaSGhjAJc=github.com/shuLhan/go-bindata v4.0.0+incompatible/go.mod h1:pkcPAATLBDD2+SpAPnX5vEM90F7fcwHCvvLCMXcmw3g=eBPF的环境安装参考:
[[译]使用eBPF(绕过 TCP/IP)加速云原生应用程序的经验教训 – CFC4N的博客 (cnxct.com)](https://www.cnxct.com/lessons-using-ebpf-accelerating-cloud-native-zh/?f=github#i-3)运行:
root@ubuntu-lab:/home/miao/ehids-agent-modify# ./bin/ehids 2022/04/17 04:30:25 https://github.com/ehids/ehids-agent2022/04/17 04:30:25 process pid: 230692022/04/17 04:30:25 start to run EBPFProbeProc module2022/04/17 04:30:25 start to run EBPFProbeUDNS module2022/04/17 04:30:25 start to run EBPFProbeUJavaRASP module2022/04/17 04:30:25 start to run EBPFProbeUBash module2022/04/17 04:30:25 start to run EBPFProbeBPFCall module2022/04/17 04:30:25 start to run EBPFProbeKTCP module2022/04/17 04:30:25 start to run EBPFProbeKTCPSec module2022/04/17 04:30:25 start to run EBPFProbeKUDP module2022/04/17 04:30:25 HOOK binrayPath:/bin/bash, FunctionName:readline2022/04/17 04:30:25 target all process. 2022/04/17 04:30:26 process pid: 23069Xshell2022/04/17 04:54:33 probeName:EBPFProbeProc, probeTpye:kprobe,fork event,childpid:1, childtgid:23737,parentpid:23737, parenttgid:23721,grandparentpid:23720, grandparentgid:21960, cwd_level:0, comm:java, cmdline:javaMain, filepath:java, start_time:4026531838, uid:21960,gid:0,uts_ium:0,&{ID:8803 QR:1 Opcode:0 AA:0 TC:0 RD:1 RA:1 Z:0 RCODE:0 QDCOUNT:1 ANCOUNT:1 NSCOUNT:0 ARCOUNT:0}2022/04/17 04:56:19 probeName:EBPFProbeKUDP, probeTpye:kprobe, PID:0, comm:systemd-resolve, qname:www.baidu.com, qclass:1, qtype:28. qtype:QTypeCNAME, qinfo:[CNAME] :wwwashifencom. 2022/04/17 04:56:19 probeName:EBPFProbeKTCPSec, probeTpye:kprobe, start time:10:31:23, PID:912, UID:103, AF:2, TASK:5systemd-resolv&{ID:39561 QR:1 Opcode:0 AA:0 TC:0 RD:1 RA:1 Z:0 RCODE:0 QDCOUNT:1 ANCOUNT:0 NSCOUNT:0 ARCOUNT:0}2022/04/17 04:56:19 probeName:EBPFProbeKUDP, probeTpye:kprobe, PID:0, comm:systemd-resolve, qname:www.a.shifen.com, qclass:1, qtype:28. &{ID:55505 QR:1 Opcode:0 AA:0 TC:0 RD:1 RA:1 Z:0 RCODE:0 QDCOUNT:1 ANCOUNT:1 NSCOUNT:0 ARCOUNT:1}2022/04/17 04:56:19 probeName:EBPFProbeKUDP, probeTpye:kprobe, PID:0, comm:ping, qname:www.baidu.com, qclass:1, qtype:28. qtype:QTypeCNAME, qinfo:[CNAME] :wwwashifen. &{ID:14298 QR:1 Opcode:0 AA:0 TC:0 RD:1 RA:1 Z:0 RCODE:0 QDCOUNT:1 ANCOUNT:3 NSCOUNT:0 ARCOUNT:0}2022/04/17 04:56:19 probeName:EBPFProbeKUDP, probeTpye:kprobe, PID:0, comm:systemd-resolve, qname:www.baidu.com, qclass:1, qtype:1. qtype:QTypeCNAME, qinfo:[CNAME] :wwwashifen. qtype:QTypeA, qinfo:[A] :14.215.177.38. qtype:QTypeA, qinfo:[A] :14.215.177.39. &{ID:12746 QR:1 Opcode:0 AA:0 TC:0 RD:1 RA:1 Z:0 RCODE:0 QDCOUNT:1 ANCOUNT:3 NSCOUNT:0 ARCOUNT:1}2022/04/17 04:56:19 probeName:EBPFProbeKUDP, probeTpye:kprobe, PID:0, comm:ping, qname:www.baidu.com, qclass:1, qtype:1. qtype:QTypeCNAME, qinfo:[CNAME] :wwwashifen. qtype:QTypeA, qinfo:[A] :14.215.177.38. qtype:QTypeA, qinfo:[A] :14.215.177.39.


推荐阅读