Антивирус в docker контейнере - работает ли fanotify между хостом и контейнером? - PullRequest
4 голосов
/ 03 февраля 2020

Мне нужно реализовать антивирусное сканирование при доступе к файлам внутри docker контейнеров с использованием программного обеспечения с открытым исходным кодом. Clamav On-Access работает нормально, но имеет некоторые требования и ограничения:

  • требует возможности CAP_SYS_ADMIN для работы внутри контейнера
  • необходимо запускать для каждого контейнера, не для хоста
  • требуется 850 МБ резидентной памяти для подписей в каждом работающем контейнере, даже небольшого

Имеет ли это ограничение - «fanotify не работает для событий контейнера при просмотре с хоста», действительно существует или я просто неправильно настроил ClamAV? У меня нет глубоких знаний о том, как fanotify работает с пространствами имен, но для меня это выглядит как ограничение ядра.

ОБНОВЛЕНИЕ: Есть ли обходные пути для этого ограничения? Добавление /var/lib/docker/overlay2/container_id/merged является одним из вариантов, так как из-за динамического c характера контейнера clamd.conf необходимо обновлять при каждом событии контейнера. Но даже при добавленном пути ClamAV не обнаруживает вредоносные файлы в контейнерах.

Запуск ClamAV для каждого контейнера создает огромные накладные расходы памяти, особенно для небольших контейнеров.

Сбор ссылок:

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

У меня есть решение с исправленным ClamAV.

  1. Необходимо использовать ClamAV <0.102.0 из-за разделения сканирования и обнаружения: обнаруженные файлы не могут быть проверены, так как путь наблюдается из контейнерная точка зрения </li>
  2. OnAccessMount не работает, потому что вы должны перечислить каждое монтирование в конфигурации ClamAV, а затем перезапустить и docker создать монтирования на лету
  3. Необходимо использовать оверлеи, а не LVM, поэтому ClamAV может получить доступ к монтированию
  4. OnAccessIncludePath не работает, потому что метод перечисления файлов и папок не пересекает файловые системы (не сканирует за пределами монтирования по указанному пути)

Я был в состоянии заставить OnAccessIncludePath работать с патчем, который я разместил в списке рассылки clamav-devel: https://lists.gt.net/clamav/devel/77347#77347.

В итоге у меня был один процесс с использованием fanotify для stati c монтирования и один с использованием inotify для мониторинга / var / lib / docker эфемерные монтирования. Наличие 2 экземпляров по-прежнему намного лучше, чем 1 на контейнер. Я провел небольшое нагрузочное тестирование, и патч был в производстве примерно с того времени, когда я отправил по почте список.

Sophos не работал для меня, но я сдался довольно быстро.

1 голос
/ 03 февраля 2020

Да, fanotify отслеживает только события в пространстве имен монтирования, в котором оно выполняется.

...