Итак, у нас есть почтовый сервер, работающий на Postfix. Теперь задача: добавить сканирование на вирусы. В качестве антивирусной программы будем использовать уже знакомый ClamAV. В качестве OS используется CentOS.

Установка ClamAV

yum install clamd

Далее приводим его конфиг к такому виду /etc/clamd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 LogFile /var/log/clamav/clamd.log
 LogFileMaxSize 0
 LogTime yes
 LogSyslog yes
 PidFile /var/run/clamav/clamd.pid
 TemporaryDirectory /var/tmp
 DatabaseDirectory /var/lib/clamav
 LocalSocket /tmp/clamd.sock
 FixStaleSocket yes
 TCPSocket 3310
 TCPAddr 127.0.0.1
 MaxConnectionQueueLength 30
 MaxThreads 50
 ReadTimeout 300
 User clam
 AllowSupplementaryGroups yes
 ScanPE yes
 ScanELF yes
 DetectBrokenExecutables yes
 ScanOLE2 yes
 ScanMail yes
 ScanArchive yes
 ArchiveBlockEncrypted no 

Установка Clamsmtp

Теперь нужно установить и сервис, который будет связывать Clamav и Postfix. Для начала установим его:

yum install clamsmtp

Его конфиг /etc/clamsmtpd.conf немного короче:

1
2
3
4
5
6
7
8
 OutAddress: 10026
 Listen: 127.0.0.1:10025
 ClamAddress: /tmp/clamd.sock
 Header: X-Virus-Scanned: ClamAV using ClamSMTP
 TempDirectory: /tmp
 Action: drop
 Quarantine: on
 User: clam

обратите внимание не строку Action:

  • drop - удалять (хорошая опция, без лишних разговоров)

  • bounce - возвращать отправителю (это может плохо сработать, ведь отправитель может быть несуществующем и сервер получит обратно письмо и, опять его проверив, опять вернуть отправителю)

  • pass - пропускать, уведомив получателя (тут уже на усмотрение пользователя, который всё равно откроет и получить “подарок”)

Настройка Postfix

Ок, теперь надо попросить Postfix использовать интересные нам возможности. Для этого правим конфигурацию:

Файл /etc/postfix/main.cf теперь будет содержать ещё одну строчку:

1
 content_filter = scan:[127.0.0.1]:10025

Файл /etc/postfix/master.cf получит немного больше строк:

1
2
3
4
5
6
7
8
9
10
11
12
 scan      unix  -       -       n       -       16      smtp
     -o smtp_send_xforward_command=yes
     -o smtp_tls_security_level=none
 127.0.0.1:10026 inet  n -       n       -       16      smtpd
     -o content_filter=
     -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
     -o smtpd_helo_restrictions=
     -o smtpd_client_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o mynetworks_style=host
     -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Запустите clamd и clamsmtpd и проверьте их наличие с помощью команды netstat -antpu | grep clam. У вас должны быть следующие строки:

1
2
 TCP        0      0 127.0.0.1:10025             0.0.0.0:*                   LISTEN      31534/clamsmtpd
TCP        0      0 127.0.0.1:3310              0.0.0.0:*                   LISTEN      31521/clamd

Перезапустите Postfix и проверьте, слушает ли он порт 10026. Итак, команда netstat -antpu | grep 10026. Результат должен быть такой:

1
TCP        0      0 127.0.0.1:10026             0.0.0.0:*                   LISTEN      31650/master

Возможные ошибки

Таковых не возникло, если у вас были, добавьте в описание.

Проверка корректности работы настроенного сервиса

Есть тестовая запись для проверки антивируса. Она достаточно проста:

1
 X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Вы можете из консоли отправить эту запись следующей командой:

1
 echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' | mail -s "virus test" mail@wikiadmin.net

Если все ок, в логах вы увидите подобную запись:

1
2
 Nov 22 18:21:49 domain postfix/smtp[31807]: 35C85B970002: to=<mail@wikiadmin.net>, relay=127.0.0.1[127.0.0.1]:10025, 
 delay=0.56, delays=0.51/0/0.04/0, dsn=2.0.0, status=sent (250 Virus Detected; Discarded Email)