Skip to main content

211.1 Utilizando servidores de E-mail


Este tópico introduz os serviços que compõe o serviço de email, mostrando como todos se interagem para fornecer a funcionalidade de um email.



Introdução


Vamos começar revisando a parte básica de um servidor de email como as nomeclaturas que são importante para o entendimento básico do funcionamento de email e os agentes que atuam para que tudo funcione.



Mail User Agent - MUA​


É o cliente de email do usuário, é por ele que o usuário vai enviar, receber e gerenciar os emails. Exemplos de MUA incluem: Thunderbird, Outlook, Gmail entre outros.

O clinte (MUA) vai gerar a mensagem e então enviar ela para o MTA, e ele quem vai se encarregar de entregar as mensagens para o servidor de email correto.



Mail Transport Agent - MTA​


É o servidor de email, ele é responsável por enviar e receber os emails, sempre garantindo que eles sejam entregues, o servidor de email usa o protocolo SMTP para enviar e receber emails.

Exemplos de MTA incluem: Postfix, Sendmailm, Qmail, Exim, Microsoft Exchange entre outros.



Mail Delivery Agent - MDA


Após o MTA do remetente enviar o email para o servidor correto, o MTA do destinatário vai enviar esse email para um MDA, ele que vai verificar se esse email não é um spam, um vírus, vai verificar se pode enviar (as vezes existem restrições como impedir anexos que tenham .iso), ele também faz o encaminhamento para outros emails, por exemplo, quando existem aliases de email.

Nessa etapa é configurado o POP, IMAP ou LMTP no MDA para garantir uma forma de entrega de emails.

Exemplos de MDA incluem: Procmail, Fetchmail, Courier, Dovecot, Maildrop, Postdrop e etc.

Para o IMAP temos 143 sem criptografia e 993 com SSL.

Para o POP temos 110 sem criptografia e 995 com SSL.



Simple Mail Tranfer Protocol - SMTP​


É o protocolo usado entre os MTA, servidores de email, é por meio desse protocolo que ele enviam mensagens uns para os outros. A porta padrão é a 25 mas não usa criptografia, para emails criptografados devem ser usados as portas 465 (SSL) ou 587 (TLS).



Processo para enviar um email


A imagem abaixo descreve o processo para enviar um email, passando por todos os pontos mencionados acima, ela não descreve em detalhes todo o processo real, é apenas uma ilustração para demonstrar onde ficam os pontos esclarecidos acima.

Email_process



Mão na massa


Vamos começar instalando o postfix.

# Instale o postfix:
$ sudo apt install -y postfix

O Postfix vai criar alguns processos, são eles:

  • MASTER

    É o processo principal que vai coordenar outros subprocessos, o Postfix é uma ferramente completa e complexa, para que tudo funcione, na maioria das vezes vamos ter subprocessos para cada tarefa.

  • PICKUP

    Esse processo vai basicamente pegar as mensagens recebidas pelo servidor de email que vão ser tratadas pelo Postfix, é ele o responsável por recebe-lâs.

  • QMGR

    Vai fazer o roteamento da mensagem para a fila correta.


Podemos ver isso com o comando abaixo:

# Vendo o processo master:
$ ps aux | grep -i "postfix.*master"
root 1291 0.0 0.2 38068 4616 ? Ss 13:59 0:00 /usr/lib/postfix/sbin/master -w

# Vendo o processo qmgr:
$ ps aux | grep -i "postfix.*qmgr"
postfix 1293 0.0 0.3 38532 6168 ? S 13:59 0:00 qmgr -l -t unix -u

# Com o pstree:
$ pstree -p 1291
master(1291)─┬─pickup(1292)
├─qmgr(1293)
└─tlsmgr(1301)

Os logs do postfix ficam em /var/log/mail.log, normalmente é mail.log, mail.err, mail.info, mail.warn etc.

Para o padrão Redhat é um pouco diferente, o padrão é mailog.


As filas internas do Postfix ficam em /var/spool/postfix/.

Já as mensagens dos usuários podem ficar em /var/spool/mail/ ou /var/mail/.



Arquivos de configuração


O Postfix possui alguns arquivos de configuração padrões, são eles:

  • master.cf

    Configuração do processo master, comportamento, quais subprocessos (vide protocolos usados), quais parâmetros vão ser passados para os subprocessos e muito mais.


  • main.cf

    Principal arquivo de configuração do Postfix, aqui configuramos o comportamento do servidor de email, regras e muito mais.



Principais configurações do Postfix


Vamos ver as principais opções de configuração do Postfix:

OpçãoDescrição
inet_interface = localhostInterface pela qual o servidor vai receber os emails, o padrão localhost só permite troca de
emails com usuários conectados na mesma máquina.
Podemos deixar como all para que aceite de todas as interfaces.
myhostname = mail.example.teÉ o nome do servidor de email na Internet, deve-se usar o FQDN.
mydomain = $myhostnameDomínio do servidor de email. Ele especifica o domínio pai de $myhostname (somente o domínio mesmo).
O exemplo usado é o padrão a menos que mydomain seja adicionado na configuração.
myorigin = /etc/mailnameDomínio que vai aparecer no remetente, normalmente é usado como valor a variável $mydomain.
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128Especifica qual servidor vai poder fazer Relayhost no servidor de email.
relayhost = IP ou FQDNPermite usar outro servidor para enviar email.
mydestination = $myhostname, mail.example.te, localhost.example.te, , localhostO parâmetro mydestination especifica quais domínios esta máquina entregará localmente, em vez de encaminhar para outra máquina.
É interessante adicionar $mydomain aqui.

Vamos enviar uma mensagem usando o telnet através de uma máquina cliente.

Como a conexão ficará meio complicada de ser visualizada por etapas, sempre que uma linha começar com $› significa que fui eu quem digitou!

# Primeiro conecte no servidor smtp:
$ telnet 192.168.121.119 25
Trying 192.168.121.119...
Connected to 192.168.121.119.
Escape character is '^]'.
220 mail.example.te ESMTP Postfix (Ubuntu)

Agora vamos fazer passo a passo as ações que são realizadas pelo protocolo SMTP quando dois hosts estão se comunicando para enviar um email. Primeiro envie um olá para o servidor se identificando:

$› HELO mailtest.example.te
250 mail.example.te

Caso você veja ELHO é o mesmo que HELO mas é usado para ESMTP, mas ambos funcionam igualmente nesse exemplo.


Agora devemos dizer quem está enviando o email:

$› MAIL FROM: fulano@mailtest.example.te
250 2.1.0 Ok

Agora vamos dizer para quem queremos enviar o email:

$› RCPT TO: jhon
250 2.1.5 Ok

E por fim vamos digitar a mensagem:

$› DATA
354 End data with <CR><LF>.<CR><LF>
$› Mensagem de test para jhon.
$› .
250 2.0.0 Ok: queued as AB14C7402E6

A mensagem é enviada quando digitamos o ponto (.).


Por curiosidade vou deixar todo esse processo como foi realizado originalmente abaixo:

$ telnet 192.168.121.119 25
Trying 192.168.121.119...
Connected to 192.168.121.119.
Escape character is '^]'.
220 mail.example.te ESMTP Postfix (Ubuntu)
HELO mailtest.example.te
250 mail.example.te
MAIL FROM: fulano@mailtest.example.te
250 2.1.0 Ok
RCPT TO: jhon
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Mensagem de test para jhon.
.
250 2.0.0 Ok: queued as AB14C7402E6

Com o código na linha final podemos verificar no servidor de email e ver detalhes no log:

$ sudo grep -i AB14C7402E6 /var/log/mail.log
Nov 4 15:42:06 mail postfix/smtpd[2133]: AB14C7402E6: client=_gateway[192.168.121.1]
Nov 4 15:43:28 mail postfix/cleanup[2157]: AB14C7402E6: message-id=<>
Nov 4 15:43:28 mail postfix/qmgr[1431]: AB14C7402E6: from=<fulano@mailtest.example.te>, size=202, nrcpt=1 (queue active)
Nov 4 15:43:28 mail postfix/local[2159]: AB14C7402E6: to=<jhon@mail.example.te>, orig_to=<jhon>, relay=local, delay=195, delays=195/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Nov 4 15:43:28 mail postfix/qmgr[1431]: AB14C7402E6: removed

# Olhe na mailbox do jhon para ver se o email foi entregue:
$ sudo cat /var/spool/mail/jhon
From fulano@mailtest.example.te Fri Nov 4 15:43:28 2022
Return-Path: <fulano@mailtest.example.te>
X-Original-To: jhon
Delivered-To: jhon@mail.example.te
Received: from mailtest.example.te (_gateway [192.168.121.1])
by mail.example.te (Postfix) with SMTP id AB14C7402E6
for <jhon>; Fri, 4 Nov 2022 15:40:13 +0000 (UTC)

Mensagem de test para jhon.


Configurações Adicionais no Postfix


Vamos introduzir o que chamamos de canonical_maps, é uma forma de mapear um nome de usuário diferente do que realmente é. Para criar essas configuração devemos adicionar essa configuração ao main.cf:

sender_canonical_maps = hash:/etc/postfix/scanonical

# sender_canonical_maps = Para o remetente.
# recipient_canonical_maps = Quando receber.
# Somente 'canonical_maps' faz para os dois.

Agora temos que criar o arquivo e adicionar a configuração.

# Crie o arquivo:
$ sudo touch /etc/postfix/scanonical

# Adicione a conf abaixo nele:
$ sudo cat /etc/postfix/scanonical
jhon Jhon.Wick

# Refaça o map:
$ sudo postmap sender_canonical

# Restarte o postfix:
$ sudo systemctl restart postfix

Agora quando receber um email do Jhon (nesse servidor) ele não será mais jhon@mail.example.te e sim Jhon.Wick@mail.example.te.


Dependendo da sua configuração, pode ser preciso utilizar o seguinte formato no arquivo sender_canonical:

alias     usuario@seudominio.com.br


Configurações de SMTPS (TLS)


Nesse ponto vamos ver o SMTPS ou o TLS/SSL sobre o SMTP, o que introduz uma camada de segurança/criptografia aos servidores de email.

Com essa técnica é introduzida o controle de acesso daqueles que vão usar o servidor SMTP para enviar mensagens, por exemplo, para usuários é preciso ter um acesso para conseguir enviar/receber mensagens.

Por padrão não é habilitado, para habilitar vamos modificar o arquivo main.cf e ativar as opções abaixo:

# Ativar o uso do SMTPS:
smtpd_use_tls = yes
smtpd_tls_security_level = encrypt

# Informar ao Postfix os arquivos para o certificado:
smtpd_tls_cert_file = /etc/postfix/cert.pem
smtpd_tls_key_file = /etc/postfix/key.pem

# Configuração para os CIPHERS:
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5

# Quais protocolos usar:
smtpd_tls_protocols = TLSv1

# Reinicie o postfix:
$ sudo systemctl restart postfix

A opção smtpd_tls_security_level ainda pode ser configurada como opcional caso seja definido assim: smtpd_tls_security_level = may.

Pode criar o certificado com o comando abaixo:

openssl req -nodes -x509 -newkey rsa:1024 -keyout key.pem -out cert.pem.



Principais Comandos


Vamos ver os principais comandos usados para se gerenciar um servidor de email.

ComandosDescrição
mailqUsado para verificar a fila de emails. O comando mailq é do sendmail, mas é mantido por questões de compatibilidade.
postqueue -pTambém é usado para verificar a fila de emails. Mas esse comando é do Postfix mesmo.
sendmail -bpTambém é usado para verificar a fila de emails.
postconf -dMostra todas as opções ativas do postfix.
postfix (opção)Usado para gerenciar o processo do postfix.
postfix flushForça o reenvio das mensagens.
postqueue -fTambém força o reenvio das mensagens.
postcat (arquivo)Usado para ler uma mensagem SMTP bruta.
portsuper -d ALLDeleta todas as mensagens da fila.

Uma outra ferramenta muito útil para analisar a fila de e-mails é o qshape. Com esse comando ele nos retorna as mensagens que estão ficando presas na fila, qual a origem/destinos e etc. Para conseguir usar essa ferramenta precisamos instalar o pacote postfix-perl-scripts.