Postfix e Spam · 8 min read · Jan 17, 2026

Usuários Virtuais E Domínios Com Postfix, Courier, MySQL E SquirrelMail (Ubuntu 12.04 LTS) - Página 3

9 Instalar amavisd-new, SpamAssassin E ClamAV

Para instalar amavisd-new, spamassassin e clamav, execute o seguinte comando:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Depois, devemos configurar o amavisd-new. A configuração está dividida em vários arquivos que residem no diretório /etc/amavis/conf.d. Dê uma olhada em cada um deles para se familiarizar com a configuração. A maioria das configurações está boa, no entanto, devemos modificar três arquivos:

Primeiro, devemos habilitar o ClamAV e o SpamAssassin em /etc/amavis/conf.d/15-content_filter_mode descomentando as linhas @bypass_virus_checks_maps e @bypass_spam_checks_maps:

vi /etc/amavis/conf.d/15-content_filter_mode

O arquivo deve ficar assim:

| use strict; # Você pode modificar este arquivo para reabilitar a verificação de SPAM através do spamassassin # e para reabilitar a verificação de antivírus. # # Modo padrão de verificação de antivírus # Por favor, note que a verificação de antivírus está DESABILITADA por # padrão. # Se você deseja habilitá-la, por favor descomente as seguintes linhas: @bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); # # Modo padrão de verificação de SPAM # Por favor, note que a verificação de anti-spam está DESABILITADA por # padrão. # Se você deseja habilitá-la, por favor descomente as seguintes linhas: @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); 1; # garantir um retorno definido |

E então você deve dar uma olhada nas configurações de spam e nas ações para e-mails de spam/vírus em /etc/amavis/conf.d/20-debian_defaults. Não há necessidade de mudar nada se as configurações padrão estiverem boas para você. O arquivo contém muitas explicações, então não há necessidade de explicar as configurações aqui:

vi /etc/amavis/conf.d/20-debian_defaults

| [...] $QUARANTINEDIR = "$MYHOME/virusmails"; $quarantine_subdir_levels = 1; # habilitar a hash do diretório de quarentena $log_recip_templ = undef; # desabilitar entradas de log de nível-0 por destinatário $DO_SYSLOG = 1; # log via syslogd (preferido) $syslog_ident = 'amavis'; # tag de identificação do syslog, prependida a todas as mensagens $syslog_facility = 'mail'; $syslog_priority = 'debug'; # mude para info para descartar a saída de debug, etc $enable_db = 1; # habilitar uso de BerkeleyDB/libdb (SNMP e nanny) $enable_global_cache = 1; # habilitar uso de cache baseado em libdb se $enable_db=1 $inet_socket_port = 10024; # socket padrão de escuta $sa_spam_subject_tag = '*SPAM* '; $sa_tag_level_deflt = 2.0; # adicionar cabeçalhos de informação de spam se em, ou acima desse nível $sa_tag2_level_deflt = 6.31; # adicionar cabeçalhos 'spam detectado' nesse nível $sa_kill_level_deflt = 6.31; # aciona ações evasivas de spam $sa_dsn_cutoff_level = 10; # nível de spam além do qual um DSN não é enviado [...] $final_virus_destiny = D_DISCARD; # (dados não perdidos, veja a quarentena de vírus) $final_banned_destiny = D_BOUNCE; # D_REJECT quando MTA de front-end $final_spam_destiny = D_BOUNCE; $final_bad_header_destiny = D_PASS; # Propenso a falsos positivos (para spam) [...] |

Finalmente, edite /etc/amavis/conf.d/50-user e adicione a linha $pax=’pax’; no meio:

vi /etc/amavis/conf.d/50-user

| use strict; # # Coloque suas diretivas de configuração aqui. Elas substituirão aquelas em # arquivos anteriores. # # Veja /usr/share/doc/amavisd-new/ para documentação e exemplos das # diretivas que você pode usar neste arquivo # $pax='pax'; #------------ Não modifique nada abaixo desta linha ------------- 1; # garantir um retorno definido |

Depois, execute esses comandos para adicionar o usuário clamav ao grupo amavis e reiniciar o amavisd-new e o ClamAV:

adduser clamav amavis
/etc/init.d/amavis restart
/etc/init.d/clamav-freshclam restart
/etc/init.d/clamav-daemon restart

Agora precisamos configurar o Postfix para canalizar e-mails recebidos através do amavisd-new:

postconf -e ‘content_filter = amavis:[127.0.0.1]:10024’
postconf -e ‘receive_override_options = no_address_mappings’

Depois, adicione as seguintes linhas ao /etc/postfix/master.cf:

vi /etc/postfix/master.cf

| [...] amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks |

Então reinicie o Postfix:

/etc/init.d/postfix restart

Agora execute

netstat -tap

e você deve ver o Postfix ( master) escutando na porta 25 ( smtp) e 10025, e o amavisd-new na porta 10024:

root@server1:/etc/courier# netstat -tap
Conexões Internet ativas (servidores e estabelecidas)
Proto Recv-Q Send-Q Endereço Local           Endereço Estrangeiro         Estado       PID/Nome do Programa
tcp        0      0 localhost.localdo:10025 :                     LISTEN      25911/master
tcp        0      0 localhost.localdo:mysql :                     LISTEN      3895/mysqld
tcp        0      0 :http                  :                     LISTEN      4845/apache2
tcp        0      0 
:ssh                   :                     LISTEN      649/sshd
tcp        0      0 :smtp                  :                     LISTEN      25911/master
tcp        0      0 localhost.localdo:10024 
:                     LISTEN      24534/amavisd (mast
tcp        0      52 server1.example.com:ssh 192.168.0.199:4745      ESTABLISHED 847/0
tcp6       0      0 [::]:pop3               [::]:
                  LISTEN      20989/couriertcpd
tcp6       0      0 [::]:imap2              [::]:                  LISTEN      20921/couriertcpd
tcp6       0      0 [::]:ssh                [::]:
                  LISTEN      649/sshd
tcp6       0      0 [::]:smtp               [::]:                  LISTEN      25911/master
tcp6       0      0 [::]:imaps              [::]:
                  LISTEN      20958/couriertcpd
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      21026/couriertcpd
root@server1:/etc/courier#

 

10 Instalar Razor, Pyzor E DCC E Configurar o SpamAssassin

Razor, Pyzor e DCC são filtros de spam que usam uma rede de filtragem colaborativa. Para instalar Razor e Pyzor, execute

apt-get install razor pyzor

DCC não está disponível nos repositórios do Ubuntu 12.04, então o instalamos da seguinte forma:

cd /tmp
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z
tar xzvf dcc-dccproc.tar.Z
cd dcc-dccproc-1.3.142
./configure –with-uid=amavis
make
make install
chown -R amavis:amavis /var/dcc
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Agora precisamos dizer ao SpamAssassin para usar esses três programas. Edite /etc/spamassassin/local.cf e adicione as seguintes linhas a ele:

vi /etc/spamassassin/local.cf

| [...] #dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /etc/razor/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Então devemos habilitar o plugin DCC no SpamAssassin. Abra /etc/spamassassin/v310.pre e descomente a linha loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/spamassassin/v310.pre

| [...] # DCC - realizar verificações de mensagens DCC. # # DCC está desabilitado aqui porque não é open source. Veja a licença do DCC # para mais detalhes. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Você pode verificar sua configuração do SpamAssassin executando:

spamassassin --lint

Não deve mostrar nenhum erro.

Agora há um pequeno bug no script init do amavisd-new. Abra /etc/init.d/amavis…

vi /etc/init.d/amavis

… e comente a linha STOP=”–stop –quiet –pidfile $PIDFILE –name ${DAEMONNAME}” e adicione STOP=”–stop –quiet –pidfile $PIDFILE” em vez disso:

| [...] set -e START="--start --quiet --pidfile $PIDFILE --name ${DAEMONNAME} --startas ${DAEMON}" #STOP="--stop --quiet --pidfile $PIDFILE --name ${DAEMONNAME}" STOP="--stop --quiet --pidfile $PIDFILE" PARAMS= check_noncompatible_upgrade() [...] |

Reinicie o amavisd-new depois:

/etc/init.d/amavis restart

Agora atualizamos nossos conjuntos de regras do SpamAssassin da seguinte forma:

sa-update --no-gpg

Criamos um trabalho cron para que os conjuntos de regras sejam atualizados regularmente. Execute

crontab -e

para abrir o editor de trabalhos cron. Crie o seguinte trabalho cron:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Isso atualizará os conjuntos de regras a cada dois dias às 4:23h.

11 Notificações de Excesso de Quota

Se você deseja receber notificações sobre todas as contas de e-mail que estão acima da quota, então crie o arquivo /usr/local/sbin/quota_notify:

cd /usr/local/sbin/
vi quota_notify

| #!/usr/bin/perl -w # Autor <[email protected]> # # Este script assume que virtual_mailbox_base está definido # no arquivo main.cf do postfix. Este diretório é assumido para conter # diretórios que por sua vez contêm os maildirs dos seus usuários virtuais. # Por exemplo: # # -----------/ # | # | # home/vmail/domains/ # | | # | | # example.com/ foo.com/ # | # | # ----------------- # | | | # | | | # user1/ user2/ user3/ # | # | # maildirsize # use strict; my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('[email protected]'); my $CONAME = 'Minha Empresa'; my $COADDR = '[email protected]'; my $SUADDR = '[email protected]'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; #get virtual mailbox base from postfix config open(PCF, "< $POSTFIX_CF") or die $!; my $mboxBase; while () { next unless /virtual_mailbox_base\s*=\s*(.*)\s*/; $mboxBase = $1; } close(PCF); #assume one level of subdirectories for domain names my @domains; opendir(DIR, $mboxBase) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$mboxBase/$name"); push(@domains, $name); } closedir(DIR); #iterate through domains for username/maildirsize files my @users; chdir($mboxBase); each my $domain (@domains) { opendir(DIR, $domain) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$domain/$name"); push(@users, {"$name\@$domain" => "$mboxBase/$domain/$name"}); } } closedir(DIR); #get user quotas and percent used my (%lusers, $report); each my $href (@users) { foreach my $user (keys %$href) { my $quotafile = "$href->{$user}/maildirsize"; next unless (-f $quotafile); open(QF, "< $quotafile") or die $!; my ($firstln, $quota, $used); while () { my $line = $_; if (! $firstln) { $firstln = 1; die "Erro: arquivo de quota corrompido $quotafile" unless ($line =~ /^(\d+)S/ ); $quota = $1; last if (! $quota); next; } die "Erro: arquivo de quota corrompido $quotafile" unless ($line =~ /\s*(-?\d+)/); $used += $1; } close(QF); next if (! $used); my $percent = int($used / $quota * 100); $lusers{$user} = $percent unless not $percent; } } #send a report to the postmasters if ($MAIL_REPORT) { open(MAIL, "| $MAILPROG"); select(MAIL); map {print "Para: $_\n"} @POSTMASTERS; print "De: $COADDR\n"; print "Assunto: Relatório Diário de Quota.\n"; print "RELATÓRIO DIÁRIO DE QUOTA:\n\n"; print "----------------------------------------------\n"; print "| % USO | NOME DA CONTA |\n"; print "----------------------------------------------\n"; foreach my $luser ( sort { $lusers{$b} <=> $lusers{$a} } keys %lusers ) { printf("| %3d | %32s |\n", $lusers{$luser}, $luser); print "---------------------------------------------\n"; } print "\n--\n"; print "$CONAME\n"; close(MAIL); } #email a warning to people over quota if ($MAIL_WARNING) { foreach my $luser (keys (%lusers)) { next unless $lusers{$luser} >= $WARNPERCENT; # skip those under quota open(MAIL, "| $MAILPROG"); select(MAIL); print "Para: $luser\n"; map {print "BCC: $_\n"} @POSTMASTERS; print "De: $SUADDR\n"; print "Assunto: AVISO: Sua caixa de correio está $lusers{$luser}% cheia.\n"; print "Responder-a: $SUADDR\n"; print "Sua caixa de correio: $luser está $lusers{$luser}% cheia.\n\n"; print "Uma vez que sua caixa de e-mail tenha excedido sua quota mensal de armazenamento\n"; print "sua cobrança mensal será automaticamente ajustada.\n"; print "Por favor, considere excluir e-mails e esvaziar sua pasta de lixo eletrônico para liberar algum espaço.\n\n"; print "Entre em contato com <$SUADDR> para mais assistência.\n\n"; print "Obrigado.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Certifique-se de ajustar as variáveis no topo (especialmente o endereço de e-mail [email protected]).

Devemos tornar o arquivo executável:

chmod 755 quota_notify 

Execute

crontab -e

para criar um trabalho cron para esse script:

| 0 0 * * * /usr/local/sbin/quota_notify &> /dev/null |

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.