Антивирус в контейнере докеров - работает ли fanotify между хостом и контейнером?

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

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

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

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

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

Коллекция ссылок:


person mva    schedule 03.02.2020    source источник
comment
Не могли бы вы запустить AV на хосте и открыть тома на хосте из контейнеров, которые вы хотите сканировать?   -  person halfer    schedule 04.02.2020
comment
@halfer, это именно то, что я сейчас пытаюсь сделать, запустить один clamd в режиме inotify для /var/lib/docker/overlay2 и второй clamd в режиме fanotify для / на хосте   -  person mva    schedule 05.02.2020


Ответы (2)


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

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

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

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

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

person user44127    schedule 08.02.2020
comment
спасибо за ответ, у меня работает, у вас есть идея, как ваш патч можно интегрировать с более свежими версиями clamav? - person mva; 09.02.2020
comment
Кстати, зачем нам два демона clamav и нельзя запустить только один с просмотром/рекурсивно? - person mva; 10.02.2020
comment
ClamAV 0.102.0 должен был бы передавать информацию из clamscan в clamd, используя что-то отличное от пути (идентификатор записи inode?). - person user44127; 11.02.2020
comment
OnAccessIncludePath и OnAccessMountPath являются взаимоисключающими, и OnAccessMountPath заменяет OnAccessIncludePath глобально для каждого процесса, а не по пути. OnAccessPrevention работает только с OnAccessMountPath (fanotify). Использование fanotify более эффективно, не использует часы inotify и с меньшей вероятностью пропустит файл. - person user44127; 11.02.2020
comment
выглядит наоборот - lists.gt.net/clamav/users/74107: From документация здесь: github.com/Cisco-Talos/clamav-devel/blob/dev/0.101/docs/ Наблюдайте за всей файловой системой, только используя параметр OnAccessMountPath clamd.conf. Хотя это отключит предотвращение доступа, это позволит избежать возможных зависаний системы, вызванных блокирующими функциями fanotify. Чтобы использовать OnAccessPrevention, вам нужно использовать OnAccessIncludePath вместо OnAccessMountPath. - person mva; 12.02.2020
comment
Правая вся файловая система, но каждый контейнер докеров имеет другую файловую систему. Вы должны сообщить ClamAV об этой файловой системе, но вы не будете знать путь заранее. - person user44127; 13.02.2020

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

person Douglas Leeder    schedule 03.02.2020
comment
спасибо за ответ @Douglas Leeder, я также протестировал Sophos Antivirus, он может обнаруживать вирусы в контейнере при работе на хосте. К сожалению, скачать его с официального сайта не удалось из-за некоторых ограничений. - person mva; 03.02.2020