Aqui está minha situação SMTP.
O fluxo de mensagens é marcado por um provedor de retransmissão on-line (!!SPAM!!, !!BULK!!, etc.)
O fluxo de mensagens é recebido por um postfix interno. O transporte está configurado para retransmitir para nosso Exchange interno, caso o assunto esteja marcado. Eu faço isso usando Header_checks. O fluxo de mensagens marcadas é despachado para nosso servidor de quarentena (webUI para usuários individuais, etc...)
/^[sS]ubject:.*!!SPAM!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!BULK!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!SUSPECT!!*/ FILTER smtp:192.168.11.250
Funciona bem. Nosso servidor de quarentena pode gerar uma lista de remetentes confiáveis para os usuários. Esta lista de permissões está disponível e posso baixá-la para meu postfix.
Minha pergunta é: como posso aplicar minha lista de permissões antes da verificação do cabeçalho?
If Subject contains *!!SPAM!!*
then
If from contains [email protected] AND if to contains [email protected]
Then redirect to internal exchange server
else redirect to quarantine server
endif
endif
Eu não sei como fazer isso. Alguma dica?
Responder1
Após comentário de @masegaloeh encontrei uma solução. A idéia é ter um segundo servidor SMTP postfix escutando em 10025 com um servidor de políticas para enviar e-mails para o servidor normal (se estiver na lista de permissões) ou para o servidor de quarentena.
A ideia era começar como sua solução header_checks, em main.cf:
header_checks = regexp:/etc/postfix/header_checks
Em header_checks:
/^(S|s)ubject: .*!!(SPAM|BULK|SUSPECT)!!.*/ FILTER smtp:127.0.0.1:10025
Depois, em master.cf (editado com comentários de @masegaloeh):
10025 inet n - n - - smtpd
-o receive_override_options=no_header_body_checks
-o smtpd_recipient_restrictions=${my_switcher_restrictions}
policy unix - n n - 0 spawn user=nobody argv=/etc/postfix/policy-server-switcher
Isso faz com que a segunda instância do postfix substitua o uso de header_checks.
E em main.cf
my_switcher_restrictions = check_policy_service unix:private/policy
E o conteúdo do Policy-Server-Switcher
!/bin/bash
sender=""
recipient=""
while read line
do
key=$(echo $line | cut -f1 -d=)
value=$(echo $line|cut -f2 -d=)
if [ "$key" == "sender" ]
then
sender=${value}
logger -p mail.info -t PolicyServer "Sender is: ${value}"
fi
if [ "$key" == "recipient" ]
then
recipient=${value}
logger -p mail.info -t PolicyServer "Recipient is: ${value}"
fi
if [ "x${recipient}" != "x" ] && [ "x${sender}" != "x" ]
then
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
echo "action=FILTER smtp:192.168.1.151"
echo
exit 0
fi
done
É claro que você precisará programar seu servidor de políticas para carregar a lista de permissões do banco de dados ou LDAP. Aqui está apenas um exemplo para se ter uma ideia.
Mas isso ainda tem algumas ressalvas, suponha que eu mande um email com isso
Para:[e-mail protegido]
Para:[e-mail protegido]
Isso irá para o servidor normal para alphamikevictor e para thomas, na medida em que o último teste no servidor de políticas retornar FILTER ao normal, mas se você colocar alphamikevictor na segunda posição, ele enviará mensagens para ambos os destinatários para quarentena.