Подключение антивирусного пакета BitDefender к MTA Postfix
Многие системные администраторы Linux задаются вопросом: «Какой почтовый сервер использовать и какой антивирус к нему установить?». Я предпочитаю Postfix и Bitdefender. последний мне понравился еще для ОС Windows, но к сожалению он является платным продуктом.
К счастью консольная версия для ОС Linux бесплатна и ее мы сможем научить работать с MTA Postfix. Чем и займемся.
Для начала берем BitDefender Linux Edition (бесплатная консольная версия) на официальном сайте продукта (http://bitdefender.ru) и его устанавливаем.
Далее нам необходим какой-либо скрипт для того, чтоб “связать” между собой MTA Postfix и BitDefender. Вот его нам и предстоит написать.
Определим задачи, которые он должен выполнять.
- Сохранять письмо в файл.
- Вызывать BitDefender для проверки файла.
- Анализировать результат проверки.
- В случае определения вируса уведомить пользователя о нахождении вируса и удалить письмо.
- Вести журналы работы.
В принципе ничего сложного в этом нет, поэтому я приведу просто код скрипта, а если что-то будет не понятно, то можно посмотреть документацию по PHP, где все очень хорошо расписано. Я лучше все равно не напишу.
#!/usr/bin/php <?php $config = array( 'bdcstart' => '/opt/bdc/bdc --all --mail --arc --disinfect', 'tmpdir' => '/var/spool/filter', 'antivirusemail' => 'paste antivirus email here', ); $file = $config['tmpdir']."/bdctmp.".rand(0, time()).".".rand(0, time()); define_syslog_variables(); openlog("bdc_postfix", LOG_PID | LOG_PERROR, LOG_LOCAL0); $stdin = file('php://stdin'); $stdin = implode('', $stdin); if ($handle = fopen($file, 'w')) { if (fwrite($handle, $stdin) === FALSE) { syslog(LOG_WARNING, "ERROR: Can't write to temp file"); closelog(); echo "Can't write to temp file!!!"; exit(75); } }else{ echo "Can't write to temp file!!!"; syslog(LOG_WARNING, "ERROR: Can't write to temp file"); closelog(); exit(75); } chmod($file, 0644); $content = `$config[bdcstart] $file`; $result = explode("\n", $content); while(list($key, $val) = each($result)){ if($key == 0){ $ver = $val; } if($key == 3){ list($tmp, $virus) = explode("infected: ", $val); list($tmp, $infile) = explode("(MIME part)=>", $val); list($infile, $tmp) = explode(" ", $infile); } if(substr($val, 0, 8) == "Infected"){ list($tmp, $count) = explode(":", $val); if($count != 0){ $arr = file($file); while(list($key, $val) = each($arr)){ if(substr($val, 0, 5) == "From:"){ list($tmp, $emailfrom) = explode(": ", $val); list($tmp, $emailfrom) = explode("<", $emailfrom); list($emailfrom, $tmp) = explode(">", $emailfrom); } if(substr($val, 0, 3) == "To:"){ list($tmp, $emailto) = explode(": ", $val); } if(substr($val, 0, 8) == "Subject:"){ list($tmp, $emailsubj) = explode(": ", $val); } } $emailfrom = trim($emailfrom); $emailto = trim($emailto); $emailsubj = trim($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 =& Mail::factory('sendmail', $params); $mail_object->send($recipients, $headers, $body); `cp $file /var/bdc/infected/`; `unlink $file`; syslog(LOG_WARNING, "INFECTED: Mail from $emailfrom for $emailto infected with $virus"); closelog(); echo "Infected with $virus"; exit(69); } } } $argv = ''; for($i=1; $i<=$_SERVER['argc']; $i++){ $argv .= $_SERVER['argv'][$i]." "; } system("/usr/sbin/sendmail $argv < $file", $retvar); syslog(LOG_WARNING, "OK: Message from $emailfrom for $emailto"); `unlink $file`; exit($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
Вот и все. Задача решена. Почта проверяется, вирусы блокируются, пользователи уведомляются.





