Solución 1:
Esto suena como un trabajo perfecto para auditd. Una vez que haya ejecutado auditd, un servicio predeterminado en los sistemas modernos basados en RedHat, puede crear una regla que hará exactamente lo que desea ejecutando
auditctl -a task,always -F uid=0
Desglosando esta regla de comando, haciendo un uso excesivo de la página del manual, encontramos que:
-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.
Por lo tanto, siempre escriba un registro para esta acción cada vez que salga una llamada del sistema de bifurcación o clonación.
La opción final se puede considerar como una cadena de filtro, en nuestro uso -F uid=0
simplemente nos restringe a los casos en los que el uid del propietario del proceso es 0.
Tenga en cuenta que esta regla se puede ejecutar en tiempo de ejecución asegurándose de que auditd esté configurado correctamente y agregando la regla
-a task,always -F uid=0
en el archivo relevante para su distribución, muy probablemente /etc/audit/audit.rules
Solo tenga en cuenta que esto será bastante ruidoso, y quienquiera que esté haciendo sus revisiones de registro deberá estar preparado para ello.
Solución 2:
No creo que haya una manera limpia de hacer esto sin volver a compilar su kernel con CONFIG_PROC_EVENTS y/o CONFIG_KPROBES (aunque me encantaría saber si hay una manera de hacerlo, así que he votado a favor de su pregunta).
Tenía la idea de usar iwatch/inotify para la creación de directorios dentro de /proc pero no parecía funcionar, ni tampoco auditctl. Parece que su mejor opción, aunque sucia, es analizar continuamente ps para un cambio de una secuencia de comandos. El siguiente código de Perl lo haría, aunque es probable que se pierda algo e ignore ps
(ya que de lo contrario se activaría solo):
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"; } } }