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.
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ção | Descrição |
---|---|
inet_interface = localhost | Interface 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 = $myhostname | Domí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/mailname | Domí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]/128 | Especifica qual servidor vai poder fazer Relayhost no servidor de email. |
relayhost = IP ou FQDN | Permite usar outro servidor para enviar email. |
mydestination = $myhostname, mail.example.te, localhost.example.te, , localhost | O 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 queHELO
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 simJhon.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.
Comandos | Descrição |
---|---|
mailq | Usado para verificar a fila de emails. O comando mailq é do sendmail , mas é mantido por questões de compatibilidade. |
postqueue -p | Também é usado para verificar a fila de emails. Mas esse comando é do Postfix mesmo. |
sendmail -bp | Também é usado para verificar a fila de emails. |
postconf -d | Mostra todas as opções ativas do postfix. |
postfix (opção) | Usado para gerenciar o processo do postfix. |
postfix flush | Força o reenvio das mensagens. |
postqueue -f | Também força o reenvio das mensagens. |
postcat (arquivo) | Usado para ler uma mensagem SMTP bruta. |
portsuper -d ALL | Deleta 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
.