Publicado por: Rafael Guedes | 22 outubro 2009

Restriction Classes do Postfix

postfix-logo

Nesta semana tive a necessidade de estabelecer uma política de acesso à uma lista interna de e-mail, um alias para todos os funcionários da empresa. Exemplo: noticias@exemplo.com.br. Com a ajuda dos colaboradores da lista sobre Postfix do listas.softwarelivre.org descobri que esta restrição poderia ser feita nativamente pelo Postfix através da diretiva smtpd_restriction_classes, então resolvi traduzir esta parte do manual do Postfix para auxiliar os colegas, bem como para realizar futuras consultas.

Algumas partes do texto original não foram de minha total compreensão por isso não publiquei para não arriscar falar besteira. E se mesmo assim, alguém achar que me expressei mau em alguma colocação por favor colaborem com correções.

Texto original: http://www.postfix.org/RESTRICTION_CLASS_README.html

POSTFIX RESTRICTION CLASSES

O Servidor SMTP Postfix suporta restrições de acesso como reject_rbl_client ou reject_unknow_client_hostname nas diretivas das tabelas de acesso (smtpd_helo_restrictions, smtpd_client_restrictions, smtpd_sender_restrictions, smtpd_recipient_restrictions). Isto permite a você implementar diferentes restrições de SPAM para diferentes clientes ou usuários.

Ter que especificar listas de restrições de acesso para cada destinatário pode tornar-se tedioso rapidamente. As restriction classes lhe permitirão dar nomes amigáveis para grupos de restrições de UCE (como “permitido”, “restrito”, entre outros).

Exemplo:

FILE /etc/postfix/main.cf:
smtpd_restriction_classes = permitido, restrito
# Em versões inferiores à 2.3 especifique reject_unknow_client.
restrito = reject_unknow_sender_domain, reject_unknow_client_hostname, …
permitido = permit

smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
check_recipient_access hash:/etc/postfix/recipient_access

FILE /etc/postfix/recipient_access:
joao@exemplo.com.br          permitido
maria@exemplo.com.br        restrito

O restante deste documento dá exemplos de como as restriction_classes podem ser usadas para:

  • Proteger uma lista interna de e-mail de remetentes externos.
  • Restringir o envio de e-mail somente para o domínio, por usuário.

PROTEGENDO UMA LISTA INTERNA DE E-MAIL

Queremos implementar uma lista interna de e-mail. Alguma coisa como news@exemplo.com.br, que é um alias para todos os funcionários. O problema é que esta lista ficará aberta, se um SPAM for enviado para ela, todos receberão, se um funcionário for demitido e sair por aí falando besteira, todos receberão.

O Postfix pode implementar controles de acesso por endereço. O exemplo que segue é baseado no endereço IP do cliente SMTP, sendo assim, vulnerável a IP Spoofing.

FILE /etc/postfix/main.cf:
files = /etc/postfix
smtpd_recipient_restrictions =
check_recipient_access hash:$files/access
…regras geralmente usadas…

FILE /etc/postfix/access:
news@exemplo.com.br

Especifique dbm ao invés de hash se o seu sistema usa arquivos dbm ao invés de arquivos db. Para descobrir quais tipos de mapeamento o Postfix suporta, use o comando postconf -m.

Isto seria o suficiente caso seu servidor SMTP receba e-mails externos diretamente da internet. Isso é pouco provável caso a rede seja um pouco maior do que um escritório. Por exemplo , caso use um backup MX , estes iriam “limpar” o endereço IP da mensagem externa, assim as mensagens iriam parecer estar vindo de um host confiável.

Geralmente você irá precisar de duas tabelas de consulta: uma tabela que listará os destinatários que precisam ser protegidos, e uma tabela que listará os domínios os quais são permitidos enviar e-mail para os destinatários protegidos.

O exemplo que segue é baseado no enderço IP do remetente contido no envelope STMP, sendo assim vulnerável a IP Spoofing.

FILE /etc/postfix/main.cf:
files = /etc/postfix
smtpd_recipient_restrictions =
check_recipient_access hash:$files/destinatarios_protegidos
…regras geralmente usadas…

smtpd_restriction_classes = apenas_internos
apenas_internos = check_sender_access hash:$files/internos, reject

FILE /etc/postfix/destinatarios_protegidos:
news@mail.exemplo.com.br        apenas_internos
news@exemplo.com.br                 apenas_internos

FILE /etc/postfix/internos:
exmplo.com.br         OK
cliente.com.br          OK
fornecedor.com.br   OK

Burlar este esquema de segurança torna-se relativamente fácil, porque tudo que se tem que fazer é falsificar o enderço do remetente no envelope SMTP.

RESTRINGINDO QUAIS USUÁRIOS PODEM ENVIAR E-MAIL PARA DOMÍNIOS EXTERNOS:

O Postfix irá ser configurado para que alguns usuários consigam enviar e-mail à Internet e outros não. Os usuários que não tem acesso deverão receber uma mensagem de devolução genérica. Os usuários que violarem esta politica terão seu e-mail rejeitado pelo servidor SMTP.

Esta implementação utilizará de duas tabelas de pesquisa. Uma tabela define quais usuários terão restrições no envio de e-mail à Internet, já a outra define o que são destinos locais.

O exemplo assume a utilização de arquivo db/dbm, mas isto também pode ser implementado via SQL ou LDAP.

FILE /etc/postfix/main.cf:
files = /etc/postfix
smtpd_recipient_restrictions =
check_sender_access hash:$files/remetentes_restritos
…regras geralmente usadas…

smtpd_restriction_classes = apenas_local
apenas_local = check_recipient_access hash:$files/dominios_locais, reject

FILE /etc/postfix/remetentes_restritos:
joao@exemplo.com.br apenas_local
maria@exemplo.com.br apenas_local

FILE /etc/postfix/dominios_locais
exmplo.com.br            OK
cliente.com.br             OK
fornecedor.com.br      OK

PS: este esquema de segurança não utiliza autenticação de usuário, portanto ele pode ser contornado de algumas maneiras:

  • Enviando e-mail através de um relay host sem muitas restrições de segurança.
  • Enviando e-mail como alguém que tenha permissão para enviar mensagens a outros domínios.

Deixe um comentário

Categorias