PostfixDspam

A proposta desse how to é montar um proxy de antispam usando postfix e o DSPAM. Depois de analisados, os e-mails serão enviados para o servidor de destino, utilizando a tabela de transporte do postfix.

Não iremos abordar configurações do sistema operacional, assumindo que o leitor tenha experiência com sistemas *nix, banco de dados MySQL, MTA Postfix. Estou utilizando o path /usr/local/src como repositório dos fontes. Qualquer dúvida ou sugestão, por favor enviar para [MAILTO] hamilton@i2.com.br, obrigado.

Sistema:

*gcc version 3.4.5 gcc.gnu.org

*Slackware 10.2.0 slackware.org

*Apache 2.0.55 apache.org

*Perl 5.8.8 perl.org

*MySQL 4.1.9 mysql.org

*Dspam 3.6.4 dspam.nuclearelephant.com

*SHELL=/bin/tcsh

*Máquina i686

Abaixo segue a lista de softwares/pacotes que não iremos abordar configuração ou instalação, mas são requisitos para o sistema proposto:

- Slackware

- MySQL

- Perl

- Módulos do Perl, para que a interface web seja capaz de construir os gráficos.

Definindo path do repositório:

set BUILD_DIR=/usr/local/src

Criando usuários e grupos

Adicionando usuários e grupos: postfix:

groupadd -g 601 postfix
groupadd -g 602 postdrop
useradd -u 601 -g 601 postfix -d /dev/null -s /bin/false

dspam: O usuário do dspam também deve fazer parte do grupo postdrop

groupadd -g 2002 dspam
useradd -u 2002 -g 2002 -d /dev/null -c "DSPAM" -s /bin/false -G postdrop dspam

apache: O usuário do apache também deve fazer parte do grupo postdrop

groupadd -g 80 httpd
useradd -c Apache -d /usr/local/etc/httpd -g httpd -u 80 httpd -G postdrop

Compilando DSPAM

Compilando DSPAM, atenção para os paths do seu sistema

cd $BUILD_DIR

wget http://dspam.nuclearelephant.com/sources/dspam-3.6.4.tar.gz

tar xvfz dspam-3.6.4.tar.gz

cd dspam-3.6.4

( setenv CFLAGS '-O6 -march=i686' ;
./configure \
        --with-dspam-home=/var/dspam \
        --with-dspam-home-mode=770 \
        --with-dspam-home-owner=dspam \
        --with-dspam-home-group=postdrop \
        --with-dspam-mode=2510 \
        --with-dspam-owner=dspam \
        --with-dspam-group=postfix \
        --with-delivery-agent=/usr/sbin/sendmail \
        --with-storage-driver=mysql_drv \
        --with-mysql-includes=/usr/local/include/mysql \
        --with-mysql-libraries=/usr/local/lib/mysql \
        --enable-preferences-extension \
        --enable-virtual-users \
        --enable-daemon \
        --enable-large-scale \
        --enable-debug)

make

make install

mkdir -p /usr/local/share/dspam/

rehash

Criando tabelas do Dspam no MySQL

Criando estrutura no MySQL, partindo dos fontes do dspam talvez em seu mysql seja necessario utlizar senha para realizar as ações seguintes

cd $BUILD_DIR

cd dspam-3.6.4/src/tools.mysql_drv

mysql -e "create database dspam"

mysql -e "grant all on dspam.* to dspam@localhost identified by 'senha_do_usuario_dspam'"

mysql dspam < mysql_objects-4.1.sql

mysql dspam < virtual_user_aliases.sql

cp purge-4.1.sql /usr/local/share/dspam/

Criando entrada no crontab para manter o banco limpo, e rotacionar logs

crontab -e
#DSPAM
0 0 * * * /usr/local/bin/mysql -udspam -p'senha_do_usuario_dspam' dspam < /usr/local/share/dspam/purge-4.1.sql
0 0 * * * /usr/bin/sudo -u dspam /usr/local/bin/dspam_logrotate -a 30 -d /var/dspam/data

Compilando Postfix

Compilando postfix com suporte a mysql (supondo que o mysql esteja devidamente instalado), altere os includes e as libs conforme sua instalação.

cd $BUILD_DIR

wget http://postfix.it-austria.net/releases/official/postfix-2.2.9.tar.gz

tar xvfz postfix-2.2.9.tar.gz

cd postfix-2.2.9

( setenv CFLAGS '-O6 -march=i686' ; \
make -f Makefile.init makefiles \
"CCARGS=-DHAS_MYSQL -I/usr/local/include/mysql" \
"AUXLIBS=-L/usr/local/lib/mysql -lmysqlclient -lz -lm")

make

make install

Responder com <ENTER> para todas as perguntas

Fazendo link para o sendmail

ln -s /usr/sbin/sendmail /usr/lib/sendmail

rehash

Configurando o Postfix

Edite o master.cf e realize as seguintes alterações

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       50       smtpd  -o content_filter=lmtp:unix:/tmp/dspam.sock

Isso fará que o smtp "conecte" com o dspam através do dspam.sock

No fim do arquivo, fazer com que o dspam seja capaz de injetar novamente e-mails no sitema. Aqui você também pode colocar outras configurações no "o content_filter", como por exemplo adicionar o clamav ou outro "filtro" na cadeia de análise de e-mails. Lembrando que dspam possui integração "built-in" com o clamav.

#PERMITINDO O REENVIO ATRAVES DO DSPAM
localhost:10026 inet  n -       n       -       50        smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Edite o main.cf e faça as seguintes alterações

#DEFININDO NOME,VIRTUALALIAS,TRANSPORT
transport_maps = dbm:/etc/postfix/transport
transport_maps = hash:/etc/postfix/transport
myhostname=spam.dominio.com.br
mydomain= $myhostname
myorigin= $mydomain
relay_domains= $mydestination, /etc/postfix/relay-domains
virtual_mailbox_domains = $virtual_mailbox_maps
virtual_transport = lmtp:unix:/tmp/dspam.sock
virtual_mailbox_maps = mysql:/etc/postfix/vmailbox.cf
dspam_destination_recipient_limit = 1
mydestination =

Crie o arquivo vmailbox.cf, esse arquivo contem os dados para que o dspam conecte no MySQL

user = dspam
password = senha_do_usuario_dspam
dbname = dspam
query = SELECT username FROM dspam_virtual_uids WHERE username='%s'
table = dspam_virtual_uids
host = 127.0.0.1
select_field = username
where_field = username
additiona_conditions =

Crie o arquivo transport, com os e-mails dos dominios que irão passar pela máquina

dominio1.com.br         smtp:[xxx.xxx.xxx.xxx]
dominio2.com.br         smtp:[xxx.xxx.xxx.xx1]
dominio3.com.br         smtp:[xxx.xxx.xxx.xx3]

xxx.xxx.xxx.xxx sao os IPs do servidores de destino

Crie o database de transporte:

postmap transport

Crie o arquivo relay-domains, nesse arquivo deve conter os dominios que o servidor aceita fazer relay:

dominio1.com.br         RELAY
dominio2.com.br         RELAY
dominio3.com.br         RELAY

Depois de realizada essas modificações é preciso reiniciar o postfix

postfix stop
postfix start

Compilando Apache

Nessa instalção iremos utilizar o suexec, para que o dspam.cgi rode com as permissões necessárias. Irei abordar somente a parte da configuração da interface, certifique que os CGIs estão rodando normalmente. Atenção para o parâmetro SuexecUserGroup dspam dspam que permite com que os cgis rodem com as permissoes do usuário correto.

cd $BUILD_DIR

wget http://ftp.pucpr.br/apache/httpd/httpd-2.0.55.tar.gz

tar xvfz httpd-2.0.55.tar.gz

cd httpd-2.0.55

( setenv CFLAGS '-O6 -march=i686' ;./configure --prefix=/usr/local/etc/httpd \
--enable-rewrite --enable-module=so  \
--enable-auth-digest  \
--disable-actions --with-mpm=prefork \
--enable-cgi --disable-userdir \
--enable-suexec --with-suexec-caller=httpd \
--with-suexec-docroot=/usr/local/etc/httpd/dspam)

make

make install

rehash

Configurando a Interface Web

Editando o arquivo de configuração do apache

cd /usr/local/etc/httpd/conf

vi httpd.conf

httpd.conf

#DSPAM
<VirtualHost xxx.xxx.xxx.xxx>
DocumentRoot "/usr/local/etc/httpd/dspam/spam.dominio.com.br"
ServerName spam.dominio.com.br
ServerAdmin hamilton@nospam.com.br
ErrorLog /usr/local/etc/httpd/logs/spam.dominio.com.br-error_log
TransferLog /usr/local/etc/httpd/logs/spam.dominio.com.br-access_log
RewriteEngine on
RewriteRule ^/$ /dspam.cgi [R]
SuexecUserGroup dspam dspam
        <Directory "/usr/local/etc/httpd/dspam/spam.dominio.com.br">
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /usr/local/etc/httpd/dspam/htpasswd
        Require valid-user
        Options MultiViews FollowSymLinks ExecCGI
        AllowOverride None
        Order deny,allow
        Allow from All
        </Directory>
</VirtualHost>

Copiando a interface web do fonte e acertando permissões

mkdir -p /usr/local/etc/httpd/dspam/
mkdir -p /usr/local/etc/httpd/dspam/spam.dominio.com.br
chmod 555 /usr/local/etc/httpd/dspam/spam.dominio.com.br
chown dspam.dspam /usr/local/etc/httpd/dspam/spam.dominio.com.br
cp -rav /usr/local/src/dspam-3.6.4/webui/cgi-bin/* /usr/local/etc/httpd/dspam/spam.dominio.com.br/
cp -rav /usr/local/src/dspam-3.6.4/webui/htdocs/* /usr/local/etc/httpd/dspam/spam.dominio.com.br/
cd /usr/local/etc/httpd/dspam/spam.dominio.com.br
rm -f Makefile*
chown -R dspam.dspam *
chmod 444 *.*
chmod 554 *.cgi
chmod 555 templates
chmod 444 templates/*

Crie o usuário de administração (esse usuário deve estar listado no arquivo admins, por default tem a entrada root)

/usr/local/etc/httpd/bin/htpasswd -c /usr/local/etc/httpd/dspam/htpasswd root

Crie os usuários que terão acesso a interface web

/usr/local/etc/httpd/bin/htpasswd  /usr/local/etc/httpd/dspam/htpasswd usuario@dominio1.com.br

Há também a possibilidade de usar um servidor backend para fazer a autenticação, para isso você pode usar o mod_auth_imap2-current.tar.gz, exemlpo:

#DSPAM
<VirtualHost xxx.xxx.xxx.xxx>
DocumentRoot "/usr/local/etc/httpd/dspam/spam.dominio.com.br"
ServerName spam.dominio.com.br
ServerAdmin hamilton@nospam.com.br
ErrorLog /usr/local/etc/httpd/logs/spam.dominio.com.br-error_log
TransferLog /usr/local/etc/httpd/logs/spam.dominio.com.br-access_log
RewriteEngine on
RewriteRule ^/$ /dspam.cgi [R]
SuexecUserGroup dspam dspam
        <Directory "/usr/local/etc/httpd/dspam/spam.dominio.com.br">
        Auth_IMAP_Enabled on
        AuthType Basic
        AuthName "spam.dominio.com.br"
        Require valid-user
        Auth_IMAP_Authoritative on
        Auth_IMAP_Authoritative on
        Auth_IMAP_Server host.de.autenticacao
        Auth_IMAP_Port 143
        Auth_IMAP_Log on
        Options MultiViews FollowSymLinks ExecCGI
        AllowOverride None
        Order deny,allow
        Allow from All
        </Directory>
</VirtualHost>

Bem mais prático do que usar arquivo de autenticação com senhas :)

Edite o arquivo configure.pl, abaixo segue o arquivo funcional do sistema, ajuste o original conforme suas necessidades:

$CONFIG{'DSPAM_HOME'}   = "/var/dspam";
$CONFIG{'DSPAM_BIN'}    = "/usr/local/bin";
$CONFIG{'DSPAM'}        = $CONFIG{'DSPAM_BIN'} . "/dspam";
$CONFIG{'DSPAM_STATS'}  = $CONFIG{'DSPAM_BIN'} . "/dspam_stats";
$CONFIG{'DSPAM_ARGS'}   = "--deliver=innocent --class=innocent " .
                          "--source=error --user %CURRENT_USER% -d %u";
$CONFIG{'MAIL_QUEUE'}   = "mailq | grep '^[0-9,A-F]' | wc -l";
$CONFIG{'HISTORY_PER_PAGE'} = 100;
$CONFIG{'3D_GRAPHS'}    = 1;
$CONFIG{'LOCAL_DOMAIN'} = "spam.dominio.com.br";
$CONFIG{'LOCAL_DOMAIN'} = "spam.dominio.com.br";
$ENV{'PATH'} = "$ENV{'PATH'}:$CONFIG{'DSPAM_BIN'}";
$CONFIG{'AUTODETECT'} = 1;
$CONFIG{'LARGE_SCALE'} = 1;
$CONFIG{'DSPAM_CGI'} = "./dspam.cgi";
1;

Verifique se seu sistema está rodando CGIs sem nenhum problema, em caso de problemas, analise os logs e veja como os scrips funcionam.

Configurando o dspam

Editando o arquivo de configuração em /usr/local/etc/dspam.conf

#home
Home /var/dspam
#tipo de storage
StorageDriver /usr/local/lib/libmysql_drv.so
#definido porta o host
DeliveryHost        127.0.0.1
DeliveryPort        10026
DeliveryIdent       localhost
DeliveryProto       SMTP

OnFail error

Trust root
Trust httpd
Trust dspam
Trust postfix
Trust mail
Trust mailnull
Trust smmsp
Trust daemon

#modo de treino
TrainingMode teft
TestConditionalTraining on

Feature chained
Feature whitelist

#algoritmo de filtragem
Algorithm graham burton
PValue graham

#preferencias default
Preference "spamAction=quarantine"
Preference "showFactors=on"

#store
AllowOverride localStore
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold

#configuracao mysql
MySQLServer     /tmp/mysql.sock
MySQLPort       3306
MySQLUser               dspam
MySQLPass               srmadruga
MySQLDb                 dspam
MySQLCompress           true

#adicionado uid do usuario na assinatura
MySQLUIDInSignature    on

HashRecMax              98317
HashAutoExtend          on
HashMaxExtents          0
HashExtentSize          49157
HashMaxSeek             100
HashConnectionCache     10
Notifications   off
LocalMX 127.0.0.1

#log
SystemLog on
UserLog   on
Opt out

ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse off

#Fila e pid
ServerQueueSize 32
ServerPID              /var/dspam/dspam.pid

ServerMode auto
#paramtro de entrega e acao
ServerParameters        "--deliver=innocent"
ServerIdent             "localhost.localdomain"
ServerDomainSocketPath  "/tmp/dspam.sock"
ProcessorBias on

Script para iniciar o dspam

Em nossa configuração o dspam irá rodar como daemon

#DSPAM
# Start DSPAM.
if [ -x /usr/local/bin/dspam ]; then
   sudo -u dspam /usr/local/bin/dspam --daemon&
fi

Utilizo o sudo para que o dspam não inicialize como root, caso contrário os arquivos criados em /var/dspam/ irão ser criados com owner root e a interface web não consiguirá ler os arquivos

Criando alias para que a interface de e-mails funcione

No dspam, existe a alternativa de alimentar os filtros enviando os spams e os e-mails legitimos para e-mails determinados pelo administrador. Em nosso exemplo iremos utilizar o e-mail [MAILTO] spam@spam.dominio.com.br para receber os SPAMs e o [MAILTO] nospam@spam.dominio.com.br para receber os e-mails "sadios". Para isso adicione dois alias no arquivo de alias do postfix que é definido na tag alias_maps do arquivo de configuração do postfix.

vi /etc/postfix/aliases


spam:           "|/usr/local/bin/dspam --user spam@spam.dominio.com.br --class=spam --source=error"
nospam:        "|/usr/local/bin/dspam --user spam@spam.dominio.com.br --class=innocent --source=error"

Se algum usuário receber um spam, basta que ele encaminhe o e-mail para [MAILTO] spam@spam.dominio.com.br, se ele receber algum e-mail "sadio" que foi rotulado como spam, basta encaminhar para [MAILTO] nospam@spam.dominio.com.br.É recomendável que ele envie o e-mails inclusive com os cabeçalhos

Crie o usuário [MAILTO] spam@spam.dominio.com.br no banco (tabela dspam_virtual_uids).

Comentários finais

Depois que a configuração estiver OK, aponte o MX do seu dominio para o servidor que fará relay e análise dos e-mails( lembre-se que os dominios DEVEM estar no arquivo de relay e tem que haver uma configuração de transporte). Crie os usuários na tabela dspam_virtual_uids, caso você tenha vários alias e queira associá-lo apenas a um usuário, crie os alias com o mesmo UID do seu usuário e rode o comando:

dspam_admin ch pref email@dominiox.com.br localStore email@dominiox.com.br

Onde [MAILTO] email@dominiox.com.br é seu usuário, isso fará que todos os alias com o UID do [MAILTO] email@dominiox.com.br sejam gerenciados pelo [MAILTO] email@dominiox.com.br.

Qualquer dúvida, basta entrar em contato, bom prveito

Hamilton Vera Seven Internet [WWW] http://lib.seven.com.br "Google is my shepherd, no want shall I know"

last edited 2006-03-31 15:12:27 by HamiltonVera