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

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

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

Для начала берем BitDefender Linux Edition (бесплатная консольная версия) на официальном сайте продукта (http://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
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

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

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

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

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

Пропала собака. yandex.ru не предлагать.
Яндекс.Метрика beget