有谁知道监视根进程生成的简单方法


13

我想在新的根进程产生时执行脚本。(在Linux上)我该怎么做?

谢谢


这是一个有趣的问题,但是对此有实际应用吗?我一直在动脑筋,我正在画一个空白…
史蒂文

Answers:


9

听起来这对于审计工作来说是完美的。审核运行后,这是现代基于RedHat的系统上的默认服务,您可以通过执行以下操作来制定将完全满足您要求的规则

auditctl -a task,always -F uid=0

分解此命令规则,过度使用手册页,我们发现:

   -a list,action
          task       Add  a  rule to the per task list. This rule list is used
                     only at the time a task is created -- when fork() or
                     clone() are called by the parent task. When using this
                     list, you should only use fields that are known at task
                     creation time, such as the uid, gid, etc.
          always     Allocate an audit context, always fill it in at syscall 
                     entry time, and always write out a record at syscall exit
                     time.

因此,每当fork或clone系统调用退出时,请始终为此操作写一条记录。

最终选项可以认为是过滤字符串,在我们的使用中-F uid=0仅将我们限制为流程所有者的uid为0的情况。

请注意,可以在运行时通过确保正确配置auditd并将该规则添加
-a task,always -F uid=0
到相关文件中进行分发来执行此规则,最有可能的是/etc/audit/audit.rules

请记住,这会带来很大的噪音,无论谁进行日志查看,都需要为此做好准备。


实际上,既然我写了这篇文章,我突然意识到我回答了标题中的问题,而不是问题中的问题。我希望它仍然有用。
Scott Pack

为什么有时使用pid = 0,有时使用uid = 0
Dakusan

@dakusan主要是因为我需要编辑器。立即修复。
Scott Pack

2

我认为没有一种不使用CONFIG_PROC_EVENTS和/或CONFIG_KPROBES重新编译内核的干净方法(尽管我很想知道是否可以这样做,所以我赞成您的问题)。

我确实有一个在/ proc内使用iwatch / inotify创建目录的想法,但是它似乎没有用,auditctl也没有。看起来您最好的选择,尽管很脏,但它是不断地从脚本中解析ps以进行更改。下面的Perl代码可以做到这一点,尽管它很容易错过某些内容并被忽略ps(否则会触发自身):

perl -e 'my %pids; while(1) { my @pids = `ps -U root -u root`; foreach (@pids) { next if /ps$/; ($pid) = /^\s*(\d+)\D/; if (!$pids{$pid}) { $pids{$pid}++; print "Process $pid created (" . `cat /proc/$pid/cmdline` . ")\n"; } } }

您在代码末尾缺少单引号。无法修改它,因为SO至少需要更改6个字符。另外,对于所有用户,请使用“ -ax”代替“ -U root -u root”
Dakusan

1

我能想到的最好的方法是建立史努比库。snoopy是一个非常小的共享库,可以挂接到系统/etc/ld.so.preload包装中并进行包装execve()。可以配置所有日志exec(),也可以仅记录root用户的日志。在当前情况下,每当发生匹配事件(对的syscall execve())时,史努比都会记录到syslog中。虽然它不是一个大程序(最多只有几百行代码),并且可以修改脚本而无需执行(而不是记录)活动的难度很大。史努比用C语言编写。

注意事项:

  • 如果您在每次生成根进程时都运行一个脚本,那么您的脚本将是一个根进程,它将需要再次生成该脚本,这将是另一个根进程,等等。请注意不要陷入循环之中那里。
  • 在典型的Linux机器上,有许多进程以root身份运行并定期产生。例如,cron可能每分钟或每分钟数以root身份生成系统cronjobs。如果您只是想在用户以root用户身份登录时发生这种情况,则将需要更多工作。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.