osquery inotify 是不是在目录或文件上安装观察程序
Posted
技术标签:
【中文标题】osquery inotify 是不是在目录或文件上安装观察程序【英文标题】:Does osquery inotify install watcher on directory or filesosquery inotify 是否在目录或文件上安装观察程序 【发布时间】:2019-08-22 10:19:11 【问题描述】:我正在使用osquery 来监视文件和文件夹,以获取有关这些文件的任何操作的事件。 osquery 配置有一个特定的语法:
"/etc/"
:以 1 的深度监视整个目录。
"/etc/%"
:以 1 的深度监视整个目录。
"/etc/%%"
:以/etc/
为根递归地监视整个树。
我正在尝试评估在观看大量目录的情况下的内存使用情况。在这个过程中我发现了以下统计数据:
"/etc"
,"/etc/%"
,"/etc/%.conf"
: osquery名下注册的inotify句柄只有1个。
"/etc/%%
: 比289
inotify 发现的句柄多几个注册在osquery的名字下,因为树下总共有285个目录。检查/proc/$PID/fdinfo
中的条目时,文件中列出的所有inode 都指向文件夹。
例如:"/etc/%.conf"
$ grep -r "^inotify" /proc/$PID/fdinfo/
18:inotify wd:1 ino:120001 sdev:800001 mask:3ce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01001200bc0f1cab
$ printf "%d\n" 0x120001
1179649
$ sudo debugfs -R "ncheck 1179649" /dev/sda1
debugfs 1.43.4 (31-Jan-2017)
Inode Pathname
1179649 //etc
这里的整个目录建立了inotify watch,但是事件只报告匹配的文件/etc/*.conf
。 osquery 是否根据提供的file_paths
过滤事件,这是我的假设,但不确定。
我为支持上述主张而进行的另一个实验是,使用 inotify(7) 中的源代码并在特定文件上运行观察程序。当我检查 inotify 观察者列表时,它只显示:
$ ./a.out /tmp/inotify.cc &
$ cat /proc/$PID/fdinfo/3
...
inotify wd:1 ino:1a1 sdev:800001 mask:38 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:a1010000aae325d7
$ sudo debugfs -R "ncheck 417" /dev/sda1
debugfs 1.43.4 (31-Jan-2017)
Inode Pathname
417 /tmp/inotify.cc
因此,根据这个实验,在单个文件上建立一个观察者是可能的(这在 inotify 手册页中很清楚)。这支持了 osquery 正在根据提供的文件模式进行某种过滤的说法。
有人可以验证声明或以其他方式呈现吗?
我的 osquery 配置:
"options":
"host_identifier": "hostname",
"schedule_splay_percent": 10
,
"schedule":
"file_events":
"query": "SELECT * FROM file_events;",
"interval": 5
,
"file_paths":
"sys": ["/etc/%.conf"]
$ osqueryd --version
osqueryd version 3.3.2
$ uname -a
Linux lab 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
【问题讨论】:
【参考方案1】:这听起来像是一些伟大的侦探!
我认为源代码中的 cmets 支持这一点。值得略读。我认为相关文件:
https://github.com/osquery/osquery/blob/master/osquery/tables/events/linux/file_events.cpp https://github.com/osquery/osquery/blob/master/osquery/events/linux/inotify.cpp【讨论】:
不知道我是怎么错过的,很抱歉之前的评论。 inotify.cpp 确实提到了If the wildcard exists within the file (leaf), remove and monitor the directory instead. Apply a fnmatch on fired events to filter leafs.
github.com/osquery/osquery/blob/master/osquery/events/linux/… 我猜,如果找到通配符,评论显示osquery正在使用fnmatch。所以它确实清楚了一些事情。
如果是这样,可能值得接受答案并关闭问题以上是关于osquery inotify 是不是在目录或文件上安装观察程序的主要内容,如果未能解决你的问题,请参考以下文章
inotify_add_watch 失败,没有这样的文件或目录
inotify IN_CLOSE_WRITE 仅检测复制到目录的文件