有没有人知道一个简单的方法来监视根进程产卵

我想在新的根进程产生时执行一个脚本。 (在Linux上)我怎样才能做到这一点?

谢谢

这听起来像是一个完美的审计工作。 一旦你运行了auditd,在基于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系统调用退出,总是为此操作写出一条logging。

最后一个选项可以被认为是一个filterstring,在我们的使用中-F uid=0只是简单地将我们限制在进程所有者的uid为0的情况下。

请注意,可以在运行时通过确保auditd已正确configuration并添加规则来执行此规则
-a task,always -F uid=0
进入你的发行版的相关文件,很可能是/etc/audit/audit.rules

只要记住,这将是相当嘈杂,谁做你的日志审查需要准备。

我不认为有一个干净的方法来做到这一点,而不用重新编译你的内核与CONFIG_PROC_EVENTS和/或CONFIG_KPROBES(虽然我很想知道是否有办法做到这一点,所以我upvoted你的问题)。

我有一个使用iwatch / inotify在/ proc里创build目录的想法,但是它似乎没有工作,auditctl也没有。 它看起来像你最好的select,虽然脏,是不断parsingPS从脚本的变化。 下面的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"; } } } 

我能想到的最好办法就是build立史努比图书馆。 snoopy是一个非常小的共享库,它被hook到/etc/ld.so.preload并绕过execve()系统调用。 它可以configuration为logging所有的exec() ,或只是从根。 在当前版本中,每次发生匹配事件(系统调用execve() )时,监听都会logging到系统日志中。 这不是一个很大的程序(最多只有几百行代码),而且可以修改脚本来执行一个脚本,而不是(或除了)logging活动。 史努比用C写成

有几件事要注意:

  • 如果每次生成一个根进程时都运行一个脚本,那么脚本将是一个根进程,这将需要再次产生脚本,这将是另一个根进程等。要小心,不要进入循环那里。
  • 在典型的Linux机器上,有很多以root身份运行的进程,并定期产生。 例如,cron可能会每分钟或几分钟以root身份产生系统cronjob。 如果您只是在用户以root用户身份login时发现这种情况,那将会是更多的工作。