Forum Linux.général log des acces fichiers

Posté par (page perso) .
Tags : aucun
0
6
juil.
2005
Bonjour a tous,

Je m'en remet a vous pour un petit probleme. Je dois logger tous les acces fichiers effectuer par des programmes.
Probleme pas trop compliquer a la base, mais la ou sa se corse, ces que les programme a surveiller, peuvent etre compiler de maniere statique, ou etre suid, il n'est donc pas possible d'utiliser une lib avec un LD_PRELOAD.
Pour l'instant j'utilise un strace pour recuperer les appels systemes puis un prog qui parse le tout pour m'en sortir la liste des fichiers ajouter, et celle des fichiers modifiers (les acces en lecture ne nous interresnt pas)
Le probleme de cette methode, c'est que c'est super lourd, des que le programme tourne un peu longtemps et fait beaucoup d'acces disque le fichier de log que je parse explose.

Une solution est de recuperer les parties qui m'interresse dans strace pour ecrire un prog qui fait tout le traitement au fur et a mesure, donc j'elimine le fichier intermediaire, mais ça reste pas tres propre de faire une trace des syscall du prog a surveiller...

Donc je m'en remet a vous, pour savoir si quelqu'un aurait une meilleur idee avant que je me mette au codage ?

(je precise que certains des programes a monitore sont vraiment intensifs au niveau entree sorties, et que l'on doit surveille aussi bien le programme que ses processus enfants)

Merci
  • # Re:

    Posté par . Évalué à 2.

    Je pense que le plus simple et le plus propre dans ton cas serait de trafiquer le syscall en question.
    Tu peux soit utiliser un module pour le hooker, soit patcher directement ton noyau.
    • [^] # Re: Re:

      Posté par (page perso) . Évalué à 1.

      Le probleme c'est que des syscall qui cree ou modifie des fichier il y en a pas mal, donc pas si simple que ça.
      De plus le programme doit etre ditribue sur pas mal de systeme, et si ce sont tous des linux, il y a par contre beaucoup de version differentes.
      Il y a pas mal de distrib differentes et surtout pas mal de version du noyeau differentes, des 2.4 et des 2.6 (il me semble que le dernier 2.2 a disparu, mais c'est a verifier)
      Donc faire un module ou patch, c'est difficilement envisageable.
      • [^] # Re: Re:

        Posté par . Évalué à 2.

        Il n'y a pas tant de syscall que ça ... et même si il y en avait une vingtaine, rajouter un bête printk() n'est pas une tache particulièrement ardue...
        Dans tout les cas, chaque création/écriture/lecture passe par un incontournable open() donc bon ...

        Et pour finir, la programmation de ce type de module pour les noyaux 2.4 est particulièrement aisée. Pour ce qui est des 2.6, je ne me suis encore pas amusé à détourner des syscall donc je ne pourrais te dire.

        Pour finir, pour le traitement final, la solution est de logguer avec une priorité élevée (LOG_DEBUG) et de configurer ton syslogd pour qu'il envoie les kern.debug vers un programme en perl qui lui fera le traitement.

        Cette solution reste à mes yeux la plus propre car:

        1/ Economique en ressources.
        2/ Discrète.
        3/ Non contournable.
        4/ Relativement rapide.

        Après, si tu veux rester sur ta solution, c'est comme tu le sent mais je me pose quand même une question : Comment fait tu pour forcer le strac-age de tout les programmes ?
        • [^] # Re: Re:

          Posté par (page perso) . Évalué à 1.

          Ce n'est pas que je veux rester sur ma solution bien au contraire, mais plus que j'ai des contraintes de deploiment. Et un module noyeau, au niveau de l'instalation, vu les postes ou le log sera necessaire, oblige a recompiler le module sur chaque machine. (je ne suis meme pas sur que tout les noyaux on le support des modules activé)

          Apres si tu me donne un moyen pour que je puisse fournir un module (ou eventuellement un pour le 2.4 et un pour le 2.6) qui marchera partout sans probleme (je pense que je peux les forcer a activer le support des modules partout) je suis tout a fait preneur, je suis tout a fait d'accord que c'est une bonne solution (en tout cas meilleur que l'actuelle)

          Pour le strac-age, faudrait que tu me precise ce que tu entend par la ? Pour l'instant j'utilise strace [1] qui me log les appels systeme.

          [1] http://www.liacs.nl/~wichert/strace/(...)
          • [^] # Re: Re:

            Posté par . Évalué à 2.

            Une module écrit proprement pour les deux branches de noyau fonctionnera parfaitement sur tout noyau de cette branche dans ton cas.
            En effet, il ne s'agit ici que de faire de bête printk, donc les différentes modifs étant intervenus au cours du développement de ces deux branches ne te concerneront pas.
            L'écriture d'un tel module pour un noyau 2.4 est vraiment très facile à ma connaissance. La seule différence pour les 2.6 va être au niveau de l'interception des syscall, chose que je n'ai pas encore étudié.

            Pour le strace, j'ai bien compris que cela répondait à tes attentes. Simplement, je vois difficillement comment tu pourrais "monitorer" tout les accés aux fichiers via cet utilitaire. Si tu as des utilisateurs qui peuvent être amené à se logguer sur la machine, tu vas les forcer à lancer leurs différentes commandes via strace ?
            Et pour Apache, le ftpd, etc... ? Tu as la possibilité de te rattacher à un pid donné via strace, mais cela restera très gourmand en ressources.
      • [^] # Re: Re:

        Posté par (page perso) . Évalué à 3.

        Il y a systrace qui devrait faire l'affaire (bien qu'un peu overkill), mais je ne sais pas si le port pour Linux est encore à jour / maintenu.
        Cf. http://www.citi.umich.edu/u/provos/systrace/linux.html(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.