Даже самые известные и крутые 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 команды
freshclam
- без параметров, для запуска обновления сигнатур перед каждым сканом.сlamdscan -i --multiscan --move=/Users/handleman/quarantine ~
- непосредственно, сам сканер — нацеленный на каталог ‘~’ (домашний каталог активного пользователя) и, так же, попросили его складывать инфицированные файлы в каталог~/quarantine
всего лишь для собственного удобства, повторюсь, поигравшись с конфигомclamd.conf
можно сделать многое, например удалять инфицированные файлы автоматически.
С конфигурацией clamAV покончено, впереди самое интересное:
Шаг 2. Запуск сканера ClamAV по расписанию в MacOs
Чтобы приступить, необходимо немного углубится в принципы работы процессов (демонов) в macOs. Официаьная документация от Aplle
Если, вкратце и своими словами, то для того, чтобы запускать свои скрипты автоматически или по расписанию мы должны создать свой кастомный демон со своим кастомным конфигом, где будет все: и путь к исполняемому скрипту, и различные параметры демона и параметры запуска и расписания вызова.
Технически это будут 2 простых действия:
- Создаем два XML файла конфигурации демона с расширением.plist в специально отведенных системой местах.
- “Скармливаем” эти файлы утилите
launchctl
За работу с демонами в macOs отвечает универсальный Open Source фреймворк под названием launchd. Регистрация созданных демонов/процессов происходит через утилиту launchctl в составе этого фреймворка.
Важно понимать, что в рамках MacOs существуют 2 типа демонов:
- Agents запускаются от лица залогиненного пользователя в момент логина.
- Daemons запускаются с правами root и работают в фоне независимо от того какой активный юзер залогинен и залогинен ли кто-нибудь вообще.
“Агенты” и “Демоны” в свою очередь, бывают “системные”, “глобальные” и, так же, “Агент” может быть “локальным” для одного конкретного пользователя.
Вообще эта тема, сама по себе, интересная и дает полную свободу автоматизации системы: хоть бэкапы, хоть антивирус, хоть что угодно… и, в момент логина, и фоном независимо от пользователя вообще.
В этом конкретном случае все очень просто - Я хочу чтобы:
- При каждом моем логине запускался процесс clamd.
- Раз в неделю, по понедельникам в час ночи запускался апдейт сигнатур антивируса и запуск сканера.
Для этих целей нам нужен как раз “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
.
Вообще, покопавшись, в конфигах, теоретически, можно сделать еще много чего, например нотификации, но для моих нужд данного сетапа волне достаточно.