Je veux exécuter un script lorsqu'un nouveau processus racine apparaît. (sous Linux) Comment puis-je simplement faire cela?
Merci
Je veux exécuter un script lorsqu'un nouveau processus racine apparaît. (sous Linux) Comment puis-je simplement faire cela?
Merci
Réponses:
Cela semble être un travail parfait pour auditd. Une fois que auditd est en cours d'exécution, un service par défaut sur les systèmes modernes basés sur RedHat, vous pouvez créer une règle qui fera exactement ce que vous voulez en exécutant
auditctl -a task,always -F uid=0
En décomposant cette règle de commande, en faisant un usage excessif de la page de manuel, nous constatons 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.
Donc, écrivez toujours un enregistrement pour cette action chaque fois qu'un appel système fork ou clone se termine.
L'option finale peut être considérée comme une chaîne de filtre, dans notre utilisation, -F uid=0
nous limite simplement aux cas où l'uid du propriétaire du processus est 0.
Notez que cette règle peut être exécutée au moment de l'exécution en vous assurant que auditd est correctement configuré et en ajoutant la règle
-a task,always -F uid=0
dans le fichier approprié pour votre distribution, très probablement/etc/audit/audit.rules
Gardez juste à l'esprit que ce sera assez bruyant, et quiconque fera vos revues de journaux devra être préparé pour cela.
Je ne pense pas qu'il existe un moyen propre de le faire sans recompiler votre noyau avec CONFIG_PROC_EVENTS et / ou CONFIG_KPROBES (bien que j'aimerais savoir s'il existe un moyen de le faire, j'ai donc voté pour votre question).
J'avais une idée d'utiliser iwatch / inotify pour la création de répertoires dans / proc mais cela ne semblait pas fonctionner, ni auditctl. Il semble que votre meilleur choix, bien que sale, soit d'analyser continuellement ps pour un changement à partir d'un script. Le code Perl suivant le ferait, mais serait enclin à en manquer et à ignorer ps
(car il se déclencherait autrement):
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"; } } }
La meilleure façon de penser serait de construire à partir de la bibliothèque snoopy . snoopy est une très petite bibliothèque partagée qui est connectée /etc/ld.so.preload
et entoure les execve()
appels système. Il est configurable pour enregistrer tous exec()
ceux ou simplement ceux de la racine. Dans son incarnation actuelle, snoopy se connecte à syslog chaque fois qu'un événement correspondant (un appel système execve()
) se produit. Ce n'est pas un gros programme (quelques centaines de lignes de code, au plus), et pourrait être modifié sans trop de difficulté pour exécuter un script au lieu (ou en plus) de consigner l'activité. Snoopy est écrit en C.
Quelques points à noter: