Answers:
听起来这对于审计工作来说是完美的。审核运行后,这是现代基于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
请记住,这会带来很大的噪音,无论谁进行日志查看,都需要为此做好准备。
我认为没有一种不使用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"; } } }
我能想到的最好的方法是建立史努比库。snoopy是一个非常小的共享库,可以挂接到系统/etc/ld.so.preload
包装中并进行包装execve()
。可以配置所有日志exec()
,也可以仅记录root用户的日志。在当前情况下,每当发生匹配事件(对的syscall execve()
)时,史努比都会记录到syslog中。虽然它不是一个大程序(最多只有几百行代码),并且可以修改脚本而无需执行(而不是记录)活动的难度很大。史努比用C语言编写。
注意事项: