流程创建挂钩操作

Wad*_* M. 6 process inotify

是否可以在每个进程创建时挂钩脚本执行?

本质上相当于 inotifywait 来监视磁盘活动,但应用于进程表。

这将允许在产生进程时执行操作,例如记录它,cgset 它,其他。我可以看到它将递归应用于新流程的挑战。但是,与其尽快轮询进程表以捕获易受竞争条件影响的更改,还有更好的方法。

谢谢

Gil*_*il' 5

首先,进程创建很少是一个有用的记录事件,它与安全无关(资源限制除外)。我认为您的意思是挂钩程序的执行,这是由 完成的execve,而不是fork.

其次,您引用的用例通常最好使用为此目的而制定的现有机制,而不是滚动您自己的机制。

  • 对于日志记录,BSD 进程记帐提供了少量信息,并且在大多数 Unix 变体上都可用;在 Linux 上,安装GNU 会计实用程序(从您的发行版安装包)。对于 Linux 上更复杂的日志记录,您可以使用审计子系统auditctl手册页有示例;正如我上面解释的,您要记录的系统调用是execve)。
  • 如果您想对某些程序应用安全限制,请使用安全框架,例如SELinuxAppArmor
  • 如果要在容器中运行特定程序或使用某些设置,请移动可执行文件并将包装脚本放置在其位置,以设置所需的设置并调用原始可执行文件。

如果您想修改一个特定程序调用其他程序的方式,而不影响其他程序的行为,有两种情况:该程序可能是敌对的,或者不是。

  • 如果该程序可能具有恶意,请在专用虚拟机中运行它。
  • 如果程序是合作的,最明显的攻击角度是用不同的PATH. 如果程序使用了不容易配置的绝对路径,在非老式的 Linux 系统上,您可以在单独的挂载命名空间中运行它(另请参阅内核:命名空间支持)。如果你真的需要精细控制,你可以通过调用程序来加载一个库来覆盖一些库调用LD_PRELOAD=my_override_library.so theprogram。有关示例,请参阅在执行前重定向文件描述符。请注意,除了 之外execve,您还需要覆盖所有execve内部调用的 C 库函数,因为LD_PRELOAD不会影响内部 C 库调用。您可以通过在下面运行程序来获得更精确的控制ptrace; 这允许您覆盖系统调用,即使它是由 C 库函数生成的,但设置起来更困难(我不知道有什么简单的方法可以做到)。