最后防线: Linux进程实时监控

做Linux主机入侵检测系统,对进程监控是一个难点,要做不遗漏,也要做不影响系统性能,是非常困难。

在现代操作系统中,任何攻击行为都是借助进程这个执行单元来进行,检测攻击行为往往是对进程监控,检测是否存在异常行为。

命令方式


基本上,使用Linux的人都会用ps来获取进程信息。如果是获取所有进程,往往是

ps -ef

ps axu

如果是放在主机入侵检测系统实现,往往会使用fork/execvpopensystem之类的API调用ps命令,来获取命令的结果。这种方式非常简单容易上手,却存在问题:

  • 调用频次的考虑:太过频繁,会消耗大量系统性能,如果在生产环境机器使用,会影响业务; 频次太低,很多进程活动无法监控到。

  • 调用命令的隐患:任何一个命令在启动时,都要加载一大堆依赖的so,如果某些so不存在,命令是执行不了。如果命令执行完之后出现异常,成为僵尸进程,就会消耗大量系统句柄,导致后面一些业务进程无法启动。

  • 错误的处理:由于是调用命令,命令获取数据是否异常,无法得知,对这种错误无法处理,也会导致有大量无效数据。

  • 数据量的考虑:每次调用都是采集当前系统所有的进程,大量冗余数据,需要做不少过滤工作,否则会导致数据暴增。

读取proc文件系统


按照Unix哲学一切皆文件ps命令肯定是读取某些文件来获取这些信息。在《Unix环境高级编程》这本书都提到过ps的实现,是读取proc文件系统的。使用strace ps可以看到,ps就是读取proc文件系统的。

取一条ps的结果来对照一下proc文件系统能够获取的内容

UID         PID   PPID  C STIME TTY          TIME CMD
root       1326   1151  0 Feb02 ?        00:00:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf /var/lib/NetworkManager/dhclient-b8281210-bced-41a8-ba17-025e1d24054a-ens33.lease -cf /var/lib/NetworkManager/dhclient-ens

从上面信息可以看到启动进程的用户是root, 进程ID是1326,进程父ID是1151, cpu(C)使用率为0,启动时间(STIME)是2月2日,时间为0, 命令行是/sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf /var/lib/NetworkManager/dhclient-b8281210-bced-41a8-ba17-025e1d24054a-ens33.lease -cf /var/lib/NetworkManager/dhclient-ens

看一下1326这个进程在proc文件系统的内容:

[root@bogon-agent ~]# stat /proc/1326
  File: ‘/proc/1326’
  Size: 0               Blocks: 0          IO Block: 1024   directory
Device: 3h/3d   Inode: 22643       Links: 9
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:system_r:dhcpc_t:s0
Access: 2021-02-02 18:44:15.878000578 +0800
Modify: 2021-02-02 18:44:15.878000578 +0800
Change: 2021-02-02 18:44:15.878000578 +0800
 Birth: -

是2021年2月2日18:44:15分钟启动的,用户是root,组也是root。

[root@bogon-agent ~]# cat /proc/1326/cmdline
/sbin/dhclient-d-q-sf/usr/libexec/nm-dhcp-helper-pf/var/run/dhclient-ens33.pid-lf/var/lib/NetworkManager/dhclient-b8281210-bced-41a8-ba17-025e1d24054a-ens33.lease-cf/var/lib/NetworkManager/dhclient-ens33.confens33

命令行也是和ps结果一样。

[root@bogon-agent ~]# cat /proc/1326/status
Name:   dhclient
Umask:  0022
State:  S (sleeping)
Tgid:   1326
Ngid:   0
Pid:    1326
PPid:   1151

可以看到进程父ID是1151,进程在睡眠状态,所以使用率和使用时间是0.

而且通过阅读proc的手册知道,从proc文件系统还可以得到进程很多信息:

  1. cpu使用量

  2. 内存使用量

  3. 句柄数量和信息

  4. 线程数量和信息

  5. 端口和网络数据信息

  6. 命名空间信息

  7. 库加载信息

  8. 环境变量信息

  9. 文件系统加载信息

上面的操作,如果是在主机入侵检测系统里实现,就可以通过opendir/readdir/closediropen/read/closereadlink/realpath之类的API实现。这样的好处:

  • 不会产生僵尸进程

  • 可以对错误情况很好处理

  • 大大减少了采集的数据量:通过记录每次扫描时间,可以只对新创建的进程采集

但还是没有解决采集频率的问题,会存在消耗系统性能或遗漏采集的情况。这就需要进程的实时监控了。

实时监控方式


 

剩余内容请看本人公众号debugeeker, 链接为最后防线: Linux进程实时监控

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值