Audit de fichiers sous Linux: comment surveiller l'arborescence des répertoires pour les suppressions?

9

J'ai un script de forum en cours d'exécution sur le serveur et, en quelque sorte, un petit nombre de pièces jointes commencent à se perdre. Je veux savoir ce qui les supprime et à quelle heure. Comment puis-je configurer Linux auditd (auditctl) pour surveiller l'arborescence des répertoires (les pièces jointes sont stockées dans l'arborescence des répertoires à plusieurs niveaux) pour y détecter les suppressions de fichiers?

Peut-être devrais-je utiliser un autre outil pour cela?

Vladislav Rastrusny
la source

Réponses:

8

Voici une réponse que j'ai écrite à une question précédente:

Généralement, si vous souhaitez savoir ce que fait un processus / utilisateur / fichier sans avoir à exécuter lsof 24/7 contre lui, vous utilisez auditctl.

En supposant que vous disposez d'un contrôle d'audit du noyau récent, cela devrait être une opération simple. (Ceci est dans Debian-fu, si vous exécutez la traduction Red Hat comme il convient)

# apt-get install auditd

Assurez-vous que son fonctionnement (/etc/init.d/auditd status).

auditctl -a entry,always -F arch=b64 -S open -F pid=<process id>

Remplacez b64 par b32 si vous exécutez arch 32 bits, open peut être remplacé par n'importe quel appel système ou le mot 'all'

Pour plus d'informations, lisez la page de manuel auditctl.

Vous pouvez utiliser cette méthode et lui demander de surveiller l'appel système «dissocier».

Le paramètre -w est utile pour regarder les fichiers / répertoires, mais comme l'explique la page de manuel, il y a des mises en garde.

-w chemin Insère une surveillance de l'objet du système de fichiers dans chemin. Vous ne pouvez pas insérer une montre dans le répertoire de niveau supérieur. Ceci est interdit par le noyau. Les caractères génériques ne sont pas non plus pris en charge et génèrent un avertissement. La façon dont les montres fonctionnent consiste à suivre l'inode en interne. Cela signifie que si vous placez une surveillance sur un répertoire, vous verrez ce qui semble être des événements de fichier, mais ce n'est vraiment que la mise à jour des métadonnées. Vous pourriez manquer quelques événements en faisant cela. Si vous avez besoin de regarder tous les fichiers d'un répertoire, il est recommandé de placer une surveillance individuelle sur chaque fichier. Contrairement aux règles d'audit syscall, les surveillances n'ont pas d'impact sur les performances en fonction du nombre de règles envoyées au noyau.

Aaron Tate
la source
Je ne peux pas :( J'ai PHP fonctionnant en mode CGI. C'est toujours un nouveau processus là-bas. Aussi, je ne veux pas regarder un seul processus, mais regarder une partie particulière du système de fichiers pour les modifications.
Vladislav Rastrusny
Oui, voir l'édition, j'ai fait, il y a des paramètres pour regarder les répertoires du système de fichiers, mais avec des mises en garde ou des fichiers.
Aaron Tate
Il y a environ 1000 dossiers et environ 50k de fichiers. Donc ça ne marchera pas non plus ... :(
Vladislav Rastrusny
Généralement, tant que vous êtes au courant des mises en garde, vous devriez pouvoir continuer et placer la montre dans le répertoire de niveau supérieur qui contient les dossiers que vous souhaitez regarder.
Aaron Tate
Je dois faire la même chose (regarder un dossier pour les suppressions afin que je puisse trouver le nom PID / processus qui l'a fait), mais cela ne semble pas fonctionner (au moins sur un noyau 3.x). Si je lance "auditctl -a entry, always -F arch = b64 -S unlink -w / path / to / dir" pour suivre les suppressions, j'obtiens "l'option watch ne peut pas être donnée avec un syscall". Quelqu'un a une idée?
IBBoard
1

Peut-être que l' incron pourrait être utilisé?

ptman
la source
Il ne permet pas de regarder l'arbre dans son ensemble. Uniquement par répertoire comme je peux le voir.
Vladislav Rastrusny,
0

Quelques idées. Vous pouvez utiliser stracepour voir ce que fait votre application, mais cela peut générer un journal de journaux et ralentir le système.

Une autre idée est d'utiliser inotifywait, puis lsof/fusersur le fichier pour voir ce qui l'utilise. Vous pouvez essayer d'exécuter ce script à haute priorité (si vous le pouvez) pour obtenir des informations aussi précises que possible. Il n'attrapera probablement pas l' unlinkappel, car le fichier aura disparu avant la livraison de l'événement.

Dan Andreatta
la source
Je ne peux pas. Je ne sais pas sur quel processus exécuter strace, car je trouve des fichiers supprimés après un certain temps. inotifywait ne fonctionnera pas non plus car PHP s'exécute en tant que CGI et il existe de nombreux processus PHP avec des ID différents.
Vladislav Rastrusny
inotify est utilisé pour surveiller le système de fichiers, pas les processus en cours d'exécution. Pour strace, vous devez tracer le processus parent maître avec l' -findicateur, pour suivre les enfants.
Dan Andreatta
0

Bien que la recommandation d'audit de fenix semble idéale, vous pouvez trouver un ID de système de fichiers tel que AIDE utile. Malheureusement, il est peu probable qu'il soit suffisamment fin pour ce que vous essayez d'isoler.

J'écrirai souvent des scripts comme solution à des problèmes comme ce que vous décrivez. Si vous ne pouvez pas accomplir ce que vous voulez avec les solutions recommandées, écrivez quelque chose vous-même. Ce n'est souvent pas très compliqué.

Warner
la source
Il semble que ce soit uniquement pour localiser les modifications de fichiers. Pas pour la surveillance en temps réel.
Vladislav Rastrusny