Postfix: verificações condicionais de cabeçalho

Postfix: verificações condicionais de cabeçalho

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

De:[e-mail protegido]

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.

informação relacionada