Meus artigos: Flexibilidade nos smtpd * restrictions do Postfix

De Ramoni

Conteúdo

Introdução

Necessidade de flexibilidade

Quem usa Postfix conhece os parâmetros de checagens e restrições que se pode fazer quanto ao client, sender e recipient.
O que algumas pessoas não sabem, é que existem mais restrições que estas, e até alguns parâmetros para estas restrições que não estão na documentação do main.cf do Postfix.
Mas o objetivo deste artigo é, na verdade, proporcionar maior flexibilidade na configuração.
Imagine-se gerenciando um servidor que hospeda 20 domínios, e você usa uma restrição de que o servidor origem deve ter IP reverso. Aí um cliente seu liga e diz que não está recebendo email, você analisa e vê que o servidor de email do remetente não possui reverso. Seu cliente PRECISA receber emails desse cara e não quer nem saber de quem é o problema. O que você faz ? Você pode colocar o IP do servidor em um client access maps e liberar aquele IP, mas com o tempo seu cliente vai pedir para liberar mil outros. Significa que na verdade, esta checagem não deve ser feita para aquele domínio destino. Seria legal ter uma maneira de desabilitar esta checagem só para este cliente, mantendo a checagem ativa para os outros domínios.

Access Maps

Os access maps no postfix são normalmente usados para criar exceções nas checagens, como por exemplo:
smtpd_client_restrictions = permit_mynetworks,
                            permit_sasl_authenticated,
                            check_client_access hash:/etc/postfix/access/client_access, 
                            reject_unknown_client_hostname,
Listando no arquivo client_access os IPs que não passariam nas próximas restrições do client_restrictions.
Este é um uso muito limitado das restrições do Postfix. Podemos melhorar muito se entendermos como as restrições e access maps funcionam.

Como as restrições funcionam

Bom, primeiro deixe-me listá-las:
  • smtpd_client_restrictions -> faz testes no IP do cliente
  • smtpd_helo_restrictions -> testes na identificação fornecida no HELO/EHLO do cliente
  • smtpd_sender_restrictions -> testes no envelop sender, ou seja, no comando MAIL FROM:
  • smtpd_recipient_restrictions -> testes no envelop recipient, ou seja, no comando RCPT TO:
  • smtpd_etrn_restrictions -> restrições ao uso do comando ETRN
  • smtpd_data_restrictions e smtpd_end_of_data_restrictions não são muito utilizadas e por isso não vou comentar.
Cada restrição tem um contexto isolado onde os testes são feitos na ordem especificada, e cada teste pode retornar 3 status: OK, REJECT e DUNNO. OK e REJECT são ações finais dentro de uma restrição.
O status OK faz com que os próximos testes desta restrição não sejam processados.
O REJECT faz o bloqueio da conexão, informando a restrição que não foi atendida.
O DUNNO apenas faz com que não seja bloqueado neste teste, e passe para o próximo teste.
Bom, vou dar um exemplo:
smtpd_client_restrictions = permit_mynetworks,
                            permit_sasl_authenticated,
                            check_client_access hash:/etc/postfix/access/client_access,
                            reject_unknown_client_hostname,
Digamos que eu conecte no servidor por um provedor internet que não me dá IP reverso, e meu IP é 192.0.2.1. O Postfix vai agir da seguinte forma:
  1. O IP 192.0.2.1 está em permit_mynetworks ? Não, então -> DUNNO
  2. O IP 192.0.2.1 se autenticou ? Não, então = DUNNO
  3. O IP 192.0.2.1 está em client_access ? Não, então = DUNNO
  4. O IP 192.0.2.1 possui DNS reverso ? Não, então = REJECT
Se meu IP estivesse em client_access, no mynetworks, ou eu tivesse me autenticado, estes testes retornariam OK e eu não seria bloqueado pelo teste de IP reverso.

Como os access maps funcionam

Para cada restrição, existe um access map. O objetivo dos access maps é checar em uma lista de o alvo do access map tem um OK ou um REJECT explícito.
Exemplo, o teste check_client_access hash:/etc/postfix/access/client_access, retornará DUNNO caso não encontre o IP na lista, e caso encontre, retornará o que está configurado. Exemplo:
192.0.2.1   OK
Resumindo, existe o access map para o IP do cliente, identificação do helo/ehlo, remetente e o de destinatário. Cada um deles retorna o que está configurado caso haja, ou DUNNO caso não haja nada específico.
A grande mágica é entender que você não está restrito a usar um access map somente dentro do teste do seu escopo !!!

A mágica

Existe uma configuração do Postfix que é smtpd_delay_reject. Estando habilitada, ela faz com que o Postfix aguarde até o comando RCPT TO para informar qualquer problema das restrições. É bom usá-la como yes (padrão), pois proporciona dois benefícios:
  • Existem clientes SMTP que ignoram erros antes do RCPT TO e prosseguem com os comandos SMTP.
  • Você possibilita ao postfix, ter todas as informações em todas as restrições, pois ele fará os testes após o comando RCPT TO. Desta forma, é possível usar remetente e destinatário nas restrições do cliente.
Resumindo, você tem 4 restrições importantes em escopos diferentes e, você possui todas as informações disponíveis de IP, helo, sender e recipient para usar nos testes de access maps em cada uma delas !!!
Viu ?? Simples !!! Acabou.

Exemplo

Costumo trabalhar assim:


smtpd_delay_reject = yes

smtpd_client_restrictions =     permit_sasl_authenticated,
                                check_client_access hash:/etc/postfix/access/client_access,
                                check_recipient_access hash:/etc/postfix/access/client_access_recipient,
                                reject_unknown_reverse_client_hostname,

smtpd_helo_restrictions =       permit_sasl_authenticated,
                                check_helo_access hash:/etc/postfix/access/helo_access,
                                check_client_access hash:/etc/postfix/access/helo_access_client,
                                check_recipient_access hash:/etc/postfix/access/helo_access_recipient,
                                permit_naked_ip_address,
                                reject_unknown_helo_hostname,

smtpd_sender_restrictions =     permit_sasl_authenticated,
                               check_recipient_access hash:/etc/postfix/access/sender_access_recipient,
                               reject_non_fqdn_sender,
                               reject_unknown_sender_domain,
                               check_policy_service unix:private/policy-spf,
                               check_policy_service inet:127.0.0.1:10030,
                               check_policy_service inet:127.0.0.1:12525,
Ou seja, se um cliente não quer que seja checado IP reverso, basta colocar o domínio dele com OK em /etc/postfix/access/client_access_recipient
Para desabilitar os testes de ehlo para um outro domínio destino, bastaria colocar no /etc/postfix/access/helo_access_recipient.
E por aí vai. O importante é ter arquivos separados, e saber que você pode usar qualquer teste de access map em qualquer restrição.
Ferramentas pessoais
Conteúdo do site