Многие системные администраторы Linux задаются вопросом: «Какой почтовый сервер использовать и какой антивирус к нему установить?». Я предпочитаю Postfix и Bitdefender. последний мне понравился еще для ОС Windows, но к сожалению он является платным продуктом.
К счастью консольная версия для ОС Linux бесплатна и ее мы сможем научить работать с MTA Postfix. Чем и займемся.
Для начала берем BitDefender Linux Edition (бесплатная консольная версия) на официальном сайте продукта (http://bitdefender.ru) и его устанавливаем.
Далее нам необходим какой-либо скрипт для того, чтоб «связать» между собой MTA Postfix и BitDefender. Вот его нам и предстоит написать.
Определим задачи, которые он должен выполнять.
- Сохранять письмо в файл.
- Вызывать BitDefender для проверки файла.
- Анализировать результат проверки.
- В случае определения вируса уведомить пользователя о нахождении вируса и удалить письмо.
- Вести журналы работы.
В принципе ничего сложного в этом нет, поэтому я приведу просто код скрипта, а если что-то будет не понятно, то можно посмотреть документацию по PHP, где все очень хорошо расписано. Я лучше все равно не напишу.
#!/usr/bin/php <?php $config = ( 'bdcstart' => '/opt/bdc/bdc --all --mail --arc --disinfect', 'tmpdir' => '/var/spool/filter', 'antivirusemail' => 'paste antivirus email here', ); $file = $config['tmpdir']."/bdctmp.".(0, ()).".".(0, ()); (); ("bdc_postfix", LOG_PID | LOG_PERROR, LOG_LOCAL0); $stdin = ('php://stdin'); $stdin = ('', $stdin); if ($handle = ($file, 'w')) { if (($handle, $stdin) === FALSE) { (LOG_WARNING, "ERROR: Can't write to temp file"); (); "Can't write to temp file!!!"; (75); } }else{ "Can't write to temp file!!!"; (LOG_WARNING, "ERROR: Can't write to temp file"); (); (75); } ($file, 0644); $content = `$config[bdcstart] $file`; $result = ("\n", $content); while(($key, $val) = ($result)){ if($key == 0){ $ver = $val; } if($key == 3){ ($tmp, $virus) = ("infected: ", $val); ($tmp, $infile) = ("(MIME part)=>", $val); ($infile, $tmp) = (" ", $infile); } if(($val, 0, 8) == "Infected"){ ($tmp, $count) = (":", $val); if($count != 0){ $arr = ($file); while(($key, $val) = ($arr)){ if(($val, 0, 5) == "From:"){ ($tmp, $emailfrom) = (": ", $val); ($tmp, $emailfrom) = ("<", $emailfrom); ($emailfrom, $tmp) = (">", $emailfrom); } if(($val, 0, 3) == "To:"){ ($tmp, $emailto) = (": ", $val); } if(($val, 0, 8) == "Subject:"){ ($tmp, $emailsubj) = (": ", $val); } } $emailfrom = ($emailfrom); $emailto = ($emailto); $emailsubj = ($emailsubj); include_once("Mail.php"); $recipients = $emailto; $headers['From'] = $config['antivirusemail']; $headers['To'] = $emailto; $headers['Subject'] = "The virus has been detected"; $body = "The Postfix mail system: Detected virus in e-mail message: From: ".$emailfrom." To: ".$emailto." Subject: ".$emailsubj." Virus info: $virus. Infected file: $infile Please notify sender about this if it legal sender! Message scanned by BitDefender $ver. Copyright: Silver Ghost AKA Dmitriy Lyalyuev http://silver.uran.com.ua "; $params['sendmail_path'] = '/usr/sbin/sendmail'; $mail_object =& ::factory('sendmail', $params); $mail_object->send($recipients, $headers, $body); `cp $file /var/bdc/infected/`; `$file`; (LOG_WARNING, "INFECTED: Mail from $emailfrom for $emailto infected with $virus"); (); "Infected with $virus"; (69); } } } $argv = ''; for($i=1; $i<=$_SERVER['argc']; $i++){ $argv .= $_SERVER['argv'][$i]." "; } ("/usr/sbin/sendmail $argv < $file", $retvar); (LOG_WARNING, "OK: Message from $emailfrom for $emailto"); `$file`; ($retvar); ?>
Сохраняем это все дело в файл /etc/postfix/bdc_postfix и назначаем права chmod 755 /etc/postfix/bdc_postfix. Если владелец файла не root, то postfix может ругаться при старте.
Далее создаем каталог /var/spool/filter (если его нет еще) и ставим на него права 775 и назначаем пользователя user.
После всего этого прописываем фильтр в файл master.cf вместо строки:
smtp inet n – n – - smtpd
строку
smtp inet n – n – - smtpd -o content_filter=bdc:dummy
и в конец файла добавляем:
bdc unix – n n – 50 pipe
flags=Rq user=user argv=/etc/postfix/bdc_postfix -f ${sender} – ${recipient}
После всего проделанного перезапускаем Postfix
postfix reload
Вот и все. Задача решена. Почта проверяется, вирусы блокируются, пользователи уведомляются.

Рубрики 