Даже самые известные и крутые Opensource проекты грешат своей недружелюбностью к пользователю и требуют от него различных усилий, порой требующих внушительных знаний и навыков, чтобы просто установить и заставить работать как надо. ClamAv не является исключением, а даже, скорее, гордо стоит в авангарде подобных тулзов.

В данном примере я все делал через bash shell, но, в целом — использовать можно все что угодно. Важен только принцип и конкретные файлы конфигов которые нужно будет подправить.

Шаг 1. Установка и настройка clamAV

Ставлю все через Brew

$ brew install clamav

Brew ложит сам clamAv в каталог /usr/local/etc/clamav, там же лежат и конфиги. Настраиваем нужный удобный путь для логов через конфиг:

$ cd /usr/local/etc/clamav
$ cp clamd.conf.sample clamd.conf
$ echo "LogFile /Users/handleman/log/clamd.log" >> clamd.conf

На этом шаге мы указали свой кастомный файл для лога, для удобства, размещенный в каталоге пользователя который в моем случае ‘/Users/handleman’. Просто чтобы не держать в голове дефолтный путь к логам или искать его каждый раз, чтобы посмотреть отчет.

Вообще файл конфига clamd.conf очень подробно задокументирован внутри, с примерами использования. Советую заглянуть туда, потратить время, и настроить конкретно под себя. Сделать с ним можно очень много, например включить режим “защиты в реальном времени” как у “настоящих” антивирусов включив параметр ScanOnAccess в конфиге.

Настройка утилиты freshclam

Freshclam нужна для апдейта базы сигнатур вирусов, работать с ней очень просто — нужно просто ее запустить дополнительных параметров передавать не нужно, только один раз настроить файл конфига - по тому же принципу что и сам clamv:

$ cd /usr/local/etc/clamav
$ cp freshclam.conf.sample freshclam.conf
$ echo "UpdateLogFile /Users/handleman/log/freshclam.log" >> freshclam.conf

Скрипт для запуска апдейта сигнатур и сканера

Принцип, по которому я планирую использовать clamAV у меня, следующий:

  • clamd запущенный в бэкграунд как процесс (daemon)
  • Запуск freshclam и сканера clamdscan “упакованные” в отдельный sh скрипт по расписанию, скажем, каждый понедельник ночью.

Создаем скрипт, содержащий команды запуска clamdscan и freshclam (каталог не важен, в моем случае это ~/projects/scripts):

$ mkdir ~/quarantine
$ cd ~/projects/scripts
$ touch avd.sh
$ chmod +x avd.sh
$ echo "#\!/usr/bin/env bash \n/usr/local/bin/freshclam && /usr/local/bin/clamdscan -i --multiscan --move=/Users/handleman/quarantine ~" >> avd.sh

Таким образом мы создали каталог “карантина” ~/quarantine куда мы попросили clamAV складывать зараженные файлы и указали каталог ~ (домашний каталог текущего пользователя) как отправную точку для скана.

Мы создали файл avd.sh, в котором 2 команды

  1. freshclam - без параметров, для запуска обновления сигнатур перед каждым сканом.
  2. сlamdscan -i --multiscan --move=/Users/handleman/quarantine ~ - непосредственно, сам сканер — нацеленный на каталог ‘~’ (домашний каталог активного пользователя) и, так же, попросили его складывать инфицированные файлы в каталог ~/quarantine всего лишь для собственного удобства, повторюсь, поигравшись с конфигом clamd.conf можно сделать многое, например удалять инфицированные файлы автоматически.

С конфигурацией clamAV покончено, впереди самое интересное:

Шаг 2. Запуск сканера ClamAV по расписанию в MacOs

Чтобы приступить, необходимо немного углубится в принципы работы процессов (демонов) в macOs. Официаьная документация от Aplle

Если, вкратце и своими словами, то для того, чтобы запускать свои скрипты автоматически или по расписанию мы должны создать свой кастомный демон со своим кастомным конфигом, где будет все: и путь к исполняемому скрипту, и различные параметры демона и параметры запуска и расписания вызова.

Технически это будут 2 простых действия:

  1. Создаем два XML файла конфигурации демона с расширением.plist в специально отведенных системой местах.
  2. “Скармливаем” эти файлы утилите launchctl

За работу с демонами в macOs отвечает универсальный Open Source фреймворк под названием launchd. Регистрация созданных демонов/процессов происходит через утилиту launchctl в составе этого фреймворка.

Важно понимать, что в рамках MacOs существуют 2 типа демонов:

  1. Agents запускаются от лица залогиненного пользователя в момент логина.
  2. Daemons запускаются с правами root и работают в фоне независимо от того какой активный юзер залогинен и залогинен ли кто-нибудь вообще.

“Агенты” и “Демоны” в свою очередь, бывают “системные”, “глобальные” и, так же, “Агент” может быть “локальным” для одного конкретного пользователя.

Вообще эта тема, сама по себе, интересная и дает полную свободу автоматизации системы: хоть бэкапы, хоть антивирус, хоть что угодно… и, в момент логина, и фоном независимо от пользователя вообще.

В этом конкретном случае все очень просто - Я хочу чтобы:

  1. При каждом моем логине запускался процесс clamd.
  2. Раз в неделю, по понедельникам в час ночи запускался апдейт сигнатур антивируса и запуск сканера.

Для этих целей нам нужен как раз “System Agent” для этого, в каталоге /Library/LaunchAgents/ мы создадим файл com.cisco.clamd.plist (название может быть любым главное чтобы оно было уникальным и с расширением ‘.plist’)

/Library/LaunchAgents/com.cisco.clamd.plist с содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.cisco.clamd</string>
    <key>Program</key>
    <string>/usr/local/sbin/clamd</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

В котором, мы просим фреймворк launchd запустить clamd (/usr/local/sbin/clamd) один раз при каждом логине текущего пользователя. С помощью говорящего за себя параметра RunAtLoad.

Причем KeepAlive в состоянии false, иначе система несколько раз в минуту будет перезапускать этот процесс что скажется на производительности, чего нам, в нашей простой задаче не нужно.

Создадим второй аналогичный конфиг, но уже для, ранее созданного, ~/scripts/avd.sh и попросим launchd запускать его по расписанию. Для этого, в каталоге ~/Library/LaunchAgents/ мы создадим файл com.cisco.clamdscan.plist

~/Library/LaunchAgents/com.cisco.clamdscan.plist с содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.cisco.clamdscan</string>
    <key>Program</key>
    <string>/Users/handleman/projects/scripts/avd.sh</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>1</integer>
        <key>Minute</key>
        <integer>0</integer>
        <key>Weekday</key>
        <integer>1</integer>
    </dict>
</dict>
</plist>

Конфиг примерно такой же, за исключением того, что нам не надо запускать наш скрипт (/Users/handleman/projects/scripts/avd.sh) во время старта системы, а нужно запускать по расписанию раз в неделю согласно указанному параметру StartCalendarInterval и его параметрам

Последний штрих

Для того чтобы запустить демоны не дожидаясь перезагрузки системы, загрузим их в память с помощью утилиты launchctl

$ sudo launchctl load /Library/LaunchAgents/com.cisco.clamd.plist
$ launchctl load ~/Library/LaunchAgents/com.cisco.clamdscan.plist
$ launchctl start com.cisco.clamd

Вот и все! Теперь у вас в фоне работает антивирус ClamAv автоматически сканирующий ваш каталог пользователя раз в неделю, и пишет в ваш лог файл, откуда вы можете наблюдать всю активность сканера, так же инфицированные файлы отправляются в карантин ~/quarantine.

Вообще, покопавшись, в конфигах, теоретически, можно сделать еще много чего, например нотификации, но для моих нужд данного сетапа волне достаточно.