8

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

  • 需要 CAP_SYS_ADMIN 能力才能在容器内工作
  • 需要按容器运行,而不是按主机运行
  • 每个正在运行的容器中的签名需要 850Mb 常驻内存,即使是很小的容器

这个限制 - “从主机观看时,fanotify 不适用于容器事件”,真的存在还是我只是错误配置了 ClamAV?我对 fanotify 如何与命名空间一起工作没有深入的了解,但对我来说它看起来像是内核限制。

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

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

链接集合:

4

3 回答 3

4

我有一个修补 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 不适合我,但我很快就放弃了。

于 2020-02-08T00:06:18.023 回答
1

是的,fanotify 只监视它正在运行的挂载命名空间中的事件。

于 2020-02-03T17:27:28.880 回答
0

现在fanotify可以跨文件系统监视事件,而不管挂载命名空间。您需要将标志与FAN_MARK_FILESYSTEM( FAN_MARK_ADD)一起使用FAN_MARK_ADD | FAN_MARK_FILESYSTEM。从这里的fanotify_mark手册页是片段:

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.
于 2022-02-03T14:18:50.157 回答