Подключение антивирусного пакета BitDefender к MTA Postfix

Многие системные администраторы Linux задаются вопросом: «Какой почтовый сервер использовать и какой антивирус к нему установить?». Я предпочитаю Postfix и Bitdefender. последний мне понравился еще для ОС Windows, но к сожалению он является платным продуктом.

К счастью консольная версия для ОС Linux бесплатна и ее мы сможем научить работать с MTA Postfix. Чем и займемся.

Для начала берем BitDefender Linux Edition (бесплатная консольная версия) на официальном сайте продукта (https://bitdefender.ru) и его устанавливаем.

Далее нам необходим какой-либо скрипт для того, чтоб “связать” между собой MTA Postfix и BitDefender. Вот его нам и предстоит написать.

Определим задачи, которые он должен выполнять.

  1. Сохранять письмо в файл.
  2. Вызывать BitDefender для проверки файла.
  3. Анализировать результат проверки.
  4. В случае определения вируса уведомить пользователя о нахождении вируса и удалить письмо.
  5. Вести журналы работы.

В принципе ничего сложного в этом нет, поэтому я приведу просто код скрипта, а если что-то будет не понятно, то можно посмотреть документацию по 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
https://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

Вот и все. Задача решена. Почта проверяется, вирусы блокируются, пользователи уведомляются.

Вы можете оставить комментарий, или поставить трэкбек со своего сайта.

Нет комментариев

(Обязательно)
(Обязательно, не публикуется)

Админ не заснул, он перегружается!
beget