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等待

inotify_add_watch 失败,没有这样的文件或目录

Security:osquery 介绍

inotify IN_CLOSE_WRITE 仅检测复制到目录的文件

inotify:事件报告的顺序是不是与它们在文件系统中发生的顺序完全相同?

使用 inotify 检查监视文件夹中的文件是不是被覆盖