docker 容器中的防病毒软件 - fanotify 是否在主机和容器之间工作?

Anti-virus in docker container - does fanotify works between host and container?

我需要使用开源软件对 docker 容器内的文件实施防病毒按访问扫描解决方案。 Clamav On-Access 工作正常但有一些要求和限制:

此限制 - "fanotify not working for container events when watching from host" 是否真的存在,或者我只是错误配置了 ClamAV?我不太了解 fanotify 如何与命名空间一起使用,但对我来说它看起来像是内核限制。

更新:是否有任何解决此限制的方法?添加 /var/lib/docker/overlay2/container_id/merged 是一种选择,因为动态容器性质 clamd.conf 需要在每个容器事件上更新。但即使添加了路径,ClamAV 也不会检测到容器中的恶意文件。

运行 每个容器的 ClamAV 会产生巨大的内存开销,尤其是对于小型容器。

链接集合:

是的,fanotify 仅监控 运行 所在的挂载命名空间中的事件。

我有一个带有补丁 ClamAV 的解决方案。

  1. 必须使用ClamAV < 0.102.0,因为扫描和检测分离:无法扫描检测到的文件,因为从容器的角度观察路径
  2. OnAccessMount 不起作用,因为您必须在 ClamAV 配置中列出每个挂载然后重新启动并且 docker 即时创建挂载
  3. 必须使用 overlayfs 而不是 LVM,这样 ClamAV 才能访问挂载
  4. OnAccessIncludePath 不起作用,因为文件和文件夹枚举方法不遍历文件系统(不扫描指定路径的装载)

我能够让 OnAccessIncludePath 使用我发布到 clamav-devel 邮件列表的补丁:https://lists.gt.net/clamav/devel/77347#77347.

我最终得到了一个使用 fanotify 进行静态挂载的进程和一个使用 inotify 监视 /var/lib/docker 临时挂载的进程。每个容器有 2 个实例仍然比 1 个好得多。我做了相当多的负载测试,并且从我邮寄列表的那一刻起就已经在生产中使用了补丁。

Sophos 不适合我,但我很快就放弃了。

现在 fanotify 可以监视整个文件系统的事件,而不管挂载命名空间如何。您需要将标志 FAN_MARK_FILESYSTEMFAN_MARK_ADD (FAN_MARK_ADD | FAN_MARK_FILESYSTEM) 一起使用。来自 fanotify_mark man page 的片段是:

FAN_MARK_FILESYSTEM (since Linux 4.20)
       Mark the filesystem specified by pathname.  The filesystem
       containing pathname will be marked.  All the contained
       files and directories of the filesystem from any mount
       point will be monitored.