Surveiller les process en essayant d'accéder à un file ou un directory inexistant

Nous transférons des sites Web d'une configuration de server à une nouvelle configuration et les sites Web vont vivre dans des paths différents. Nous prévoyons de replace les anciens paths par de nouveaux paths, mais au cas où nous en manquerions, y a-t-il un moyen de surveiller les process essayant d'accéder aux anciens paths et de savoir à quel UID appartenait le process?

Vous pouvez utiliser ce petit script systemtap:

 #!/usr/bin/stap function proc:ssortingng() { return sprintf("PID(%d) UID(%d) PROC(%s)", pid(), uid(), execname()) } probe syscall.open.return, syscall.stat.return, syscall.open64.return ?, syscall.stat64.return ? { filename = user_ssortingng($filename) if ($return < 0) { printf("failed %s on %s by %s\n", pn(), proc(), filename) } } 

Il va accrocher les syscalls ouverts et stat (vous pouvez copyr / coller le code, peut-être que j'ai oublié d'autres syscalls) au return. Comme syscalls est le seul moyen de communiquer avec le kernel, vous ne manquerez de rien. Ce script produira ce type de sortie:

 failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/rofl failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/hihi 

parmi les avantages de l'utilisation de systemtap, nous avons:

  • less intrusif pour le process
  • à l'échelle du système (pas seulement le process surveillé), mais vous pouvez réduire sa sélection directement dans le script
  • less de ressources affamées (affiche uniquement les actions ayant échoué, pas toutes pour être grep après)
  • vous pouvez améliorer le script pour get des détails sur le programme appelant (par exemple, sa trace de return, son heure d'appel, etc.). Cela dépend de votre application.

Et pour les contre:

  • pas standard, vous devez l'installer (mais assez standard pour être disponible sur la plupart des dissortingbutions). Sur Redhat et variantes: sudo yum install systemtap
  • besoin d'avoir le debuginfos pour build le module. Sur Redhat et variantes: sudo debuginfo-install kernel

Quelques liens utiles: L'index tapset (fonctions incluses) , et un guide pour débutants

Bonne chance pour votre migration!

Quelque chose comme ça devrait le faire:

 strace -f \ -e trace=open,stat,stat64,lstat,lstat64,chdir,mkdir,rename,symlink,creat \ -o >(grep "the paths you want to catch" > log) \ commandToStartYourServer 

Vous voulez que le commutateur -f surveille les process enfants. Les options de trace sont un sous-set de ce qui fabricate utilisations pour tracer IO (fabrique des traces "open,stat,stat64,lstat,lstat64,execve,exit_group,chdir,mkdir,rename,clone,vfork,fork,symlink,creat" )

Cela limite davantage le disque d'input-sortie en filtrant la sortie via grep et la substitution de process (essentiellement un canal au niveau du système).

Vous pourriez utiliser fatrace. Le support du kernel (fanotify) doit être présent dans la plupart des systèmes modernes, mais l'application fatrace userspace n'est pas dans les référentiels standard de certains systèmes d'exploitation. fatrace est particulièrement agréable si vos anciens files sont sur un système de files distinct.

http://www.lanedo.com/filesystem-monitoring-linux-kernel/

Beaucoup plus commun, mais un peu plus difficile à utiliser est audité.

http://linux-audit.com/configuring-and-auditing-linux-systems-with-audit-daemon/

Il existe un problème fondamental de surveillance de l'utilisation des files par path d'access lorsque les liens symboliques autorisent l'access via des paths complètement différents. Vous devrez donc y accorder une attention particulière.