Est-ce que quelqu'un connaît un moyen simple de surveiller la réapparition du processus racine

13

Je veux exécuter un script lorsqu'un nouveau processus racine apparaît. (sous Linux) Comment puis-je simplement faire cela?

Merci

cerisier
la source
C'est une question intéressante, mais y a-t-il une application pratique à cela? Je suis en train de me casser la tête et je dessine un blanc ...
Steven lundi

Réponses:

9

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=0nous 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.

Scott Pack
la source
En fait, maintenant que j'ai écrit cela, je réalise soudain que j'ai répondu à la question dans le titre, et non à la question dans la question. J'espère que c'est toujours utile.
Scott Pack
Pourquoi utilisez-vous parfois pid = 0 et parfois uid = 0
Dakusan
@dakusan Surtout parce que j'ai besoin d'un éditeur. Fixé maintenant.
Scott Pack
2

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"; } } }
James L
la source
Vous manquez un seul devis à la fin de votre code. Impossible de le modifier car SO nécessite au moins 6 caractères pour changer. De plus, pour tous les utilisateurs, utilisez "-ax" au lieu de "-U root -u root"
Dakusan
1

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.preloadet 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:

  • Si vous exécutez un script chaque fois qu'un processus racine est généré, votre script sera un processus racine, qui devra recommencer le script, qui sera un autre processus racine, etc. Attention à ne pas entrer dans une boucle Là.
  • Sur une boîte Linux typique, il existe de nombreux processus qui s'exécutent en tant que root et sont générés régulièrement. Par exemple, cron peut générer des tâches cron du système en tant que root toutes les minutes ou quelques minutes. Si vous cherchez simplement à ce que cela se produise lorsqu'un utilisateur se connecte en tant que root, ce sera plus de travail.
Christopher Cashell
la source