Clamav

Материал из sysadm
Перейти к навигации Перейти к поиску

Нужен ли антивирус на Linux

Oracle Linux

Oracle Linux 8

# clam есть в репозитории EPEL
dnf install oracle-epel-release-el8

# установка антивируса
dnf install clamav

# установка пакета для обновления баз
dnf install clamav-update

# список пакетов в репозиториях, связанных с clam
dnf list | grep -i clam

Oracle Linux 7

# clam есть в репозитории EPEL
yum install oracle-epel-release-el7

# установка антивируса (clamav-update ставится как зависимый)
yum install clamav

# список пакетов в репозиториях, связанных с clam
yum list | grep -i clam

Список исполняемых файлов (OL8)

[root]# ls /bin /sbin | grep clam

clambc          # ?
clamconf        # вывод информации о текущей конфигурации
clamdscan       # исполняемый файл сервиса сканирования clamd (в systemd нужно добавлять вручную)
clamdtop        # утилита мониторинга одного или нескольких сервисов clamd
clamscan        # утилита запуска сканирования из командной строки 
clamsubmit      # утилита уведомления поддержки о ложно позитивных срабатываниях
freshclam       # утилита/сервис автоматического обновления (в systemd имеет имя clamav-freshclam)
clamonacc       # сервис онлайн сканирования и клиент clamd, отслеживает в ядре события доступа к файлам и передает clamd запрос на сканирование (в systemd нужно добавлять вручную)

Solaris 10

http_proxy=http://172.16.9.77:3128; export http_proxy;
https_proxy=http://172.16.9.77:3128; export https_proxy;

# установка csw
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U

# установка clamav
/opt/csw/bin/pkgutil -y -i clamav 

# список файлов пакета
/usr/sbin/pkgchk -L CSWclamav

Конфигурация

# конфигурация обновления
vi /etc/opt/csw/freshclam.conf
--------------------------
UpdateLogFile /var/log/clamav/freshclam.log
--------------------------

mkdir /var/log/clamav
chown clamav:bin /var/log/clamav

# каталог баз по умолчанию (может зависеть от опций установки)
/var/opt/csw/clamav/db

# конфигурация сервиса clamd
/etc/opt/csw/clamd.conf

Сканирование

Команды

# запуск сканирования текущего каталога
clamscan

# вывод информации о текущей конфигурации всех компонентов clamav (см. man clamconf)
clamconf

Обновление антивирусных баз

Сервис обновления

# антивирусные базы
ls -lh /var/lib/clamav/

# настройка обновления через прокси
vi /etc/clamav/freshclam.conf
-----------------------------------
HTTPProxyServer 192.168.0.100
HTTPProxyPort 3128
-----------------------------------

# запуск обновления вручную
freshclam

# частота обновления ограничена
# если нужно повторить обновление в тестовых целях, то можно удалить рабочий файл
rm -f /var/lib/clamav/freshclam.dat

# сервис для автоматического обновления
systemctl status clamav-freshclam

Обновление антивирусных баз из России

В 2022 году был закрыт доступ из РФ.

# отключите сервис обновления (если включен)
systemctl stop clamav-freshclam
systemctl disable clamav-freshclam

### Способ 1 (ручной)
# скачайте базы через VPN или с альтернативных зеркал
# необходимо учитывать, что используемая вами версия clamav должна поддерживать базы, которые вы скачиваете вручную
wget http://database.clamav.net/main.cvd
wget http://database.clamav.net/daily.cvd
wget http://database.clamav.net/bytecode.cvd

# положите базы в каталог
systemctl stop clamav-freshclam
cp -a *.cvd /var/lib/clamav/
chown clamupdate:clamudate /var/lib/clamav/*.cvd
chmod 644 /var/lib/clamav/*.cvd

### Способ 2 (платное зеркало) (не проверял)
vi /etc/clamav/freshclam.conf
-----------------------------------
PrivateMirror https://tendence.ru/clamav
ScriptedUpdates no
-----------------------------------

### Способ 3 (бесплатные зеркала)
# https://packages.microsoft.com/clamav                    (проверено 19.09.2023, период обновления более 12 часов)
# https://unlix.ru/clamav                                  (проверено 19.09.2023, период обновления более 12 часов)
# https://pivotal-clamav-mirror.s3.amazonaws.com           (проверено 19.09.2023, период обновления менее 12 часов)

# пример замены официального зеркала на альтернативное
# альтернативные зеркала обычно не поддерживают ScriptedUpdates
vi /etc/clamav/freshclam.conf
-----------------------------------
#DatabaseMirror database.clamav.net
DatabaseMirror packages.microsoft.com/clamav
ScriptedUpdates no
-----------------------------------

Настройка логирования обновления

mkdir /var/log/freshclam
chwon clamupdate:clamupdate /var/log/freshclam

vi /etc/clamav/freshclam.conf
-----------------------------------
UpdateLogFile /var/log/freshclam/freshclam.log
LogFileMaxSize 2M
LogRotate yes
-----------------------------------

Процесс обновления

Ссылка по теме

Как freshclam обновляет базы с внешнего зеркала

  1. при каждом цикле проверки freshclam запрашивает запись типа TXT в домене current.cvd.clamav.net
  2. локальный резолвер хоста пересылает DNS запрос своему DNS серверу и получает ответ в виде строки "0.103.10:62:27031:1694755740:1:90:49192:334"
  3. freshclam парсит строку и получает номера актуальных версий файлов баз
  4. Обновление
    • Если ScriptedUpdates yes, то качает последовательно файлы изменений между актуальной и локальной версиями daily-<версия>.cdiff и применяет изменения к локальной базе
    • Если ScriptedUpdates no, то качает весь файл базы
    • скачанная или собранная по изменениям база проверяется на корректность и только после этого замещает локальную базу
    • файлы изменений не сохраняются в каталоге локальной базы

Пример определения версий clamav из DNS

host -t txt current.cvd.clamav.net
current.cvd.clamav.net descriptive text "0.103.10:62:27031:1694755740:1:90:49192:334"

"0.103.10:62:27031:1694755740:1:90:49192:334"
1, 0.103.10    - версия clam
2, 62          - версия main.cvd
3, 27031       - версия daily.cvd
4, 1694755740  - ?
5, 1           - ?
6, 90          - f-level (? не знаю что это)
7, 49192       - ?
8, 334         - версия bytecode.cvd

Проблема не актуальной версии базы на внешнем зеркале

  • Если версия локальной базы ниже той что возвращает DNS запрос, то запускается скачивание файла базы
  • После скачивания, файл проверяется и определяется его фактическая версия
  • Если фактическая версия ниже той что была получена из DNS запроса, то обновление считается не успешным
  • Если обновление было не успешно, то весь процесс повторяется снова, количество попыток на каждое зеркало определяется параметром MaxAttempts
  • При следующем цикле проверки все выше перечисленное повторяется снова
  • Таким образом, если на внешнем зеркале лежит не актуальная база, то она будет постоянно скачиваться, пока на зеркало не выложат актуальную базу


Важные параметры

# обновление с внешнего зеркала, актуальная версия определяется по DNS запросу
DatabaseMirror https://<mirror_host>

# обновление с частного зеркала, выполняется запрос If-Modified-Since для определения необходимости скачивания файла
# если этот параметр определен, то параметр DatabaseMirror игнорируется
PrivateMirror http://your_mirror.host.local

# число проверок в день, по умолчанию 12, т.е. обновление запускается каждые 2 часа
Checks <num_checks_per_day>

# число повторов на каждое зеркало в случае неудачи
MaxAttempts <num>

Локальное зеркало

Как организовать локальное зеркало?

  1. установить пакеты clamav-update, nginx
  2. настроить сервис clamav-freshclam на автоматичесокое обновление с внешнего зеркала
  3. настроить в nginx сайт, чтобы с него были доступны на скачивание файлы антивирусных баз
  4. на хостах, которые должны обновляться с вашего зеркала, необходимо указать зеркало через параметр PrivateMirror <your_mirror_url>, чтобы исключить проблему не актуальной версии

Внешнее зеркало

Для внешнего зеркала желательно предоставление diff файлов. Не знаю, можно ли настроить freshclam так чтобы он сохранял diff файлы. Если нет, то можно на зеркале вместо freshclam использовать собственный скрипт, который должен решать ту же задачу, но с сохраненеием diff файлов.

Пример конфигурации nginx для зеркала

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    types {
        application/octet-stream cvd;
    }
    default_type        application/octet-stream;

    server {
        listen       80 default_server;
        server_name  _;
        root         /var/lib/clamav;

        location / {
            deny all;
            location ~ "\.(cvd)$" {
                allow all;
            }
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

Обратный кэширующий прокси вместо зеркала

Привожу как идею (не проверял)

  • Вместо зеркала можно настроить обратный кэширующий proxy на nginx
  • Указать хост обратного прокси вместо зеркала
  • Все хосты будут обращаться к обратному прокси как к зеркалу, файлы баз будут качаться из интернета и храниться в кэше некоторый период
  • Возможна ситуация, когда хост получит по DNS информацию о выходе новой версии базы, начнет качать ее и получит старый файл из кэша

Графический интерфейс

Графический интерфейс называется ClamTk где взять и как поставить не разбирался.