您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

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

时间:2022-04-18 11:14:52  来源:  作者:码农世界

一 前言

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 实践

git clone https://github.com/ehids/ehids-agent.git
cd ehids
make
./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-agent
2022/04/17 04:30:25 process pid: 23069
2022/04/17 04:30:25 start to run EBPFProbeProc module
2022/04/17 04:30:25 start to run EBPFProbeUDNS module
2022/04/17 04:30:25 start to run EBPFProbeUJavaRASP module
2022/04/17 04:30:25 start to run EBPFProbeUBash module
2022/04/17 04:30:25 start to run EBPFProbeBPFCall module
2022/04/17 04:30:25 start to run EBPFProbeKTCP module
2022/04/17 04:30:25 start to run EBPFProbeKTCPSec module
2022/04/17 04:30:25 start to run EBPFProbeKUDP module
2022/04/17 04:30:25 HOOK binrayPath:/bin/bash, FunctionName:readline
2022/04/17 04:30:25 target all process. 
2022/04/17 04:30:26 process pid: 23069
Xshell2022/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. 


可以看到它加载了几个插件,来实现上述功能,运行时候,捕获进程数据、UDP数据、DNS的信息,以及监控到的java运行程序信息等,并打印,当然可以自己方便扩展。

三 处理流程

3.1 流程处理说明

为了看懂代码,特意学习了下golang,大概对流程有了了解, 启动点是main.go 核心代码,加载各个模块代码,进行初始化和运行:

 for k, module := range user.GetModules() {
  if module.Name() != "EBPFProbeBPFCall" {
   //continue //模块启用临时开关
  }

  logger.Printf("start to run %s module", k)
  //初始化
  err := module.Init(ctx, logger)
  if err != nil {
   panic(err)
  }

  // 加载ebpf,挂载到hook点上,开始监听
  go func(module user.IModule) {
   err := module.Run()
   if err != nil {
    logger.Fatalf("%v", err)
   }
  }(module)
 }

每个功能以一个模块的形式来运行,module是定义的一组接口,如下

type IModule interface {
 // Init 初始化
 Init(context.Context, *log.Logger) error
 // Name 获取当前module的名字
 Name() string
 // Run 事件监听感知
 Run() error
 // Start 启动模块
 Start() error
 // Stop 停止模块
 Stop() error
 // Close 关闭退出
 Close() error
 SetChild(module IModule)
 Decode(*ebpf.Map, []byte) (string, error)
 Events() []*ebpf.Map
 DecodeFun(p *ebpf.Map) (IEventStruct, bool)
}

在user的目录下的imodule.go代码文件中定义,里面定义了相关方法的基本实现。 然后各个模块把自己注册到全局的map中,Go语言比较有意思map的定义比较奇葩,如下:

var modules = make(map[string]IModule)

以string作为key,IModule作为value的map 变量modules,通过开放函数:

func GetModules() map[string]IModule {
 return modules
}

返回。 核心模块的类(结构体)的类图如下:

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

 

运行的整体流程

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

 

  1. 将c代码开发的proc_kern.c等ebpf程序,通过LLVM编译成 ebuf的byte code 字节码;
  2. 利用go-bindata 将字节码文件转成go文件,为assets/ebpf_probe.go;
  3. main.go 获取模块组信息,运行模块初始化;
  4. main.go 调用模块的Run方法,Run方法调用IModule接口的start方法,在这里面通过bpfManager加载epbf_probe.go字节码;
  5. Module.ReadEvent 获取事件的map,判断map类型,按照类型读取map数据(读取之前判断是否结束),读取数据后,通过Decode方法进行解码,Decode 需要获取解码函数,然后根据不同的event进行解码。 6.解码结束后,通过Write方法写到屏幕上,或者写到ES中去。

3.2 扩展

可以看到,整个流程还是比较简单的,扩展:

  1. 基于bcc开发ebpf程序的c代码,代码运行在内核中的。
  2. 实现特定事件处理接口,即字节码转成具体的结构体成员。
  3. 开发go的Module,加载ebpf的字节码,注册等;

总结: 虽然整体来说开发难度一般,ebpf程序本身开发起来可以更简单的,这里面主要用了ebpfManager的开源框架,方便了go语言开发,架构相对比较好一些,其他的也没啥了。

[ehids/ebpfmanager: A golang ebpf libary base on cilium/ebpf and datadog/ebpf. (github.com)](https://github.com/ehids/ebpfmanager)


Tags:eHIDS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
eHIDS 一款基于eBPF的HIDS开源工具
一 前言IDS一般指入侵检测系统。 入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安...【详细内容】
2022-04-18  Search: eHIDS  点击:(353)  评论:(0)  加入收藏
▌简易百科推荐
如何在Windows 10中查看电脑的名称?这里提供详细步骤
你想在有多台计算机组成的网络上查找你的计算机吗?一种方法是找到你的电脑名称,然后在网络上匹配该名称。下面是如何在Windows 10中使用图形和命令行方法查看你的计算机名称。...【详细内容】
2024-04-10  驾驭信息纵横科技    Tags:Windows 10   点击:(6)  评论:(0)  加入收藏
移动版 Outlook 解锁新技能,可验证登录 OneDrive 等微软服务
IT之家 4 月 9 日消息,微软公司近日发布新闻稿,宣布用户可以使用 Outlook 手机应用,轻松登录 Teams、OneDrive、Microsoft 365 以及 Windows 等微软账号服务。移动端 Outlook...【详细内容】
2024-04-09    IT之家  Tags:Outlook   点击:(7)  评论:(0)  加入收藏
Win10/Win11和 macOS用户反馈:谷歌云服务“捆绑”系统 DNS 设置
IT之家 4 月 6 日消息,谷歌公司承认旗下的 Google One 订阅服务中存在问题,在 Windows 10、Windows 11 以及 macOS 系统上会更改系统 DNS 设置,变更为 8.8.8.8 地址。Google On...【详细内容】
2024-04-08    IT之家  Tags:Win10   点击:(10)  评论:(0)  加入收藏
电脑卡顿怎么重装系统,快看这篇
电脑卡顿时,重装系统确实是一种可能的解决方案。以下是重装系统的详细步骤:备份重要数据:首先,你需要将电脑中的重要文件和数据备份到外部存储设备(如U盘、移动硬盘或云存储)中,以...【详细内容】
2024-04-04  科技数码前锋    Tags:重装系统   点击:(4)  评论:(0)  加入收藏
如何检查电脑的最近历史记录?这里提供详细步骤
如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。如何检查我的计算机的最近历史记录要检查计算机的最近历史记录,应该从web浏...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:历史记录   点击:(6)  评论:(0)  加入收藏
关于Windows中AppData的相关知识,看这篇文章就可以了
如果AppData文件夹占用了你电脑上的太多空间,则需要清理AppData文件夹。下面是一些帮助你在Windows计算机上进行AppData清理的方法。什么是AppData文件夹AppData文件夹是保存...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:AppData   点击:(10)  评论:(0)  加入收藏
微软 Edge 浏览器将迎来“内存限制器”功能,用户可自主控制 Edge 内存占用
IT之家 3 月 28 日消息,微软即将为其 Edge 浏览器带来一项实用新功能,据悉该公司正在测试一项内置的内存限制器,这项功能可以让用户限制 Edge 所占用的内存,防止浏览器超出内存...【详细内容】
2024-03-29    IT之家  Tags:Edge   点击:(21)  评论:(0)  加入收藏
一寸照片的大小如何压缩?四个实测效果很好的方法
一寸照片作为生活中常见的尺寸之一,常用于各类证件照与证明文件的制作。然而,受限于其较为狭小的尺寸,上传及打印过程中很容易出现尺寸超限的情况。所以,这个时候就需要对其体积...【详细内容】
2024-03-18  宠物小阿涛    Tags:压缩   点击:(19)  评论:(0)  加入收藏
手机投屏到电脑/电视的方法
方法一:Win10自带的投影功能1、将手机和电脑连接同一个无线网络。2、选择【开始】>【设置】>【系统】>【投影到此电脑】3、将默认的始终关闭的选项更改为所有位置都可用。4、...【详细内容】
2024-03-18    老吴讲I  Tags:投屏   点击:(19)  评论:(0)  加入收藏
微软商店怎么卸载应用 一分钟快速看懂!
微软商店怎么卸载应用 一分钟快速看懂!微软公司(Microsoft Corporation)是一家全球领先的科技企业,总部位于美国华盛顿州的雷德蒙德。成立于1975年,由比尔·盖茨和保罗&mid...【详细内容】
2024-02-27  婷婷说体育    Tags:微软商店   点击:(42)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条