Servidor de e-mail Postfix (parte 1 – instalação mínima)

Publicado: 18/09/2017 em Linux, Serviços IP
Tags:,

1) Introdução
Os procedimentos aqui realizados foram testados utilizando o Debian/Linux 8 (debian Jessie) com o Postfix 2.11. O intuito deste post é registrar o que seria uma configuração muito básica para funcionamento de um serviço de email com o Postfix.

2) Fazer duas configurações oportunas numa nova instalação
a) Atualizar data e hora do servidor:
# dpkg-reconfigure tzdata

Para verificar:
# date
Dom Set 17 13:14:05 -03 2017

b) Configurar a língua portuguesa para interface com o sistema e aplicativos
# apt-get install locales
# dpkg-reconfigure locales

…selecionando pt_BR.UTF-8 UTF-8

Para verificar:
# echo $LANG
pt_BR.UTF-8

3) Instalar o postfix

Para uma instalação mais completa de um ambiente de mensageria, são sugeridos os seguintes pacotes:
postfix-mysql postfix-pgsql postfix-ldap postfix-pcre sasl2-bin dovecot-common resolvconf postfix-cdb ufw postfix-doc openssl-blacklist

Mas neste primeiro instante vamos instalar apenas os pacotes: postfix e ssl-cert

$ apt-cache policy postfix
# apt-get install postfix ssl-cert

Tela 1 de instalação do Postfix

Tela 2 de instalação do Postfix

Após as duas telas básicas de configuração que exemplificamos acima, a instalação deve ocorrer e a seguinte mensagem ao final é colocada:
Postfix is now set up with a default configuration. If you need to make changes, edit /etc/postfix/main.cf (and others) as needed. To view Postfix configuration values, see postconf(1).
After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.

O que fora feito na instalação? As principais ações foram:
Adicionado novo grupo 'postfix' (GID 116)
Adicionado novo usuário 'postfix' (UID 109) com grupo 'postfix'
Criado o diretório '/var/spool/postfix' com seus subdiretórios
Adicionado novo grupo 'postdrop' (GID 117)
setting myhostname: server17.netlivre.org
setting alias maps
setting alias database
setting myorigin
setting destinations: server17.netlivre.org, localhost.netlivre.org, localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_command
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all

Observações:
a) Cada máquina é identificada por um nome principal (ou “canônico”), the system’s host name, armazenado no arquivo /etc/hostname. Quando da instalação do S.O. da máquina, definimos para os exercícios deste post:
$hostname = server17

b) O nome de domínio (domain name) vem de um nome de máquina completo, adquirido através de resolução de nome, presente no arquivo /etc/hosts. Deve-se escrever neste arquivo /etc/hosts um nome completo para a máquina no começo da lista de nomes associada com o endereço da máquina, como no exemplo seguinte:
<ip-máqina> server17.netlivre.org server17

c) Para configuração do parâmetro myhostname do Postfix, o padrão é usar o “fully-qualified domain name (FQDN)”, no caso server17.netlivre.org.

d) Já “destinations” é formado pelo Postfix da seguinte forma: $myhostname, localhost.$mydomain, localhost. Assim, teremos no nosso caso o parâmetro correspondente do Postfix, que é mydestination, conformado da seguine maneira:
mydestination = server17.netlivre.org, localhost.netlivre.org, localhost

4) Iniciar o postfix e verificar se deamon postfix está ativo, bem como sua versão
# /etc/init.d/postfix start
$ /usr/sbin/postconf -d | grep mail_version
mail_version = 2.11.3

Para verificar se o deamon do postfix está ativo, proceder de quatro maneiras:
i) Procedimento 1: verificar os processos ativos


# ps -aux | grep --color postfix
postfix   3110  0.0  0.1  42460  5564 ?  S   Set17  0:00 tlsmgr -l -t unix -u -c
postfix  12157  0.0  0.0  38232  3796 ?  S   00:08  0:00 pickup -l -t unix -u -c
root     29139  0.0  0.1  36168  3904 ?  Ss  Set16  0:00 /usr/lib/postfix/master
postfix  29141  0.0  0.1  38392  4020 ?  S   Set16  0:00 qmgr -l -t unix -u

ii) Procedimento 2: invocar o status do deamon
# postfix status
postfix/postfix-script: the Postfix mail system is running: PID: 29139

iii) Procedimento 3

$ /etc/init.d/postfix status
● postfix.service - LSB: Postfix Mail Transport Agent
   Loaded: loaded (/etc/init.d/postfix)
  Drop-In: /run/systemd/generator/postfix.service.d
           └─50-postfix-$mail-transport-agent.conf
   Active: active (running) since Sáb 2017-09-16 22:23:26 -03; 2 days ago

iv) Procedimento 4: verificar o log do postfix
# cat /var/log/mail.log

Observações:
a) Para listar informações do subsistema de rede do Linux, pode-se usar o netstat. Assim, pode-se ver o estado das conexões de rede através da listagem dos sockets abertos. Os sockets ativos de todas as famílias de endereços configuradas serão identificados:

# netstat -ltunp | grep --color -E "smtp|master"
tcp        0      0 *:smtp           *:*        OUÇA       29139/master    
tcp6       0      0 [::]:smtp        [::]:*     OUÇA       29139/master 

Onde as colunas de saída deste comando representa:
protocolo, Recv-Q, Send-Q, Endereço Local, Endereço Remoto, Estado, PID/Program name

b) Um comando ainda mais seguro que o netstat seria usando nmap: nmap -A -T4 localhost (que pode demorar vários minutos para apresentar a resposta).

c) Portas associadas à lista oficial de serviços conhecidos:

# cat /etc/services
smtp	25/tcp	   mail
urd	465/tcp	   ssmtp smtps  # URL Rendesvous Directory for SSM

Onde as quatro colunas são: nome do serviço, porta/protocolo, aliases, comentários.

d) Se deseja descobrir quais portas os programas estão usando, deve-se usar o programa lsof para descobrir exatamente quais portas estão vinculadas a quais processos. Exemplos de comandos:
# lsof | grep --color smtpd
# lsof -i TCP:25
# lsof -i:25

e) Um pouco mais das diferenças entre Nmap, Netstat e lsof

Nmap:
O Nmap é um scanner de portas, uma ferramenta de mapeamento de rede. Isso significa que é usado para descobrir informações sobre hosts em uma rede (seu ip, portas abertas, etc.). O Nmap obtém suas informações por experiência, tentando se conectar a cada porta por sua vez e exibindo o resultado da tentativa de conexão. Esse processo é muito mais lento, portanto, por padrão, ele só tenta os 1000 números de portas mais comuns. Ele pode investigar cada porta para determinar o tipo de serviço que está sendo executado nela, mas não pode mostrar o ID do processo. Nmap pode:

  • Mostrar portas abertas em um sistema remoto;
  • impressão digital da pilha TCP/IP de um alvo;
  • determinar informações sobre a versão do serviço e da aplicação;
  • e muito mais.

Então, quando se deve usar o Nmap?

  • quando se quer saber sobre portas abertas em um sistema remoto;
  • quando quiser mais informações sobre o serviço que está ouvindo em cada porta;
  • quando se precisa de uma segunda opinião sobre as portas de escuta;

Netstat:
Netstat (do pacote net-tools) é uma ferramenta de estatística de rede usada para listar conexões ativas, de e para, o seu computador. A lista pode ser bem longa já que inclui muitos soquetes Unix-domain (amplamente usados por daemons) que não tem nada a ver com redes (por exemplo, comunicação dbus, tráfego X11 e comunicações entre sistema de arquivos virtuais e o desktop). O Netstat obtém suas informações diretamente do sistema operacional. Ele pede ao kernel uma lista de todas as portas de escuta e as exibe. Pode mostrar quais endereços estão a ouvir que portas e, com o privilégio suficiente, quais IDs dos processos. Netstat pode:

  • mostrar as conecções correntemente-ativas;
  • mostrar informações das rotas;
  • mostrar estatísticas das interfaces de rede;
  • e muito mais.

Então, quando deve-se usar o netstat?

  • quando se quer saber o que está sendo ouvido em sua máquina local;
  • quando se precisa de informações de processo ou interface/endereço para cada porta;
  • quando se confia no sistema operacional para dar a resposta correta. Se você foi pirateado, um rootkit pode fazer o sistema operacional mentir para netstat sobre o que realmente está acontecendo. Ou seja, Netstat é menos confiável que Nmap (já que Netstat não conecta à máquina pela rede, mas checam o que está sendo executado no sistema. Por esta razão, esta aplicação pode ser alvo de substituição por atacantes).

Ons: quando se desejar um monitoramento interativo, pode-se fazer por exemplo:
# watch -n 1 netstat -ta

Lsof:
O Lsof (LiSt Open Files) é um utilitário de linha de comando que lista informações sobre arquivos abertos por processos, onde um arquivo aberto pode ser um arquivo regular, um diretório, um arquivo especial de bloco, um arquivo especial de caracter, uma referência textual de execução, uma biblioteca, um stream ou um arquivo de rede (soquete de internet, arquivo NFS ou soquete de domínio UNIX). Lsof é uma espécie de netstat + ps combinados.

5) Anatomia do Postfix
A figura a seguir mostra os principais componentes do sistema Postfix, e os principais fluxos de informação entre eles:

Anatomia do Postfix 1

5.1) Recebendo e-mails
Quando uma mensagem entra no sistema de correio Postfix, a primeira parada é a fila de entrada (“incoming queue”). A figura abaixo mostra os principais componentes que estão envolvidos com novas mensagens:

Anatomia do Postfix 2

  • e-mail postado localmente: o programa sendmail do Postfix invoca o programa postdrop que deposita a mensagem no diretório maildrop, onde a mensagem é retirada pelo daemon pickup. Este daemon faz algumas verificações de sanidade, a fim de proteger o resto do sistema Postfix.
  • e-mail entra a partir da rede: o servidor SMTP do Postfix recebe a mensagem e faz algumas verificações de sanidade, a fim de proteger o resto do sistema Postfix.
  • e-mail gerado internamente pelo próprio sistema Postfix para retornar o correio não entregue ao remetente: os deamons bounce (chamado também pelo nome defer) encaminha as más notícias.
  • e-mail encaminhado pelo agente de entrega local, seja através de uma entrada no banco de dados de alias do sistema, ou através de uma entrada em um arquivo .forward por usuário: isto está indicado com a seta não marcada.
  • e-mail gerado internamente pelo próprio sistema Postfix, a fim de notificar o postmaster de um problema (esse caminho também é indicado com a seta não marcada): o sistema Postfix pode ser configurado para notificar o postmaster de problemas de protocolo SMTP, violações de políticas UCE, e assim por diante.
  • o daemon cleanup implementa a fase final de processamento de novas mensagens. Ele adiciona na mensagem, quando ausente, o “From:” e outros cabeçalhos da mensagens, organiza a reescrita de endereços a forma padrão user@fully.qualified.domain e, opcionalmente, extrai os endereços de destinatários dos cabeçalhos das mensagens. O daemon cleanup insere o resultado como um arquivo na fila única de entrada e notifica o gerenciador de filas qmgr da chegada do novo correio. O daemon cleanup pode ser configurado para transformar endereços com base nas tabelas de pesquisas canônica e virtual.
  • a pedido do daemon cleanup, o daemon trivial-rewrite reescreve os endereços para a forma padrão user@fully.qualified.domain.

6) Arquivos de configuração do postfix
Os dois principais arquivos de configuração do postfix são:
/etc/postfix/master.cf; e
/etc/postfix/main.cf

Se alterar um desses arquivos, o postfix deve ser recarregado:
# /etc/init.d/postfix reload

Normalmente, o arquivo que se edita com maior frequência é “main.cf”, que é o arquivo onde estão definidos os parâmetros que controlam o comportamento dos processos daemon do Postfix. Se o valor de um parâmetro não for especificado no “main.cf”, o Postfix usará o valor padrão que está codificado diretamente no código-fonte.

O formato do arquivo de configuração main.cf pode ser encontrado em postconf(5), ou através de linha de comando via terminal:
$ man -e 5 postconf

Neste arquivo de documentação se descreve todos os parâmetros de configuração disponíveis.


7) Processo mestre do postfix: master

O daemon “master(8)” ($ man -e 8 master) é o processo residente que executa os daemons Postfix sob demanda: daemons para enviar ou receber mensagens via rede, daemons para entregar o correio localmente, etc. Esses daemons são criados sob demanda até um número máximo configurável por serviço.

O comportamento do deamon master(8) é controlado através do arquivo de configuração master.cf, como está descrito em master(5) ($man -e 5 master).

8) Caixas de correio para entregas locais
As caixas de correio podem ser de dois formatos: maildir e mbox. Por padrão, o Postfix entrega as mensagens locais (mensagens para os domínios listados no parâmetro de configuração, em main.cf, mydestination) no formato mbox. O formato mbox para caixas de correio armazena todas as mensagens de uma caixa de correio em um único arquivo de texto. Cada usuário terá sua caixa de correio.

O local onde estarão estas caixas de correio é definida através do parâmetro de configuração, em main.cf, chamado mail_spool_directory. Por padrão do Postfix no Debian, seu valor é /var/mail, conforme podemos ver:

# postconf | grep mail_spool_directory
mail_spool_directory = /var/mail

Vejamos um exemplo típico de conteúdo desta pasta:

$ ls -la /var/mail
total 16
drwxrwsr-x 2 root mail 4096 .
drwxr-xr-x 12 root root 4096 ..
-rw-rw---- 1 antonio mail 514 antonio
-rw-rw---- 1 sergio mail 1015 sergio

Temos dois arquivos que correspondem as caixas postais de destino de dois usuários: cada arquivo correspondendo a um usuário da máquina local. Ou seja, o arquivo de caixa de correio tem o mesmo nome do usuário do S.O. As mensagens que chegam para cada usuário vão sendo adicionadas uma após a outra dentro do arquivo de destino correspondente.

Caso se deseje alterar esta pasta padrão de entrega das mensagens do Postfix (que no caso do Debian é a pasta /var/mail), fazê-lo através do parâmetro de configuração home_mailbox (em main.cf).
Obs: o parâmetro home_mailbox só é eficaz para domínios locais quando o próprio Postfix realiza a entrega. Se a entrega for feita por algum outro agente de entrega como Procmail ou Maildrop, será necessário configurar esse software para entrega maildir.

9) Apelidos locais (“local aliases”)
Tabelas de apelidos locais ($ man -e 5 aliases) fornecem um mecanismo ao sistema para redirecionar o correio (e-mail) para outros destinatários locais, ou pertencentes a qualquer domínio da internet. Essas tabelas de pesquisa são especificadas através do parâmetro do Postfix alias_maps. O valor padrão é mostrado a seguir:
# postconf -n | grep alias_maps
alias_maps = hash:/etc/aliases

É possível indicar mais de uma tabela de apelidos locais (“local aliases”). Para isso, estas devem estar listadas no parâmetro do Postfix “alias_maps” separadas por espaços em branco ou vírgula. As tabelas serão procuradas na ordem especificada até encontrar uma correspondência. Nota: estas procuras são recursivas.

Os redirecionamentos são processados pelo agente Postfix de entrega de e-mails “local“. Ou seja, só serão aplicados a apelidos de usuários locais (apelidos a nível do S.O.) e já na última etapa de trabalho do Postfix. O arquivo /etc/aliases é parte do sendmail ($ man sendmail), que é instalado no momento da instalação do Postfix. Esta tabela se encontra em /etc/aliases, podendo ser editada. Para que a tabela tenha efeito, é necessário executar o comando a seguir:
# newaliases

Esse comando serve para construir o arquivo de mapa /etc/aliases.db, que será lido e interpretado pelo Postfix. O arquivo aliases.db é um banco de dados em arquivo em formato BDB:
$ file /etc/aliases.db
/etc/aliases.db: Berkeley DB (Hash, version 9, native byte-order)

Um arquivo típico de apelidos (“aliases”) locais poderia ser:
# arquivo típico de aliases
# neste arquivo de aliases declaramos os apelidos e as contas de destino
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
operador: licia@comando.com
news: root
webmaster: root
security: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: sergio
redes: antonio, sergio

Pelo exemplo da tabela aliases acima, todas as mensagens enviadas para os usuários postmaster, nobody e hostmaster acabarão caindo na caixa postal do usuário local sergio. Já as mensagens destinadas ao operador serão reencaminhadas ao endereço licia@comando.com.
Obs: mailer-daemon, hostmaster e postmaster são endereços especiais de mail exigidos por vários RFC’s (em especial a RFC 2142, section 5).


10) Verificando a porta do serviço de e-mail

Uma maneira mundo fácil é utilizando a ferramenta Telnet. Telnet é uma ferramenta bastante útil para solucionar problemas relacionados ao SMTP e fluxo de mensagens. Por exemplo, Telnet pode ser usado para verificar se o SMTP está instalado corretamente e que ele possui todos os comandos necessários.

Verificaremos se o serviço de e-mail está funcionando, e em que porta ele está configurado para trabalhar (porta 25 ou a 465):

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 server17.netlivre.org ESMTP Postfix (Debian/GNU)

$ telnet 127.0.0.1 465
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

Pelas duas tentativas acima vemos claramente que a porta em uso é a porta 25.

11) Testando envio de e-mail para usuários locais com o aplicativo “mail”

Tem um aplicativo que envia e-mail via texto, chamado “mail” ($ man mail).
Exemplo de comando:
$ mail root -s teste10
digitar aqui o corpo da mensagem <Enter>
<Ctrl-D>

12) Testando envio de e-mail para usuários locais com o aplicativo “Telnet”
Supondo que a porta em uso é a 25, teremos:

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 server17.netlivre.org ESMTP Postfix (Debian/GNU)
helo netlivre.org
250 server17.netlivre.org
mail from: antonio
250 2.1.0 Ok
rcpt to: sergio
250 2.1.5 Ok
rcpt to: root
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: teste com uso do telnet
Teste de envio de mensagem com Telenet. Vamos esperar que a mensagem seja enviada.
.
250 2.0.0 Ok: queued as 8DD22DA0072
quit
221 2.0.0 Bye
Connection closed by foreign host.

No exemplo acima, temos uma mensagem que foi enviada para os usuários sergio e root.

Verificando existência de usuários:
# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 server17.netlivre.org ESMTP Postfix (Debian/GNU)
vrfy root
252 2.0.0 root
vrfy sergio
252 2.0.0 sergio
vrfy redes
252 2.0.0 redes
vrfy joao
550 5.1.1 <joao>: Recipient address rejected: User unknown in local recipient table

No caso acima, os usuários root, sergio e redes existem na máquina. Já o usuário joao é inexistente.

Referências:
1- Servidor de e-mail Postfix (parte 2 – logs e programas de suporte)
2- Postfix – Debian Wiki
3- Exemplo de um arquivo de configuração do Postfix main.cf
4- PostfixBasicSetupHowto

Anúncios

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s