![如何确定是什么改变了文件的 SELinux 文件上下文?](https://linux22.com/image/750488/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E6%98%AF%E4%BB%80%E4%B9%88%E6%94%B9%E5%8F%98%E4%BA%86%E6%96%87%E4%BB%B6%E7%9A%84%20SELinux%20%E6%96%87%E4%BB%B6%E4%B8%8A%E4%B8%8B%E6%96%87%EF%BC%9F.png)
我注意到 Web 目录中某些文件的文件上下文发生了变化,偏离了系统策略。有些开发人员在git pull
Web 目录的较高部分运行,我想知道这是否是原因,但我的测试表明 git 遵守 SELinux 标签规则。明确地说,这不会更改标签规则,只会更改特定目录及其后代的标签。并且足以restorecon -R
修复它。
是否可以跟踪文件上下文发生更改的原因和时间?auditd 可以跟踪这些吗?目前,审计日志和 /var/log/secure 未显示任何明显会导致更改的内容。是否有我可以使用 ftrace 或其他工具进行检测的系统调用?
如何追踪这一变化?
答案1
我最终使用了 auditd 来实现这一点。文件上下文存储在文件系统本身的文件扩展属性中,因此要更改文件上下文,必须进行 setxattr() 系统调用。因此,我可以审计对特定目录路径中文件的所有 setxattr 调用,并且为了进一步限制噪音,我只能审计成功的调用(因为我只关心上下文何时实际更改)。因此,我的规则如下所示:
auditctl -a always,exit -F arch=b64 -S setxattr -F dir=/var/dir/path -F success=1 -k fcontext_detect
这会产生类似以下内容的消息:
type=SYSCALL msg=audit(1586191225.091:52361): arch=c000003e syscall=188 success=yes exit=0 a0=12ff173 a1=6f53e8918efa a2=12cd598 a3=1f items=1 ppid=20206 pid=20513 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=2179 comm="chcon" exe="/usr/bin/chcon" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="fcontext_detect"
@powerload79 提到了使用 fanotify 的可能性。这可能有用,但我发现文档不够完善,而且审计规则更简单,也足够好了。