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

9
我需要使用开源软件在docker容器内实现文件的防病毒即时扫描解决方案。Clamav On-Access 可以正常工作但有一些要求和限制:
  • 需要 CAP_SYS_ADMIN 能力才能在容器内工作
  • 需要按容器而非按主机运行
  • 每个正在运行的容器需要850MB的常驻内存来存储签名,即使是小容器也是如此
这个限制 - "从主机监视容器事件时,fanotify无法工作",真的存在吗?还是我配置ClamAV时出了问题?我不太了解fanotify与命名空间的工作原理,但它看起来像是内核限制。
更新:是否有任何解决此限制的方法?添加/var/lib/docker/overlay2/container_id/merged是一个选项,由于容器的动态性,clamd.conf需要在每个容器事件上更新。但即使添加了路径,ClamAV也无法检测到容器中的恶意文件。
对于每个容器运行ClamAV会产生巨大的内存开销,特别是对于小容器。
链接收集:

2
你能在主机上运行 AV 并从要扫描的容器中公开 on-host 卷吗? - halfer
1
@halfer,这正是我现在要做的事情,即在inotify模式下运行一个clamd来监视/var/lib/docker/overlay2,以及在fanotify模式下运行第二个clamd来监视主机的/。 - mva
3个回答

4

我有一个使用打了补丁的ClamAV的解决方案。

  1. 必须使用ClamAV < 0.102.0,因为扫描和检测分开了:检测到的文件不能被扫描,因为路径是从容器角度观察的。
  2. OnAccessMount不起作用,因为你必须在ClamAV配置中列出每个挂载点,然后重启,而Docker会自动创建挂载点。
  3. 必须使用overlayfs而非LVM,这样ClamAV才能访问挂载点。
  4. OnAccessIncludePath不起作用,因为文件和文件夹枚举方法不遍历文件系统(不会扫描指定路径之外的路径)。

我通过在clamav-devel邮件列表上发布的一个补丁使OnAccessIncludePath功能正常工作:https://lists.gt.net/clamav/devel/77347#77347

我最终得到了一个进程,使用fanotify进行静态挂载,另一个使用inotify监视/var/lib/docker临时挂载点。有两个实例比每个容器一个实例要好得多。我进行了相当多的负载测试,并自从发送电子邮件至该列表以来一直在生产环境中使用这个补丁。

Sophos对我没用,但我很快就放弃了。


谢谢你的回答,对我很有帮助。你有想法吗?如何将你的补丁与更近期的ClamAV版本集成? - mva
顺便问一下,为什么我们需要两个ClamAV守护进程,不能只运行一个并监视/递归? - mva
1
ClamAV 0.102.0需要使用其他方式(例如inode条目ID)将信息从clamscan传递到clamd,而不是使用路径。 - user44127
1
OnAccessIncludePath和OnAccessMountPath是互斥的,OnAccessMountPath在进程级别上优先于OnAccessIncludePath,而不是按路径。 OnAccessPrevention仅与OnAccessMountPath(fanotify)一起使用。使用fanotify更有效率,不会使用inotify监视器,并且更不容易错过文件。 - user44127
1
看起来相反-https://lists.gt.net/clamav/users/74107:从这里的文档:https://github.com/Cisco-Talos/clamav-devel/blob/dev/0.101/docs/UserManual/Usage.md#On-access-Scanning使用clamd.conf OnAccessMountPath选项观察整个文件系统。虽然这将禁用即时预防,但它将避免由fanotify的阻止功能引起的潜在系统锁定。要使用OnAccessPrevention,您需要使用OnAccessIncludePath而不是OnAccessMountPath。 - mva
整个文件系统是正确的,但每个Docker容器都有不同的文件系统。您必须告诉ClamAV关于该文件系统,但事先不知道路径。 - user44127

1
现在,fanotify 可以跨文件系统监视事件,而不受挂载命名空间的限制。您需要使用标志 FAN_MARK_FILESYSTEM 以及 FAN_MARK_ADDFAN_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.

1
是的,fanotify只监视其运行的挂载命名空间中的事件。

感谢 @Douglas Leeder 的回答,我也测试了 Sophos Antivirus,它能够在主机上运行时检测容器中的病毒。不幸的是,由于某些限制,无法从官方网站下载。 - mva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接