Pesquisar neste blog

quinta-feira, 27 de novembro de 2008

Configuração de um servidor SMTP com Postfix no CentOS

Configuração de um servidor SMTP com Postfix no CentOS

Resumo

Este documento tem como objetivo fornecer uma documentação para implementação e administração de um servidor SMTP utilizando o Postfix.

Introdução

O Postfix utiliza dois arquivos de configuração principais que ficam no diretório /etc/postfix, o main.cf e master.cf. Além disso, o postfix possui outro diretório chamado /var/spool/postfix/ onde encontram-se as filas de emails.

Configuração Básica

A configuração básica é bem simples de se fazer, e deixa o servidor apto a entregar emails diretamente aos destinatários, para fazer a configuração basta modificar os seguintes parâmetros do arquivo /etc/postfix/mainf.cf :

myhostname = smtp.minhaempresa.com.br
mydomain = minhaempresa.com.br
mydestination = $mydomain, $myhostname, localhost.domain
relay_domains = dominioamigo.com.br

O domínio utilizado deve ter seu nome resolvido !!
Apague a linha abaixo no main.cf:

inet_interfaces = localhost

Feita esta configuração basta iniciar o serviço para testar, verifique o log para confirmar que ocorreu tudo bem.

[root@centos ]# service postfix start
[root@centos ]# tail -f /var/log/maillog

Teste a conexão com telnet, envie o email como na figura abaixo.

[root@centos ]# telnet smtp.minhaempresa.com.br 25

Você acabou de enviar um email para o fulano, vamos confirmar:

[root@centos ]#
postqueue -p

Poderia ser utilizado ‘’mailq’‘ ou ainda as opções ‘’-f’‘ do postqueue para forçar a entrega dos emails. No nosso exemplo o email não foi entregue por que a resolução de nomes para dominioamigo.com.br não foi possível. Vamos excluir estes emails da fila.

[root@centos ]# postsuper -d 7A4DB834D

No exemplo acima ‘’7A4DB834D’‘ é o identificador do email. Substitua este valor para um da sua fila. Para verificar quais parâmetros estão ativos no Postfix faça:

[root@centos ]# postconf -n

Mapas

O Postfix utiliza na sua configuração arquivos textos formatados em duas colunas, são os mapas. Os mapas são utilizados para adicionar funcionalidades a configuração, tais como controlar relay, autenticação, acesso a servidor LDAP, aliases de email, etc...

No arquivo de configuração (main.cf) os mapas são especificados no formato ‘’tipo:nome’‘.

transport_maps = hash:/etc/postfix/transport
header_checks = regexp:/etc/postfix/header_checks

Para descobrir, os tipos de mapas faça:

[root@centos ]# postconf -m

Mapa de "aliases"

Aliases são apelidos de contas de email utilizados para redirecionar mensagens de uma conta para outra. O arquivo onde são definidos os aliases é o /etc/postfix/aliases. Vamos adicionar um alias para a conta webmaster@minhaempresa.com.br. Para isso, edite o arquivo de aliases e adicone a seguinte linha:

webmaster: eva@empresa.com.br

É possível também utilizar o alias para fazer uma pequena lista, por exemplo:

diretoria: fulano@minhaempresa.com.br, deltrano123@gmail.com, joao

Atualize a base de dados de alias executando o comando abaixo:

[root@centos ]# postalias /etc/postfix/aliases

Feita a configuração não é necessário reiniciar o Postfix. Faça testes enviando emails para os aliases.

Tabelas simples (DB, hash)

Vamos agora gerar mapas do tipo DB, criaremos um mapa que contém uma lista de endereços IP e uma ação a ser tomada. Edite um arquivo texto com o conteúdo abaixo e salve-o como /etc/postfix/client_access

10.0.2.5 REJECT
uol.com.br REJECT
spammer.net REJECT
intranet.com.br OK

Para que o Postfix possa utilizar este mapa, temos que converte-los para um mapa DB executando o comando abaixo.

[root@centos ]#
postmap /etc/postfix/client_access

Para consultar o mapa e testar, faça:

[root@centos ]# postmap -q 10.0.2.5 hash:/etc/postfix/client_access

Expressões Regulares

Tabela com expressões regulares (ER) tem na primeira coluna uma expressão regular, e na segunda coluna a substituição que deve ser feita. Se a ER ‘’casar’‘ com a chave de procura, o valor retornado será o da segunda coluna.
Vejam alguns exemplos feitos no arquivo /etc/postfix/sender_access.regexp:

Convertendo fulano@intranet.dominio.com.br para fulano@dominio.com.br
/(.*)@intranet\..*/ $1@dominio.com.br

Rejeita email do tipo qualquercoisa@naoresponda.com.br
/.*@naoresponda\.com\.br/ REJECT

Colocando o .br opcional
/.*@naoresponda\.com(\.br)?/ REJECT

Esse tipo de mapa não precisa ser convertido para DB. Vamos fazer testes com o postmap.

[root@centos ]# postmap -q ola@naoresponda.com regexp:/etc/postfix/sender_access.regexp

Usando Mapas em Restrições

No Postfix existem inúmeras classes de restrições que podem ser usadas para controlar se uma mensagem é aceita ou não. Para realizar esta decisão é possível verificar diversas variáveis:

• Endereço IP de origem da conexão.
• Parâmetro do comando EHLO (ou HELO).
• Remetente (MAIL FROM).
• Destinatário (RCPT TO).
• Conteúdo dos cabeçalhos da mensagem.
• Conteúdo da mensagem.

Estas variáveis são utilizadas nas classes de restrição, no postfix temos as seguintes classes disponíveis.

Table 1: Classes Disponíveis

Classe de restrição onde atua smtpd client restrictions | Estabelecimento de conexão com o servidor:
smtpd_helo
_restrictions Após o comando HELO ou EHLO
smtpd
_sender_restrictions Após o comando MAIL FROM
smtpd
_recipient_restrictions Após o comando RCPT TO
smtpd
_etrn_restrictions Quando do comando ETRN
smtpd
_restriction_classes Classe genéricas definidas pelo usuário

Configuração mínima

Uma configuração mínima para a classe ‘’smtpd_recipient_restrictions’‘ pode ser:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

Esta configuração deve ser adicionada no arquivo main.cf e o postfix deve ser reiniciado para ativar esta nova configuração.

• permit mynetworks: Casa com o parâmetro mynetworks e indica os clientes que podem conectar no servidor e enviar emails.
• reject_unauth_destination: Rejeita relay não autorizado.

Acrescentando verificação de sintaxe e DNS

Vamos acrescentar mais duas verificações, a reject_non_fqdn_sender para rejeitar MAIL FROM não qualificado e reject_unknown
_sender_domain que rejeita MAIL FROM cujo domínio não resolve para um registro A ou MX.

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
permit

Tente enviar um email onde o destino seja por exemplo bob@dominio, esta mensagem deve ser rejeitada.

Outras verificações ainda podem ser feitas:
• reject_non_fqdn_recipient: Rejeita mensagens cujo o domínio do destinatário não seja qualificado.
• reject_unknown_recipient_domain: Rejeita mensagens cujo o domínio do destinatário não pode ser resolvido por DNS.

Restrições de acesso

Com as restrições de acesso é possível também restringir um determinado domínio ou endereçoo IP, ou ainda um remetente específico, além de outras.
(Man 5 postconf)
A sintaxe das restrições são utilizadas no formato:

Verificação | O que faz
check_helo_access Verifica parâmetro passado para HELO
check
_client_access Verifica o IP do cliente
check
_sender_access Verifica o endereço do remetente (MAIL FROM)
check
_recipient_access Verifica o endereço do destinatário (RCPT TO)

Com estes parâmetros a configuração deve ficar da seguinte maneira:

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
permit

Desta maneira, para fazermos com que nosso servidor de email bloqueie mensagens do domínio spammer.net edite o arquivo /etc/postfix/client
_access e coloque o seguinte conteúdo:

spammer.net REJECT

As ações que podem ser tomadas (colocadas nos mapas) são:

Ações | Efeito
OK Endereço/Email aceito
REJECT[texto] Endereço/Email rejetado
45[NN] texto Rejeita especificando qual o código e texto
DUNNO Age como se a chave não tivesse sido encontrada
HOLD [texto] Coloca a mensagem na fila de espera
DISCARD [texto] Faz de conta que aceita a mensagem, mas na verdade é descartada

Edite o arquivo client_access e configure para rejeitar o endereço de um cliente. Crie o mapa novamente e tente enviar um email deste cliente.

RBL - Realtime Black Lista

Para tentar vencer a briga contra os spammers as empresas juntaram-se coletando informações sobre as redes e servidores utilizados para enviar spam. Esses dados foram organizados e disponibilizados de maneira pública (ou não) para os administradores, foi criada então as ‘’black lists’‘. Para configuar que uma determinada ‘’black list’‘ seja utilizada para filtras os emails, adicione a seguinte configuração:

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
reject_rbl_client site.rbl.com,
reject_rbl_client outrosite.rbl.com,
permit

Inspeção de conteúdo

Com o postfix é possível fazer verificações no conteúdo das mensagens (cabeçalho e corpo) em tabelas, os parâmetros mais utilizados são:

Parâmetro | Função
header_checks Verifica cabeçalhos
body_checks Verifica o corpo da mensagem
mime_header checks texto Verifica cabeçalhos MIME somente
body_checks_size_limit Controla quantos bytes do corpo da mensagem são verificados
Esses filtros não são configurados dentro das classes de restrições de acesso, eles podem estar em qualquer local do arquivo de configuração do Postfix.

Exemplos:
/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks.regexp
body_checks = regexp:/etc/postfix/body_checks.regexp
header checks.regexp
/^Subject: Fique rico/ REJECT
body checks.regexp
/filename=\"?.*\.(doc|tar|zip|exe)\.(pif|bat|com|exe)\"?$/
REJECT Possible Virus (double extension)

Autenticação

Até agora configuramos um servidor SMTP funcional que realiza alguns filtros que podem ser bem ‘’refinados’‘. Agora vamos fazer para que nosso servidor exija autenticação para os usuários que desejarem utilizá-lo. No Postfix é necessário utilizar a biblioteca SASL (Simple Authentication and Security Layer ) que oferece diversos métodos de autenticação, cada uma com suas características.

Autenticação é útil em:

• Controle (log) de usuários
• Permitir relay de usuários autenticados
• Servidor de email que envia mensagens para internet através de outro servidor de email.
Vamos configurar a autenticação utilizando do tipo plain text que utiliza o shadow do sistema, para isso edite o arquivo /usr/lib/sasl/smtpd.conf como abaixo:

pwcheck_method = saslauthd

Para configurar o daemon saslauthd que será responsável por ‘’pegar’‘ a senha e enviar para um dos diversos tipos de autenticação, devemos configurá-lo no arquivo /etc/sysconfig/saslauthd como abaixo:

MECH="shadow"

Você pode também rodar o comando "saslauthd -v" para visualizar uma lista disponível de mecanismos de autenticação.

Agora iniciamos o serviço:

[root@centos ]# service saslauthd start

E por fim, configurar o Postfix com os seguintes parâmetros:

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_helo_access hash:/etc/postfix/helo_access,
check_client_access hash:/etc/postfix/client_access,
check_sender_access hash:/etc/postfix/sender_access,
check_sender_access regexp:/etc/postfix/sender_access.regexp,
check_recipient_access hash:/etc/postfix/recipient_access,
reject_rbl_client site.rbl.com,
reject_rbl_client outrosite.rbl.com,
permit

Reinicie o Postfix e configure um MUA de sua preferência para autenticar-se no seu servidor.

Configuração como ‘’Relay Agent’‘

Um servidor configurado como ‘’Relay Agent’‘ não envia as mensagens diretamente para os MTA dos provedores de destino, ele envia estas mensagens apenas para um servidor específico.
Para fazer esta configuração edite o arquivo main.fc e faça:

relayhost = smtp.meuprovedor.com.br

Desta maneira, o servidor já está atuando como ‘’Relay Agent’‘, mas em muitos casos os servidores exigem autenticação. Então deve-se configurar o Postfix como um cliente de autenticação SASL (diferente do passo anterior que configuramos como servidor de autenticação).

Habilitando a autenticação (cliente) no main.fc

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
smtp_sasl_security_options =

Como definimos o arquivo do mapa anteriormente, agora temos que definir os servidores remotos e seus usuários e senhas. Edite o arquivo /etc/postfix/saslpass e faça:

smtp.meuprovedor.com.br bob:passw123

E depois, gere o mapa:

postmap /etc/postfix/saslpass

Domínios Virtuais

Provedores de acesso tem em seus servidores diversos domínios configurados,
para isso é utilizado Domínios Virtuais, vamos fazer uma configuração simples para
um domínio editando o main.fc:

virtual_alias_domains = virtual.com.br
virtual_alias_maps = hash:/etc/postfix/virtual

O arquivo /etc/postfix/virtual

postmaster@virtual.com.br postmaster
info@virtual.com.br fulano
joao@virtual.com.br jsilva
maria@virtual.com.br maria
compras@virtual.com.br gerencia@empresa.com.br
@virtual.com.br @empresa.com.br

Faça os testes enviando emails para estas contas.

E ficamos por ai. Grande Abraço a Todos.

8 comentários:

Marçal disse...

ola amigo, seu tutorial eh bem completo, porem testei a autenticacao de smtp e ela nao esta 100%, eu consigo enviar emais sem autenticar, verifique e se possivel corrija, no mais um bom trabalho. valeu, parabens.

Marcos Abadi disse...

Olá Marças, muito obrigado pelo elogio.
Mas seguinte, se você tiver cadastrado sua rede em mynetworks ele vai deixar passar pois a sequencia de esta como informada abaixo:

smtpd_recipient_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination

Então ele vai deixar passar primeiro as permit_mynetworks depois os usuários autenticados permit_sasl_authenticated, mas você pode inverter a ordem de acordo com a sua necessidade ficando assim:

smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_sender,
reject_unknown_sender_domain...

Vitor disse...

Amigo Marcos Abadi, parabens pelo seu tutorial.

Segui o seu tutorial e não conssigo configurar o ’Relay Agent’.
A fim de tentar descobrir o que me está a falhar pergunto se onde diz:

MECH="shadow"

Não será antes:

MECH=shadow (sem as aspas)

Obrigado

Vitor disse...

Amigo Marcos Abadi, parabens pelo seu tutorial.

Segui o seu tutorial e não conssigo configurar o ’Relay Agent’.
A fim de tentar descobrir o que me está a falhar pergunto se onde diz:

MECH="shadow"

Não será antes:

MECH=shadow (sem as aspas)

Obrigado

Marcos Abadi disse...

Olá Vitor,
no arquivo /usr/lib/sasl/smtpd.conf
vai o seguinte conteúdo:

pwcheck_method: saslauthd
saslauthd_version: 2


e no arquivo /etc/sysconfig/saslauthd
vai:
MECH=shadow

(Sem aspas)

Ele disse...

Alguem aqui fez curso na Mandriva :P

paulo carajas disse...

Olá Marcos parabéns pelo post muito explicativo teria como me ajudar? montei um servidor postfix em minha empresa para guarda os e-mail aqui com a gente só que depois de tudo configurado o postfix não esta baixando os email que esta no meu provedor tem como fazer isso, igual o Exchange da MS?
Muito Obrigado pelo post.
Paulo Carajas

paulo carajas disse...

Ótimo post Marcos,

gostaria de de pergunta se tem como configurar o postfix para baixar email de outro servidor como Exchange da MS.

att
Bom trabalho em seu Blogger