Saudações,
Um VPS com meia duzia de e-mails para um ou dois domínios é uma coisa. Agora um servidor com vários clientes e com uma politica SMTP branda é outra totalmente diferente.
Sempre tem um ou outro que não sabe "brincar" e acaba fazendo spam.
Postfix SMTPd policy com o Postfwd
Quando há abuso no envio de mensagens, entra cena projetos como o Postfwd.
O Postfwd é um programa feito em Perl que trabalha de forma semelhante a um Firewall. Você programa um conjunto de regras, e estas trabalham em conjunto com o servidor SMTP.
Por exemplo, você pode definir quantas mensagens um domínio pode enviar/receber por hora. Pode também configurar o tamanho da mensagem/anexo que o cliente pode enviar, etc.
Até a data desta postagem o Postfwd3 estava na versão 2.02 de Abril de 2019. Para instalar, com um usuário comum, execute em um terminal...
$cd /tmp
$wget https://github.com/postfwd/postfwd/archive/master.zip
$unzip master.zip
$rm -Rf master.zip
Agora como root execute:
#mv -v postfwd-master /opt/postfwd
No Debian 9 eu precisei instalar uma dependência...
#apt -y install libidn2-0-dev
Precisamos também instalar algumas dependências usando o CPAN do Perl...
#perl -MCPAN -e shell
Dê um up na CPAN...
cpan[1]>install CPAN
cpan[2]>reload cpan
Depois instale os módulos necessários para o Postfwd...
cpan[3]>install Net::Server::Daemonize Net::Server::Multiplex Net::Server::PreFork Net::DNS IO::Multiplex
Os módulos também podem ser instalados via apt; acesse postfwd.org e confira o comando.
Feita a instalação vamos criar um filtro básico para demostração. Criaremos duas regras bem genéricas apenas para demostrar a funcionalidade do Postfwd. A primeira limita o numero de envio em 3 e-mails por hora. E outra que define um limite máximo de 1MB por mensagem enviada.
Abra o arquivo postfwd.cf...
#vim /opt/postfwd/etc/postfwd.cf
Apague todas as linhas e coloque as seguinte regras...
id=SASL1000; sasl_username =~ /.*@.*/; action=rate(sasl_username/3/3600/REJECT SASL1000 - Only 3 recipients per hour for $$sasl_username) id=SASL1001; sasl_username =~ /.*@.*/; action=size(recipient/1048576/3600/REJECT SASL1001 - Only 1MB per hour for $$recipient.)
Salve as mudanças.
O conjunto ITEM = VALOR acima é uma PCRE; Perl Compatible Regular Expressions.
Como eu escolhi a instalação manual, eu precisei efetuar algumas mudanças no script que INICIA e PARA o daemon. Abra o arquivo postfwd-script.sh...
#vim /opt/postfwd/bin/postfwd-script.sh
Apague seu conteúdo e insira as seguintes linhas...
#!/bin/sh # # Startscript for the postfwd daemon # # by JPK PATH=/bin:/usr/bin:/usr/local/bin # path to program #PFWCMD=/usr/local/postfwd/sbin/postfwd2 #PFWCMD=/usr/local/postfwd/sbin/postfwd PFWCMD=/opt/postfwd/sbin/postfwd3 # rulesetconfig file #PFWCFG=/etc/postfix/postfwd.cf PFWCFG=/opt/postfwd/etc/postfwd.cf # pidfile #PFWPID=/var/tmp/postfwd.pid PFWPID=/var/tmp/postfwd3-master.pid # daemon settings PFWUSER=postfix PFWGROUP=postfix PFWINET=127.0.0.1 PFWPORT=10045 # recommended extra arguments PFWARG="--shortlog --summary=600 --cache=600 --cache-rbl-timeout=3600 --cleanup-requests=1200 --cleanup-rbls=1800 --cleanup-rates=1200" ## should be no need to change below P1="`basename ${PFWCMD}`" case "$1" in start*) [ /var/tmp/postfwd3-master.pid ] && rm -Rf /var/tmp/postfwd3-master.pid; echo "Starting ${P1}..."; ${PFWCMD} ${PFWARG} --daemon --file=${PFWCFG} --interface=${PFWINET} --port=${PFWPORT} --user=${PFWUSER} --group=${PFWGROUP} --pidfile=${PFWPID}; ;; debug*) echo "Starting ${P1} in debug mode..."; ${PFWCMD} ${PFWARG} -vv --daemon --file=${PFWCFG} --interface=${PFWINET} --port=${PFWPORT} --user=${PFWUSER} --group=${PFWGROUP} --pidfile=${PFWPID}; ;; stop*) ${PFWCMD} --interface=${PFWINET} --port=${PFWPORT} --pidfile=${PFWPID} --kill; ;; reload*) ${PFWCMD} --interface=${PFWINET} --port=${PFWPORT} --pidfile=${PFWPID} -- reload; ;; restart*) $0 stop; sleep 4; $0 start; ;; *) echo "Unknown argument \"$1\"" >&2; echo "Usage: `basename $0` {start|stop|debug|reload|restart}" >&2; exit 1;; esac exit $?
Feita a modificação acima, vamos criar um link simbólico do mesmo para o diretório /etc/init.d...
#ln -s /opt/postfwd/bin/postfwd-script.sh /etc/init.d/postfwd
Agora você pode iniciar o daemon com o comando...
#/etc/init.d/postfwd start
Confira se ele está escutando na porta 10045...
#netstat -lpn | egrep postfwd
tcp 0 0 127.0.0.1:10045 0.0.0.0:* LISTEN 4428/ postfwd3::pol
Com o Postfwd on, precisamos integra-lo ao Postfix. Abra o arquivo main.cf.
#vim /etc/postfix/main.cf
Localize a diretiva smtpd_recipient_restrictions, e deixe a sua configuração parecida com o exemplo abaixo...
... 127.0.0.1:10045_time_limit = 3600 smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, check_policy_service inet:127.0.0.1:10045, .... ...
Acesse postfwd.org/doc.html#INTEGRATION para mais informações!
Lembre que a ordem de cada item dentro do smtpd_recipient_restrictions é muito importante. Ajuste a sua configuração. Não queremos nem um Open Relay, certo?
Hora do teste!
No servidor em que foi feita a instalação, você pode testar o Postfwd usando o netcat com o arquivo request.sample...
#nc 127.0.0.1 10045 < /opt/postfwd/tools/request.sample
No lado cliente podemos usar a rede Tor com o telnel para executar comandos na porta 25...
$torify telnet nome-servidor-email 25
Ou simplesmente usamos um cliente de e-mail! Por exemplo, usando o SeaMonkey Mail, ao tentar enviar para 4 destinos eu recebo a mensagem...
No terminal vemos os logs do servidor |
E ao tentar enviar um e-mail com mais de 1MB ( 1048576 B ), eu vejo a mensagem...
No terminal vemos os logs do servidor |
Relembrando o que eu mencionei acima, estas duas regra são bem genéricas. As regras que eu uso em produção são bem diferentes. Estude o seu servidor e crie as suas próprias.
Para mais exemplos de configuração, acesse:
Viu os exemplos? Dá para fazer bastante coisa não é mesmo? ^_^
Seja curioso!
Ah!!! Lembre-se que o Postfwd não é uma ferramenta dedicada para combater SPAM. Você até pode usa-lo para tal tarefa, mas o objetivo mesmo é controlar a politica de trabalho do Postfix.
Paz a todos!
0 comentários:
Postar um comentário