Comment suivre les exécutables créés par mon utilisateur sous Linux?

11

Sous Linux, je voudrais suivre les exécutables qui sont exécutés en mon nom, y compris toute la ligne de commande (en pratique, chaque exec * () fait comme mon propre utilisateur). Un programme que je ne contrôle pas est censé, pour gérer une tâche, exécuter le programme que je transmets, mais je veux m'assurer qu'il le fait et quelles options il utilise. Le programme que je ne contrôle pas est sournois et semble changer de comportement en fonction du nom du programme qu'il est censé exécuter pour la tâche, donc je ne peux pas passer un script shell qui consignerait les informations et invoquerait le réel programme.

Est-il possible pour moi d'être informé de tous les exec * () effectués en tant qu'utilisateur sur le système sous Linux, y compris la ligne de commande complète? À moins de courir psen boucle, c'est. Je préfère le faire directement sur le système sur lequel je travaille et ne pas avoir besoin d'un accès root, mais si nécessaire, je peux générer un système sur lequel j'ai un accès root, installer les programmes et y enquêter.

Utilisation d'Ubuntu 12.4 LTS.

Pierre Lebeaupin
la source
Je demande ici plutôt que Ask Ubuntu, car il s'agit plus d'une question Unix / Linux que d'une vraie question Ubuntu.
Pierre Lebeaupin
1
À quel point le programme est-il sournois? Essaie-t-il de détecter ou de contourner les débogueurs? Est-il lié dynamiquement? Si c'est trop sournois, vous devrez peut-être utiliser une machine virtuelle sur laquelle vous êtes root. (C'est peut-être la stratégie la plus simple, même pour un programme qui n'est pas particulièrement sournois.)
Gilles 'SO- arrête d'être méchant'
@Gilles C'est en effet une possibilité, je vais essayer une VM, puis mettre à jour la question si cela s'avère réalisable.
Pierre Lebeaupin
Remarque: vous semblez réellement vouloir le nom du programme et les arguments, que auditdonne la réponse , mais une `` ligne de commande entière '' dans le shell pourrait également affecter le processus enfant en utilisant les paramètres de redirection / canalisation et envvar ainsi que contenant des substitutions / extensions, des citations non significatives et l'espacement, et les structures de contrôle comme doa && dob, et vous ne les obtiendrez pas.
dave_thompson_085

Réponses:

10

Vous devez configurer auditdpour enregistrer les execveévénements. Exemple sur RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

J'ignore l'avertissement de voûte et il ne semble pas avoir d'importance, mais vous pouvez l'utiliser -F arch=b64ou -F arch=b32le régler si vous le souhaitez.

Le résultat de ce qui précède est:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

C'est évidemment rapide et sale, mais c'est la base de la façon dont vous le faites. Ce que vous devez faire exactement dépend probablement beaucoup de ce que vous essayez de faire exactement. Vous pouvez réduire le flux d'audit à l'aide de divers filtres dans la auditctlcommande, mais je ne connais aucune de ces informations, donc je ne sais pas quoi inclure. Si vous avez besoin de quelque chose de plus spécifique, je vous suggère de consulter la page de manuel ou de poster un commentaire sur cette réponse et je la mettrai à jour davantage.

J'espère que cela vous poussera dans la bonne direction.

ÉDITER:

Puisque votre question implique de regarder un utilisateur particulier, je peux vous montrer que:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Identique à ce qui précède, mais uniquement execvepar une personne exécutant avec l'ID utilisateur effectif de 16777216sera enregistré. Si vous devez spécifier la loginuidvaleur de l'utilisateur (sous lequel il s'est initialement connecté au système), vous devez filtrer à la auidplace:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Les filtres AUID / loginuid seraient utiles par exemple si l'utilisateur fera un suou sudopour rooter. Dans cette situation, il y aura beaucoup de choses en cours d'exécution en tant que root, mais vous ne vous souciez que des choses qui ont été lancées par l'utilisateur en question. auditctlvous permet également d'empiler des filtres afin que vous puissiez filtrer par les deux euidet auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"
Bratchley
la source
1
"Notez que je n'ai pas d'accès root". (Sinon, ce serait une bonne réponse.)
Gilles 'SO- arrête d'être méchant'
Merde ... si près ...
Bratchley
Merci, ça a marché. Je dois ajouter que j'ai dû installer auditctl par apt-get, il n'était pas préinstallé sur Ubuntu.
Pierre Lebeaupin
Merci. Bons exemples. Mais existe-t-il un moyen d'extraire le code de sortie du journal d'audit?
Kaos
0

Vous avez demandé quelque chose de simple. J'ai fait un exemple avec mplayermais je suppose qu'il peut être adapté à d'autres situations:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Comme vous pouvez le voir, c'est très simple: il analyse le premier argument, car c'est un fichier, un journal est créé dans le fichier central $LOGet concaténé dans un fichier (qui ont toujours le même nom mplayer.logdans le même répertoire).

Ainsi, l'utilisateur peut obtenir le dernier film qu'il a lu sur chaque répertoire.

MUY Belgique
la source
Le Q a spécifiquement dit que la substitution d'un script ne fonctionnerait pas.
dave_thompson_085
Possible, mais cela correspond mieux à ma situation: je n'ai pas de problème de sécurité et je peux choisir le script que j'exécute. Aussi incroyable que cela puisse paraître, j'ai pensé à cette solution la plus simple, peut-être que quelqu'un d'autre sera intéressé à ne pas se lancer dans des trucs de geek uniquement. J'avoue que la solution précédente est plus sécurisée!
MUY Belgium