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 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.
gd-2.0.33.tar.gz
GDGraph-1.43.tar.gz
GDTextUtil-0.86.tar.gz
GD-Graph3d-0.63.tar.gz
GD-2.23.tar.gz
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 spam@spam.dominio.com.br para receber os SPAMs e o 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 spam@spam.dominio.com.br, se ele receber algum e-mail "sadio" que foi rotulado como spam, basta encaminhar para nospam@spam.dominio.com.br.É recomendável que ele envie o e-mails inclusive com os cabeçalhos
Crie o usuário 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 email@dominiox.com.br é seu usuário, isso fará que todos os alias com o UID do email@dominiox.com.br sejam gerenciados pelo email@dominiox.com.br.
Qualquer dúvida, basta entrar em contato, bom prveito
Hamilton Vera Seven Internet http://lib.seven.com.br "Google is my shepherd, no want shall I know"