我正在编写一个需要拦截一些文件系统调用的应用程序,例如。取消链接。我想保存一些文件,比如 abc。如果用户删除该文件,那么我需要将其复制到其他地方。所以我需要在删除 abc 之前取消链接来调用我的代码,以便我可以保存它。我已经完成了与拦截系统调用相关的线程,但是像 LD_PRELOAD 这样的方法在我的情况下不起作用,因为我希望它是安全的并在内核中实现,所以这个方法不会有用。inotify 在事件发生后通知,所以我无法保存它。你能建议任何这样的方法吗?我想在内核模块中实现它,而不是修改内核代码本身。Graham Lee 提出的另一种方法,我曾想过这种方法,但它有一些问题,我需要所有文件的硬链接镜像,它不占用空间,但仍然可能有问题,因为我必须反复镜像驱动器以使我的镜像保持最新,它也无法跨分区和不支持链接的分区工作,所以我想要一个通过该解决方案,我可以将挂钩附加到文件/目录,然后观察更改而不是重复扫描。我还想添加对无法使用硬链接的已修改文件的写入支持。我想通过替换系统调用来拦截系统调用,但我无法在 linux > 3.0 中找到任何这样做的方法。请提出一些这样做的方法。t 工作跨分区和分区不支持链接,所以我想要一个解决方案,通过它我可以将挂钩附加到文件/目录,然后观察更改而不是重复扫描。我还想添加对无法使用硬链接的已修改文件的写入支持。我想通过替换系统调用来拦截系统调用,但我无法在 linux > 3.0 中找到任何这样做的方法。请提出一些这样做的方法。t 工作跨分区和分区不支持链接,所以我想要一个解决方案,通过它我可以将挂钩附加到文件/目录,然后观察更改而不是重复扫描。我还想添加对无法使用硬链接的已修改文件的写入支持。我想通过替换系统调用来拦截系统调用,但我无法在 linux > 3.0 中找到任何这样做的方法。请提出一些这样做的方法。
4 回答
就挂钩到内核和拦截系统调用而言,这是我在我编写的安全模块中所做的事情:
https://github.com/cormander/tpe-lkm
查看 hijacks.c 和 symbols.c 的代码;它们的使用方式在hijack_syscalls
security.c 中的函数中。我还没有在 linux > 3.0 上尝试过这个,但是同样的基本概念应该仍然有效。
这有点棘手,您可能必须编写大量内核代码才能在取消链接之前进行文件复制,但在这里是可能的。
一个建议可能是用户空间中的文件系统(FUSE)。也就是说,编写一个 FUSE 模块(在用户空间中被授予),它拦截与文件系统相关的系统调用,执行您想要的任何任务,并可能在之后调用“默认”系统调用。
然后,您可以使用 FUSE 文件系统挂载某些目录,并且在大多数情况下,似乎不需要覆盖默认的系统调用行为。
您可以使用inotify观看 unlink 事件,尽管这对于您的目的可能为时已晚(我不知道,因为我不知道您的目的,您应该尝试找出答案)。基于 LSM 的内核替代方案(我的意思是 SMACK、TOMOYO 和朋友)实际上是用于强制访问控制,因此可能不适合您的目的。
如果您只想处理删除,您可以保留一个硬链接的“影子”目录(通过创建link
)到正在监视的文件(通过inotify
,正如 Graham Lee 所建议的那样)。
如果现在取消链接原始文件,您仍然可以根据需要处理影子文件,而无需使用内核模块。