Surveillance de l'accès aux fichiers Linux

20

Existe-t-il un moyen sous Unix de savoir qui a accédé à certains fichiers au cours de la dernière semaine? Il peut s'agir d'un utilisateur ou d'un script ftp vers un autre endroit. Puis-je obtenir une liste des noms d'utilisateurs ayant accédé à certains fichiers? Comment puis-je savoir qui accède à un fichier particulier ??

Jack
la source

Réponses:

39

Sauf si vous avez des politiques de journalisation extrêmement inhabituelles en place, qui a accédé à quel fichier n'est pas journalisé (ce serait une énorme quantité d'informations). Vous pouvez savoir qui était connecté à quelle heure dans les journaux système; la lastcommande vous donne l'historique de connexion et d'autres journaux tels que /var/log/auth.logvous diront comment les utilisateurs se sont authentifiés et d'où ils se sont connectés (quel terminal, ou quel hôte si à distance).

La date à laquelle un fichier a été lu pour la dernière fois s'appelle son heure d'accès, ou atime pour faire court . Tous les systèmes de fichiers Unix peuvent le stocker, mais de nombreux systèmes ne l'enregistrent pas, car il a une pénalité de performance (généralement faible). ls -ltu /path/to/fileou stat /path/to/fileaffiche le temps d'accès au fichier.

Si un utilisateur accède au fichier et n'essaie pas de cacher ses traces, son historique shell (par exemple ~/.bash_history) peut avoir des indices.

Pour savoir quoi ou qui a un fichier ouvert maintenant, utilisez lsof /path/to/file.

Pour enregistrer ce qui arrivera à un fichier à l'avenir, il existe plusieurs façons:

  • Utilisez inotifywait . inotifywait -e access /path/toimprimera une ligne /path/to/ ACCESS filelorsque quelqu'un lira file. Cette interface ne vous dira pas qui a accédé au fichier; vous pouvez appeler lsof /path/to/filedès que cette ligne apparaît, mais il y a une condition de concurrence (l'accès peut être terminé au moment où lsof démarre).

  • LoggedFS est un système de fichiers empilable qui fournit une vue d'une arborescence de systèmes de fichiers et peut effectuer une journalisation plus sophistiquée de tous les accès via cette vue. Pour le configurer, voir Syntaxe du fichier de configuration LoggedFS .

  • Vous pouvez utiliser le sous- système d'audit de Linux pour enregistrer un grand nombre de choses, y compris les accès au système de fichiers. Assurez-vous que le auditddémon est démarré, puis configurez avec quoi vous souhaitez vous connecter auditctl. Chaque opération enregistrée est enregistrée dans /var/log/audit/audit.log(sur les distributions typiques). Pour commencer à regarder un fichier particulier:

    auditctl -w /path/to/file
    

    Si vous placez une surveillance sur un répertoire, les fichiers qu'il contient et ses sous-répertoires sont également surveillés de manière récursive.

Gilles 'SO- arrête d'être méchant'
la source
Merci Gilles .. J'ai ce fichier dat créé par le script. Je veux juste savoir ce qui arrive à ce fichier après sa création .. aucun des autres scripts ne le sélectionne pour un processus ultérieur, donc je veux voir si quelqu'un accède manuellement à ce fichier dat
Jack
@Jack: Il est difficile de dire sans en savoir beaucoup plus sur votre configuration, mais tant que rien ne supprime ou renomme le fichier, il sera là pour que les autres scripts le récupèrent, que quelqu'un d'autre y accède ou non. D'après votre commentaire, je pense que vous devriez regarder ce qui se passe lorsque vous exécutez vos scripts.
Gilles 'SO- arrête d'être méchant'
2
Hé, vous pouvez créer une jolie boucle circulaire avec ceci:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359
7

L'exemple ci-dessus avec inotifywait devrait être l'un des (voir la page de manuel pour plus d'informations):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

Ou avec mode de surveillance et horodatage:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Milan Kerslager
la source
6

La réponse précédente n'est pas la meilleure pratique pour faire ce que vous demandez. Linux a une API pour cela. L' inotifyAPI http://linux.die.net/man/7/inotify

  1. Vous pouvez écrire un programme C pour faire ce que vous voulez en appelant inotifydirectement l' API
  2. Vous pouvez utiliser kfsmd, http://www.linux.com/archive/feature/124903 un démon qui utiliseinotify
  3. Si vous voulez quelque chose qui fonctionne sur toutes les plateformes ( inotifyest spécifique à Linux) et que vous utilisez Java, JNotify fonctionne sur toutes les plateformes (Linux, Mac, Windows), en faisant abstraction de l'API sous-jacente du système d'exploitation natif.
Glen
la source
3
Bienvenue sur Stack Exchange . Les réponses ne sont pas présentées par ordre chronologique, donc la «réponse précédente» ne donne pas la réponse que vous voulez dire. Je me demande de laquelle des deux autres vous parlez de toute façon: l'une n'a rien qui ressemble à une bonne ou une mauvaise pratique, et l'autre mentionne l'API inotify.
Gilles 'SO- arrête d'être méchant'
Glen se réfère très probablement à la réponse ci-dessus avec le tri des votes par défaut. En effet, la réponse la plus populaire ne présente pas de solution à la question. Il peut y avoir un certain nombre de raisons pour lesquelles il peut être nécessaire de voir combien de fois un fichier est accédé pour une période donnée.
Wtower
1
Comme expliqué dans unix.stackexchange.com/a/12251/20336, l' API inotify ne fournit pas d'informations sur qui a accédé à un fichier donné. De plus, inotify n'aide pas vraiment à déterminer qui a accédé au fichier la semaine dernière. Pour cela, vous avez besoin de fonctionnalités d'audit, ce qui nécessite l'utilisation d'un logiciel appelé auditd(cependant, cela n'aide pas à déterminer qui a accédé au fichier la semaine dernière, sauf si vous l'aviez auditddéjà exécuté la semaine dernière).
Mikko Rantalainen
3

Ce n'est pas, en général, faisable. J'ai vu des systèmes de fichiers avec suffisamment d'audits pour rendre possible d'une manière ou d'une autre, mais ce n'est pas une chose Unix générale, non.

tchrist
la source