LINUX.ORG.RU
ФорумAdmin

CommuniGate Pro и ClamAV


0

0

Подскажите, можно ли скрестить сабж, CommuniGate уже стоит и работает, захотелось вот добавить антивирь, остановился на ClamAV, но чет не могу найти, как его прикрутить к уже работающему серверу.

anonymous
Ответ на: комментарий от fagot

страно, я думал тут только о линухе говорят :) Хорошо, Как прикрутить ClamAV под CommuniGate Pro, который установлен на SLES 9 (не микрософт0 :)

anonymous
()
Ответ на: комментарий от anonymous

Сдается мне что неважно, ClamAV или что-то еще... В общем делается это так.

Коннектимся на веб-интерфейс администрирования https://cgserver:8010 или какой там по умолчанию порт, у меня давно другой, по этом уже не помню =)

Идем в SETTINGS->General->Helpers. В Content Filtering назначаем алиас, путь к программе и время ее реакции.

Далее идкм в SETTINGS->Rules. Создаем новое правило, назначаем приоритет и в Name называем как-нить это правило. Далее жмем Edit и выбираем в Action->External Filter и в качетсве аргумента - имя алиаса из SETTINGS->General->Helpers.

То, куда ссылается алиас должно лежать в /var/CommuniGate Вот и все. Так присоединяется любой фильтр, что-бы все работало как надо он должен отвечать следующей спецификации (читать внизу) http://www.stalker.com/CommuniGatePro/VirusScan.html

Ну и естественно, мониторм логи по имени алиаса - если что не так, то там много полезного.

Удачи!

P.S. Сам просто недавно писал свой фильтр почты (статистика по количеству разосланных писем и их размеру за определенный промежуток времени и если превышение - то REJECT с такой-то причиной на такое-то время). Если что - могу поделиться исходниками.

boatman
()
Ответ на: комментарий от anonymous

Пожалуйста! Использыется база MySQL.
Вот скрипт.
-------------------------------
#!/usr/bin/perl -w

use strict;
use DBI;
use POSIX ":sys_wait_h";

$|=1;

my $VERSION      = "0.3.1"; ## Version String for this Filter
my $QUEUE_DIR    = "/var/CommuniGate";
my $BanSize      = 1024*1024*50;
my $BanInterval  = 240000;
my $BanTime      = 6000;
my $BanMailCount = 5000;
my $BanDomain    = ':';
my $BanExcept    = ':';

###########################################################
sub scanfile{
my($seqnum,$filename) = @_;
my $size = 0;
my $cur_line;
my $from = '';
my $to = '';
my $date = '';
my $tmp = 0;
my @arr;
my $dbh;
my $sth;
my $rv;
my @row;
my $DataSize = 0;
my $StatStart = '';
my $MailCount = 0;
my $TimeDiff = 0;

    open(INPUT ,"< $filename" ) or die "*[$seqnum] ERROR! Can't access file \'$filename\'\n";
    $size=(-s $filename);
    while($cur_line=<INPUT>)
    {
        $tmp += length $cur_line;
        if($cur_line eq "\n"){ last };
    };
    $size -= $tmp;
    while($cur_line=<INPUT>)
    {
        if($cur_line =~/^From:/)
        {
            @arr = split(/[' ',=,'\t']/,$cur_line);
            foreach $tmp (@arr)
            {
                if($tmp =~ /@/){ $from = $tmp; last; }
            }
            $from =~ s/[<,>,\",\',' ','\t']//ig;
            chomp $from;
            $from =~ tr/[A-Z]/[a-z]/;
        }elsif($cur_line =~/^To:/)
        {
            @arr = split(/[' ',=,'\t']/,$cur_line);
            foreach $tmp (@arr)
            {
                if($tmp =~ /@/){ $to = $tmp; last; }
            }
            $to =~ s/[<,>,\",\',' ','\t']//ig;
            chomp $to;
            $to =~ tr/[A-Z]/[a-z]/;
        }elsif($cur_line =~/^Date:/)
        {
            ($tmp,$date) = split('Date:',$cur_line);
            chomp $date;
            $date =~ s/^' '//;
            $date =~ s/^'\t'//;
        }elsif($cur_line eq "\n")
        {
            last;
        }
    }
    close(INPUT);
    if(!$to){ return ('OK'); }
    $dbh = DBI->connect('DBI:mysql:mailsize:MYSQL_SERVER_IP','DB_Name','PASS');
    ## CurrentBans;
    $sth = $dbh->prepare("SELECT Reason, BanStop, (NOW()-BanStop) FROM CurrentBans WHERE MailAddr=\'$to\';");
    $rv  = $sth->execute;
    if(@row = $sth->fetchrow_array)
    {
        if($row[2]<0) ## not now, yet;
        {
#           $dbh->disconnect();
            return ("REJECT Mail to $to is suspended up to $row[1] due to $row[0]");
        }else{
            $sth = $dbh->do("DELETE FROM CurrentBans WHERE MailAddr=\'$to\';");
        }
    }
    ## CurrentStat;
    $sth = $dbh->prepare("SELECT DataSize, MailCount, StatStart, (LastAccess-StatStart) FROM CurrentStat WHERE MailAddr=\'$to\';");
    $rv  = $sth->execute;
    if(@row = $sth->fetchrow_array)
    {
        $DataSize  = $row[0];
        $MailCount = $row[1];
        $StatStart = $row[2];
        $TimeDiff  = $row[3];

        $sth = $dbh->prepare("SELECT Parameter,Value FROM Parameters;");
        $rv  = $sth->execute;
        while(@row = $sth->fetchrow_array)
        {
            if   ($row[0] =~ /^BanSize$/     ){ $BanSize      = $row[1]; }
            elsif($row[0] =~ /^BanInterval$/ ){ $BanInterval  = $row[1]; }
            elsif($row[0] =~ /^BanTime$/     ){ $BanTime      = $row[1]; }
            elsif($row[0] =~ /^BanMailCount$/){ $BanMailCount = $row[1]; }
            elsif($row[0] =~ /^BanDomain$/   ){ $BanDomain   .= $row[1] . ':'; }
            elsif($row[0] =~ /^BanExcept$/   ){ $BanExcept   .= $row[1] . ':'; }
        };
        if($TimeDiff < $BanInterval)
        {
            my $domain;
            my $reason='';
            if($DataSize+$size > $BanSize)
            {
                ($tmp,$domain) = split('@',$to);
                if(($BanDomain =~ /:$domain:/)&&(!($BanExcept =~ /:$to:/)))
                {
                    $reason = "exceeds limit in $BanSize bytes of recieved information";
                }
            }elsif($MailCount+1 > $BanMailCount)
            {
                ($tmp,$domain) = split('@',$to);
                if(($BanDomain =~ /:$domain:/)&&(!($BanExcept =~ /:$to:/)))
                {
                    $reason = "exceeds limit in $BanMailCount recieved letters";
                }
            }
            if($reason ne '')
            {
                $sth = $dbh->do("DELETE FROM CurrentStat WHERE MailAddr=\'$to\';");
                $sth = $dbh->do("INSERT INTO CurrentBans (MailAddr,Reason,BanStart,BanStop,DataSize,MailCount) VALUES (\'$to\',\'$reason\',NOW(),NOW()+$BanTime,$DataSize+$size,$MailCount+1);");

                $sth = $dbh->do("INSERT INTO AllBans     (MailAddr,Reason,BanStart,BanStop,DataSize,MailCount) VALUES (\'$to\',\'$reason\',NOW(),NOW()+$BanTime,$DataSize+$size,$MailCount+1);");

                $dbh->disconnect();
                return ('OK'); ## but now mail banned!
            }
        }else{
#           $sth = $dbh->do("UPDATE CurrentStat SET DataSize=$size,MailCount=1,StatStart=NOW(),LastAccess=NOW() WHERE MailAddr=\'$to\';");
            $StatStart=''; #$DataSize=0;
            $MailCount=0;
            $sth = $dbh->do("DELETE FROM CurrentStat WHERE MailAddr=\'$to\';");
        }
    }
    ## CurrentStat;
    #$size += $DataSize;
    $MailCount++;
    if($StatStart)
    {
        $sth = $dbh->do("UPDATE CurrentStat SET DataSize=$size+$DataSize, MailCount=$MailCount, LastAccess=NOW() WHERE MailAddr=\'$to\';");
    }else{
        $sth = $dbh->do("INSERT INTO CurrentStat (MailAddr, DataSize, MailCount, StatStart, LastAccess) VALUES (\'$to\',$size,$MailCount,NOW(),NOW());");
    }
    ## FullStat;
    $sth = $dbh->do("INSERT INTO FullStat (MailTo,MailFrom,MailData,MailSize,MailTime) VALUES (\'$to\',\'$from\',\'$date\',$size,NOW());");
    $dbh->disconnect();
    return ('OK');
}

#############################################################################
my $request = <STDIN>;
my %pids;
my $pid;
my $one;
my $two;
my $three;

print "* CGMailSize $VERSION Ready!\n";

while ($request)
{
    # Give child processes a chance to be cleaned up...
    foreach $pid (keys %pids)
    {
        if (waitpid($pid, &WNOHANG) == -1)
        {
            # child $pid has terminated
            delete $pids{$pid};
        }
    }

    if ($request =~ /([0-9]+)\s*([A-Za-z]+)\s*(.*)/si)
    {
        $one=$1; $two=$2; $three=$3;
        chomp $three;
        if ($two =~ /INTF/i)
        {
            # CGPro wants to know our interface version (it's 2). We don't
            # really care what CGPro's interface version is, since all we
            # do is DISCARD or OK messages.
            print "$one INTF 1\n";
        }elsif ($two =~ /FILE/i)
        {
            $pid = 0;
            $pid = fork();

            if ($pid==0)
            {
#               if ( $debug==1 ) { print "*[$one] Starting data processing for \'$three\'\n"; }
                my $rez = &scanfile($one,$three);
               print "$one $rez\n"; ###!!!
##                print "$one OK\n";
                exit();
            }else
            {
                $pids{$pid} = 1;
            }
        }elsif ($two =~ /QUIT/i)
        {
            print "*[$one] QUIT Received: CGMailSize quitting.\n";
            print "$one OK\n"; ##!!!
            exit;
        }
    }
    $request = <STDIN>;
}
exit();

boatman
()
Ответ на: комментарий от boatman

Так создается база.

-- mailsize DB

USE mailsize;

DROP TABLE IF EXISTS Parameters;
CREATE TABLE Parameters (
  Parameter varchar(30) NOT NULL,
  Value     varchar(70) NOT NULL
) COMMENT='Parameters & values for additional tunning';

INSERT INTO Parameters (Parameter,Value) values ('BanSize',    (1024*1024*50));
INSERT INTO Parameters (Parameter,Value) values ('BanInterval',(240000));
INSERT INTO Parameters (Parameter,Value) values ('BanTime',    (6000));
INSERT INTO Parameters (Parameter,Value) values ('BanMailCount',5000);
INSERT INTO Parameters (Parameter,Value) values ('BanDomain','our_domain_2');
INSERT INTO Parameters (Parameter,Value) values ('BanDomain','our_domain_2');
INSERT INTO Parameters (Parameter,Value) values ('BanDomain','our_domain_3');
INSERT INTO Parameters (Parameter,Value) values ('BanDomain','our_domain_4');
INSERT INTO Parameters (Parameter,Value) values ('BanDomain','our_domain_5');
INSERT INTO Parameters (Parameter,Value) values ('BanExcept','my_mail1@our_domain1');
INSERT INTO Parameters (Parameter,Value) values ('BanExcept','my_mail2@our_domain2');


DROP TABLE IF EXISTS CurrentBans;
CREATE TABLE CurrentBans (
  MailAddr  varchar(45) UNIQUE NOT NULL,
  Reason    varchar(75) NOT NULL default '',
  BanStart  DATETIME NOT NULL,
  BanStop   DATETIME NOT NULL,
  DataSize  int NOT NULL default 0,
  MailCount int NOT NULL default 0
) COMMENT='Banned e-mail addresses';

DROP TABLE IF EXISTS CurrentStat;
CREATE TABLE CurrentStat (
  MailAddr   varchar(45) UNIQUE NOT NULL,
  DataSize   int NOT NULL default 0,
  MailCount  int NOT NULL default 0,
  StatStart  DATETIME NOT NULL,
  LastAccess DATETIME NOT NULL
) COMMENT='Current recieved data statistics';

DROP TABLE IF EXISTS FullStat;
CREATE TABLE FullStat (
  MailTo   varchar(45) NOT NULL,
  MailFrom varchar(45) NOT NULL,
  MailData varchar(45) NOT NULL,
  MailSize int NOT NULL default 0,
  MailTime DATETIME NOT NULL
) COMMENT='Full mail interchange sttistic';

DROP TABLE IF EXISTS AllBans;
CREATE TABLE AllBans (
  MailAddr varchar(45) NOT NULL,
  Reason   varchar(75) NOT NULL default '',
  BanStart DATETIME NOT NULL,
  BanStop  DATETIME NOT NULL,
  DataSize  int NOT NULL default 0,
  MailCount int NOT NULL default 0
) COMMENT='All banned e-mail addresses';

boatman
()
Ответ на: комментарий от boatman

Я постил как то с месяц назад вопрос на тему ограничения потока писем на ящики по размеру/количесиву/времени, но что-то ничего не нашлось, пришлось раскуривать маны и писать самому =)

boatman
()
Ответ на: комментарий от anonymous

народ а подскажите как настроить Web интерфейс для юзеров ? на каком он порту висит ? или надо самому создать виртуал хост в апаче и подсунуть туда web морду ? где вообще ет веб морда нах-ся ? PS с админской разоьрался, а вот с юзерской

anonymous
()
Ответ на: комментарий от anonymous

По умолчанию админский https://***:8010

А юзерский https://***:8100

По-моему так...

boatman
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.