Tutorial como criar Servidor de Emails completo no Ubuntu

Objetivos

  • Entender o que é um servidor
  • Saber as atribuições de um servidor de email
  • As necessidades para criar um servidor de email
  • Passo a passo para criar um servidor de email completo no Ubuntu

O que é um servidor

Dentro do contexto de computação, rede, internet e serviços, um servidor possui duas características principais:
Do ponto de vista de hardware (equipamento necessário), um servidor é um computador, e possui a maioria das características que um computador possui: placa mãe, processador, memória ram, dispositivo de armazenamento, etc.
Na visão de software, um servidor pode ser definido como um conjunto de programas de computador que visam prestar um serviço.

Quais as atribuições de um servidor de email?

Como vimos a definição generalista para o conceito de servidor, agora podemos especificar de uma forma mais sucinta o que é um servidor de emails.
Uma explicação bastante simplificada define um servidor de emails como um computador configurado com softwares que visam realizar tarefas relacionadas ao envio e recebimento de emails.
Este servidor pode ser configurado em uma rede local, sem acesso a internet, provendo envio e recebimento de emails de forma restrita dentro de uma empresa, por exemplo. Ou pode ser configurado com acesso a internet, provendo serviço de envio e recebimento de email de forma ampla, para domínios externos.

Quais as necessidades para criar um servidor de emails

O primeiro passo é ter um computador disponível.

Caso pense em um projeto didático, pode criar um servidor localmente em sua casa. Se sua empresa de fornecimento de internet disponibilizar um IP real, é possível abrir as portas necessárias no seu roteador, para dar acesso a envio e recebimento de emails na internet para o seu servidor, a única ressalva é que geralmente não poderá configurar facilmente uma entrada DNS do tipo PTR, mas não é um problema tão grande inicialmente.

Lembrando que é necessário ter um sistema operacional instalado. Você pode realizar esta etapa manualmente ou utilizar uma imagem pronta do sistema operacional para seu setup. Por exemplo, se optar por um Raspberry Pi, pode utilizar uma imagem pronta do Ubuntu Server, poupando a etapa de instalação do sistema operacional.

Caso opte por utilizar uma máquina virtual, também existem imagens do Sistema Operacional já prontas.

Agora, se tiver um computador antigo em casa e precise instalar o sistema operacional, basta seguir os passos do Tutorial setup Servidor Linux Ubuntu Local, lembre de começar a partir do passo 9 (e você precisa de um pen drive com a imagem de um SO para dar boot no instalador).

Uma opção mais funcional é alugar um servidor do tipo VPS (Virtual Private Server), ele funciona como um computador já ligado na internet, com IP real configurado e geralmente é possível configurar a entrada DNS do tipo PTR sem problemas. Este servidor já vem com sistema operacional instalado, poupando esta etapa de configuração.

Uma visão ampla do processo envolve várias etapas, mas podemos citar:

    • Escolha de um domínio/subdomínio para o servidor
    • Setup de Hardware
      • Escolha do equipamento: computador pessoal ou raspberry pi, ou um VPS, etc.
    • Setup de Software
      • Instalação do Sistema Operacional
      • Configuração DNS
      • Configuração do domínio/subdomínio no servidor
      • Instalação servidor http (Apache ou Nginx) – para dar suporte administrativo (PostfixAdmin) e cliente web para acesso aos emails (Roundcube)
      • Instalação de banco de dados (MySQL/MariaDB ou Postgresql) – para gerenciar armazenamento de emails
      • Instalação de certificados SSL (TLS) para o domínio e subdomínio
      • Instalação do Postfix para gerenciar processo de envio e recebimento de emails
      • Instalação e configuração PostfixAdmin (acesso web para criar novas caixas de email)
      • Verificar portas abertas no servidor (firewall) e abrir portas, caso necessário
      • Instalação do OpenDKIM
      • Configurar suporte SPF, DKIM e DMARC no DNS do domínio do servidor de email
      • Integrar DKIM e DMARC no Postfix
      • Instalação e configuração Dovecot para suporte de conexão IMAP para clientes de email
      • Mudar o escopo de armazenamento de emails do tipo sistema de arquivos para banco de dados
      • Mudar o escopo de caixas de email vinculadas aos usuários do linux, para caixas de email virtuais (gerenciadas pelos usuários cadastrados no banco de dados pelo postfixadmin – virtual mail box)
      • Instalação e configuração Roundcube (acesso web para ler e enviar emails)
      • Suporte para configuração de vários domínios no servidor de email: neste setup, configuramos que o servidor só pode enviar email e criar caixas para o dominio1.com.br, por exemplo; Com esta etapa, permite configurar domínios adicionais: dominio2.com.br, dominio3.com.br, onomededominioqueeuquiser.com.br, etc.

Passo a para criar servidor de email completo no Ubuntu

Vamos começar partindo do princípio que você já tem um computador com sistema operacional instalado, ou um VPS.
Neste exemplo, vou criar o servidor baseado no domínio viniciuspaes.com. Lembre-se de alterar este domínio, para seu domínio escolhido. Lembre-se que você precisa ser o dono do domínio escolhido, ou seja, tenha realizado o processo de registro do domínio que deseja utilizar. Caso tenha dúvida em como fazer, acesse o Tutorial de como registrar domínio na internet. Lembrando que domínio com final .br só pode ser registrado pelo site do Registro.br.

Passo 1

Conecte no seu servidor por SSH, exemplo:

ssh usuario@ip

Ou caso utilize uma chave:

ssh -i chave.pem usuario@IP

Passo 2

Verificar o hostname do servidor, digite:

hostname

O ideal é termos o hostname configurado corretamente. Por exemplo, caso meu domínio escolhido seja o viniciuspaes.com, quero configurar o meu servidor de email em um subdomínio chamado mail.viniciuspaes.com. O ideal é ter então o hostname configurado para mail.viniciuspaes.com.
Podemos editar o arquivo:

sudo nano /etc/hostname

E alterar seu conteúdo para:

mail.viniciuspaes.com

Outra opção é utilizando o comando:

sudo hostnamectl set-hostname mail.viniciuspaes.com

É comum o hostname não ficar persistente após reiniciar o servidor, para garantir que não ocorra, esta etapa opcional pode resolver o problema:
Edite o arquivo:

sudo nano /etc/cloud/cloud.cfg

Procure a linha que começa com:

preserve_hostname

Precisamos que ela fique ativada, se ela tiver com a opção “false”, então altere a linha toda para:

preserve_hostname: true

Servidor Emails - Preserve Hostname

Agora faça um teste, reinicie o servidor:

sudo reboot now

Agora conecte novamente por SSH no servidor após ele terminar o boot (pode demorar alguns minutos).
Verifique novamente o hostname, para verificar se ficou persistente:

hostname

Passo 3

Agora é necessário realizar algumas alterações nas entradas DNS do seu domínio. O que eu faço para facilitar o processo, é redirecionar meus domínios do Registro.BR para a DigitalOcean gerenciar o DNS. Pois a considero o serviço de gerenciar o DNS do Registro.BR um pouco lento. Então, se utilizar um domínio com final .BR é uma opção a ser considerada. É possível utilizar também outra empresa para gerenciar o DNS, como o Route66 da Amazon AWS.
Neste exemplo utilizo um domínio .com, registrado no Google Domains; local também onde gerencio o DNS. A interface do Google Domains é satisfatória, então não vou redirecionar meu DNS do Google Domains para outra empresa gerenciar.

Neste passo, precisamos inserir entradas DNS. Primeiramente precisamos informar qual servidor irá gerenciar os emails para o domínio. Isto é feito pela entrada do tipo MX.
Então vou criar uma entrada MX com as informações:

Nome do host: viniciuspaes.com
Tipo: MX
TTL: 3600
Prioridade: 0
Dados: mail.viniciuspaes.com

No exemplo acima, algumas empresas optam por separar o campo de prioridade do servidor de email, no caso do Google Domains, ele aparece no campo Dados, separando a prioridade com um espaço do nome do subdomínio.

Com a criação desta entrada DNS quando alguém enviar um email para qualquercaixa@viniciuspaes.com, ele vai entender que o servidor de email está configurado no subdomínio mail.viniciuspaes.com, pois foi o que configuramos no exemplo acima.

Mas agora precisamos informar em qual IP o servidor de email está configurado. Então, para esta etapa, precisamos criar uma entrada do tipo A, que direciona um nome de domínio (ou subdomínio) para um IP, ou seja, o mail.viniciuspaes.com vai para qual IP?
Então, vamos criar uma entrada DNS do tipo A:

Nome do host: mail.viniciuspaes.com
Tipo: A
TTL: 1800
Dados: (digite o endereço IP do seu servidor)

Passo 4

Vamos instalar agora o principal software do servidor de emails. Este que gerencia o processo de envio e recebimento de emails. Digite o comando abaixo para instalar o Postfix:

sudo apt install postfix

No processo de instalação quando perguntarem “General type of mail configuration”, selecione:

Internet Site

Servidor de Emails - tela instalação postfix - Internet Site

Quando perguntarem “System mail name”, selecione o seu domínio principal, não insira o subdomínio:

viniciuspaes.com

Servidor de Email - definir domínio principal

Agora é interessante verificar se a porta 25 (smtp) responsável por enviar emails está aberta e funcional, acesse o site do link abaixo e insira seu IP e a porta 25 e clique para realizar o teste:

https://www.yougetsignal.com/tools/open-ports/

Servidor Email - testando porta 25 aberta com site yougetsignal

Caso a porta esteja fechada, teste se o seu IP do servidor realmente está correto. Se utilizar o endereço do subdomínio (mail.viniciuspaes.com) tenha certeza que o endereço está com o DNS correto direcionando para o IP do servidor. Caso esteja tudo certo, tente abrir a porta 25 no firewall do Ubuntu (caso o firewall realmente esteja instalado):

sudo ufw allow 25/tcp

Caso ainda tenha algum erro, é possível verificar quais portas o Postfix está escutando, digite o comando:

sudo ss -lnpt | grep master

No comando acima, é possível verificar algo parecido como:

LISTEN 0      100          0.0.0.0:25        0.0.0.0:*    users:(("master",pid=1610,fd=13))

O resultado acima mostra que o processo mestre do Postfix está utilizando a porta 25 (0.0.0.0:25)

Servidor de emails - verificar servidor escutando porta 25

Uma outra forma de testar, é se conectar ao servidor de email do google por telnet. Vamos instalar telnet com o comando:

sudo apt install telnet

Agora vamos tentar realizar uma conexão, utilizando o comando:

telnet gmail-smtp-in.l.google.com 25

Servidor Emails - conectar telnet no gmail para testar

Caso consiga realizar a conexão nas etapas acima, tudo certo!
Caso negativo, será necessário entrar em contato com a empresa onde contratou o VPS e pedir para abrirem as portas de envio e recebimento de emails para você. Caso seu servidor seja local, em sua residência, será necessário abrir as portas de envio e recebimento de email, e realizar um port foward para o IP local do seu servidor.

Passo 5

Tecnicamente já temos o servidor de email pronto para enviar email. Porém não possui autenticação TLS e nem entradas DNS para proteção contra spoof, spam e outros. Mas já podemos realizar um teste, enviando email pela linha de comando. Já adianto que o email será recusado, pois ainda não temos SPF, DKIM e DMARC configurados, mas vamos lá:

echo "teste envio de email por linha de comando" | sendmail seuemail@gmail.com

No comando acima, lembre-se de trocar seuemail@gmail.com por uma caixa de email que você tenha acesso.

Agora é interessante olhar o log de email, para ver se o email foi enviado, ou se aconteceu algum problema:

cat /var/log/mail.log

Fiz um teste de envio para uma conta que tenho no gmail.com e outra no icloud.com, em ambos os casos o email foi recusado. Segue um exemplo de erro que pode aparecer:

GMAIL:
<seuemail@gmail.com>: host gmail-smtp-in.l.google.com[142.250.0.26] said: 550-5.7.1 [100.100.100.100] 
The IP you're using to send mail is not authorized to 550-5.7.1 send email directly to our servers. 
Please use the SMTP relay at your 550-5.7.1 service provider instead. Learn more at 550 5.7.1  
https://support.google.com/mail/?p=NotAuthorizedError .157 - gsmtp (in reply to end of DATA command)


ICLOUD:
<seuemail@icloud.com>: host mx02.mail.icloud.com[17.57.156.30] said: 550 5.7.1 Mail from IP 100.100.100.100 
was rejected due to listing in Spamhaus PBL. For details please see http://www.spamhaus.org/query/bl?ip=100.100.100.100 (in reply to RCPT TO command)

Na sua conta de email externa (gmail, icloud, outlook, etc) tente enviar um email para você. Por exemplo, se o seu login no Ubuntu é ubuntu e o seu domínio é viniciuspaes.com, automaticamente sua conta de usuário do Linux também é uma caixa de email. Ou seja, tente enviar um email para ubuntu@viniciuspaes.com.

As caixas de email baseadas em usuário do linux ficam armazenadas no diretório /var/mail.
Para olhar as caixas já criadas, utilize o comando:

ls /var/mail

Neste exemplo temos o usuário ubuntu criado. Podemos editar o arquivo para ver o email:

sudo nano /var/mail/viniciuspaes

Ou apenas mostrar seu conteudo:

sudo cat /var/mail/viniciuspaes

Caso o email tenha chego corretamente, o arquivo irá contar com bastante texto, boa parte sendo o header (cabeçalho) do email. Estas informações de cabeçalho normalmente são ocultas quando olhamos o email em um cliente com interface gráfica.

Um upgrade para visualizar o email em linha de comando é instalar o pacote mailutils:

sudo apt install mailutils

Faça outro teste e envie um novo email para seu usuário do servidor, utilizando uma caixa de email externa (por exemplo, vá no seu gmail e mande um email para ubuntu@viniciuspaes.com, não esqueça de trocar viniciuspaes.com pelo nome do seu domínio e ubuntu pelo seu nome de usuário de login).

Servidor Emails - envie um email do gmail para seu servidor

Com o mailutils instalado, você pode checar a caixa de email com o comando:

mail

Se tudo correr bem, você vai entrar no aplicativo em linha de comando chamado mail. Se tiver emails em sua caixa de entrada, cada email vai ter um ID numérico: 1, 2, 3 …, n.
Para ler o email, basta digitar o ID do mesmo para abrí-lo.

Servidor Email - email oriundo do gmail recebido

O email será apresentado por pedaços, pois geralmente seu cabeçalho é muito grande. Tecle ENTER ou seta para baixo para ir mostrando o email aos poucos. Ao terminar de ler, aperte a tecla “x” para fechar.

Não precisa se preocupar muito em aprender a utilizar o programa mail (linha de comando) futuramente vamos instalar interface gráfica com roundcube. Estes passos são somente para testes iniciais no servidor. Mas em todo caso, segue um resumo das principais funções (teclas de execução/atalho) do software:

  • h – acessar o header de um email
  • z – ir para o fim do email
  • n – ir para o próximo email
  • r – responder um email que está lendo
  • r 1 – (dentro do menu inicial) responder o email com ID = 1
  • d 1 – (dentro do menu inicial) excluir o email com ID = 1
  • d 1 3 4 6 – (dentro do menu inicial) excluir os emails com ID’s = 1 3 4 6
  • d 1-15 – (dentro do menu inicial) excluir os emails com ID’s = 1-15
  • q – sair e arquivar o email lido na pasta /home/usuario/mbox
  • x – sair sem arquivar emails lidos

Se quiser saber mais sobre o mailutils, pode acessar a man page ou a url:

https://mailutils.org/manual/mailutils.html

Caso tenha lido emails e saído do programa utilizando a tecla “q”, os emails lidos serão arquivados na pasta pessoal do usuário. Então, o usuário com nome ubuntu, terá seus emails arquivados na pasta “/home/ubuntu/mbox”.

Caso queira acessar estes emails arquivados, basta acessar o arquivo:

sudo nano /home/ubuntu/mbox

Resumindo, os emails que chegam ficam disponíveis na pasta “/var/mail/usuario/”, e os emails que foram lidos e arquivados são movidos para a pasta “/home/usuario/mbox”. Levando em conta que a pasta padrão dos usuários fique dentro de /home.

Passo 6 – Configurações iniciais no Postfix

Agora é importante realizar algumas configurações iniciais no Postfix.

Vamos verificar qual o tamanho definido para cada caixa de email do usuário, de forma geral:

postconf | grep mailbox_size_limit

No comando acima, utilizamos o postconf para verificar no arquivo de configuração do postfix (/etc/postfix/main.cf) o valor da variável mailbox_size_limit. Lembrando que a saída será em bytes. Caso retorne o valor “0” (zero) quer dizer que a caixa de email não possui nenhum limite de tamanho, o que é perigoso, pois se receber um bombardeio de spam nesta fase inicial de configuração, pode encher todo o dispositivo de armazenamento (HD/SSD/SD, etc) e ter problema no boot do sistema operacional.

Vamos definir então um tamanho máximo de 250MB para cada caixa de email criada:

sudo postconf -e mailbox_size_limit=256000000

Lembrando que 1024 bytes = 1KB, logo, 256000000/1024 = 250MB

Agora vamos verificar qual o tamanho máximo que uma mensagem pode ter, contando com anexo. Costumo utilizar o limite adotado pelo gmail, que é de 25MB, sendo também 10% do tamanho total da caixa. Mas fique livre para escolher os valores que funcionam melhor para o seu setup. Utilizando o comando abaixo vamos verificar como está configurado:

postconf | grep message_size_limit

Geralmente o Postfix vem com o tamanho padrão de 10240000. Que é equivalente a 10.240.000 Bytes = 10240 Kbytes = 1024 * 10 Kbytes = 1 * 10 MB = 10MB.
Caso queira aumentar o limite para 25MB, utilize o comando:

sudo postconf -e message_size_limit=25600000

Outro ponto importante é verificar se o hostname do servidor está corretamente configurado no Postfix. Como comentamos em um passo anterior, ter o hostname corretamente configurado no servidor é uma etapa importante. Uma alternativa, é definir o hostname manualmente no postfix também. Vamos então editar manualmente o arquivo de configuração para verificar como o mesmo está configurado:

sudo nano /etc/postfix/main.cf

Na linha que começa com a variável “myhostname”, certifique-se de alterar para que apareça somente o subdomínio escolhido pro servidor de email, no meu caso ficaria como:

myhostname = mail.viniciuspaes.com

Servidor Email - configurar hostname no postfix

É importante também verificar se o seu servidor tem suporte tanto para IPv4, quanto para IPv6. O Postfix possui suporte para ambos os casos, mas caso só tenha suporte para IPv4, ou tenha o desejo de utilizar somente o IPv4 com o Postfix, é possível alterar com o comando:

sudo postconf -e "inet_protocols = ipv4"

Para que todas as mudanças realizadas no arquivo de configuração do postfix tenham efeito, basta reiniciar o serviço:

sudo service postfix restart

Passo 7 – Lembrete ao realizar upgrade no sistema com apt

Esta etapa é apenas para lembrar que caso faça o upgrade do Postfix pelo apt (sudo apt upgrade) e no momento do upgrade apareça a opção de reconfigurar o Postfix, recuse (no configuration). Caso realize novamente a configuração, será necessário realizar o passo anterior novamente, pois a modificações que acabamos de realizar podem ser reescritas pelo arquivo padrão de configuração do postfix.

Passo 8 – Como configurar Alias por linha de comando

Posteriormente neste tutorial vamos instalar o PostfixAdmin, configurar maildir, dovecot e virtual mail boxes (vmail). O processo de configurar o Alias que será mostrado neste passo não ficará funcional e sim o Alias criado pelo PostfixAdmin. Então se pretende seguir este tutorial até o fim, não se preocupe tanto com esta etapa. Esta etapa é mais didática, para mostrar como seria a configuração.

Como dito acima, nesta etapa inicial de configuração do servidor em modo de linha de comando, é possível também criar redirecionamento de caixas de email. Ou seja, se receber um email em webmaster@viniciuspaes.com, você pode redirecionar para a caixa de um outro usuário, como exemplo, para ubuntu@viniciuspaes.com. Este redirecionamento é conhecido como Alias, ou seja, um pseudônimo.
Uma característica de um Alias, é que a caixa “webmaster@viniciuspaes.com” não existe, os emails que forem enviados para ela serão direcionados para “ubuntu@viniciuspaes.com”. Em contrapartida, em um redirecionamento de caixas, as 2 caixas iriam existir, e o email enviado para a primeira seria replicado para a outra, mas estaria presente nas 2 caixas.
Então vamos lá, para criar um alias, edite o arquivo:

sudo nano /etc/aliases

A lógica dentro do arquivo de alias é a seguinte: “origem: destino”
Então como só temos 1 domínio configurado no servidor, podemos realizar o exemplo citado acima como:

webmaster: ubuntu

Que seria o mesmo que:

webmaster@viniciuspaes.com: ubuntu@viniciuspaes.com

Agora é uma boa hora para criar os Alias que desejar, algumas sugestões:

postmaster: ubuntu@viniciuspaes.com
hostmaster: ubuntu@viniciuspaes.com
webmaster: ubuntu@viniciuspaes.com
dmarc: ubuntu@viniciuspaes.com

Importante! Toda vez que editar o arquivo de alias (/etc/aliases) é necessário recriar o banco de dados de redirecionamentos do sistema. Utilize o comando:

sudo newaliases

Passo 9 – Configurando SPF

Como mostramos em um dos passos anteriores, os emails que estamos enviando pelo servidor estão sendo recusados. A maioria das grandes empresas de servidor de email costumam recusar as mensagens que não contenham o mínimo de segurança e autenticidade do remetente. Para suprir esta necessidade, neste passo vamos ensinar como configurar o SPF (Sender Policy Framework).
O SPF é configurado primeiramente pelo DNS, sendo um registro do tipo TXT. Uma tradução para seu acrônimo seria “Estrutura da Política do Remetente”.
O SPF pode ser utilizado para definir quais servidores são autorizados para enviar emails do domínio. Uma finalidade conhecida do SPF é a proteção dos seus emails contra técnicas em que um servidor malicioso tenta se passar pelo seu servidor (técnica conhecida como spoofing) enviando emails de SPAM e muitas vezes realizando Phishing.

Então faça login na empresa que utiliza para gerenciar as entradas DNS do seu servidor. Precisamos então criar uma nova entrada DNS.

A configuração da entrada DNS  deve ser:

Nome do host: @ (dependendo da sua empresa de registro, deixe em branco ou insira seu nome de domínio)
Tipo: TXT
TTL: 3600
Dados: v=spf1 mx ~all

Da configuração acima, estamos definindo o SPF como:

  • v=spf1: indica a versão, no caso, versão spf1
  • mx: indica que apenas os servidores destacados na entrada mx estão autorizados a enviar email deste domínio
  • ~all: emails oriundos deste domínio só devem ter como origem os servidores definidos pelo SPF

Servidor Email - criando registro DNS do tipo TXT para SPF

A propagação do DNS pode demorar alguns minutos ou até muitas horas. Mas no meu caso, quando faço alterações no Google Domains, as mudanças são quase que instantâneas. Em todo caso, utilize o comando abaixo para verificar se a entrada TXT criada já está funcional (já foi propagada):

dig viniciuspaes.com txt

Terá uma resposta parecida com os dados abaixo:

;; ANSWER SECTION:
viniciuspaes.com.       3563    IN      TXT     "v=spf1 mx ~all"

Servidor Email - verificando registro SPF

Agora precisamos instalar e configurar o agente de políticas SPF que irá trabalhar juntamente com o Postfix. Instale com o comando:

sudo apt install postfix-policyd-spf-python

Agora precisamos configurar o agente de políticas SPF. Primeiramente, vamos configurar para que o mesmo seja iniciado junto com o postfix. Então, vamos editar o arquivo:

sudo nano /etc/postfix/master.cf

Agora vá até o fim do arquivo e insira o texto abaixo:

policyd-spf  unix  -       n       n       -       0       spawn 
  user=policyd-spf argv=/usr/bin/policyd-spf

No texto acima, fique atento que a segunda linha tem 2 caracteres de espaço. Ela fica assim para frente da primeira linha. Isso indica que a linha abaixo é uma continuação do comando.

Servidor Email - editar arquivo master.cf para inserir as políticas SPF

Agora vamos editar outro arquivo de configuração:

sudo nano /etc/postfix/main.cf

Nesta etapa, vamos definir o timeout para o agente SPF, caso aconteça algum problema de execução. Vamos também definir uma regra para rejeitar emails que não atendam as regras do SPF:

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

Na inserção acima, atenção novamente no espaçamento e indentação, como explicado anteriormente.

Servidor Emails - Habilitar restrição de remetentes que não possuem autenticação SPF no postfix

Agora precisamos reiniciar o Postfix, para que as configurações do SPF tenham efeito:

sudo service postfix restart

Passo 10 – Configurando DKIM com OPENDKIM

Continuando com o processo para garantir confiabilidade ao nosso novo servidor de email e das mensagens enviadas por ele, precisamos também configurar o DKIM. O DKIM vem do termo em inglês “DomainKeys Identified Mail”. Basicamente é um protocolo que permite assinar os emails digitalmente em um processo que o destinatário consiga confirmar a veracidade sobre o remetente da mensagem por autenticação criptografada.

Para dar suporte ao DKIM no servidor, vamos instalar o pacote opendkim e o opendkim-tools:

sudo apt install opendkim opendkim-tools

Ao instalar o opendkim, automaticamente um usuário e grupo com o nome opendkim será criado. Como o opendkim e o postfix irão precisar acessar alguns arquivos em comum, é interessante já adicionar o usuário postfix ao grupo do opendkim para facilitar o gerenciamento de acesso de arquivos e suas permissões:

sudo gpasswd -a postfix opendkim

Precisamos realizar agora algumas configurações no opendkim, para isso vamos editar o arquivo de configuração:

sudo nano /etc/opendkim.conf

Encontre a linha “#LogWhy no”, precisamos habilitar a mesma. O caracter “#” no começo da linha transforma a linha em um comentário. Precisamos descomentar a linha e habilitar o LogWhy, altere então a linha para:

LogWhy	yes

Precisamos agora garantir que a linha que começa com “Mode” e a linha que começa com “SubDomains” estejam descomentadas. Então estas linhas devem ficar como:

Mode			sv
SubDomains		no

Agora encontre a linha “OversignHeader From”, precisamos inserir as informações abaixo desta linha:

AutoRestart			yes
AutoRestartRate		        10/1M
Background			yes
DNSTimeout			5
SignatureAlgorithm		rsa-sha256

Servidor Email - configurações opendkim

Caminhe agora para o fim do arquivo e insira estas linhas:

KeyTable		refile:/etc/opendkim/key.table
SigningTable		refile:/etc/opendkim/signing.table
ExternalIgnoreList	/etc/opendkim/trusted.hosts
InternalHosts		/etc/opendkim/trusted.hosts

Servidor Email - configurações opendkim

Precisamos definir uma estrutura de arquivos e diretórios para armazenar as chaves para o opendkim e definir as permissões de acesso. Execute as linhas abaixo 1 de cada vez no terminal, não copie tudo e cole no terminal, senão somente a primeira linha será executada:

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

Vamos criar e editar agora o arquivo de tabela de assinaturas:

sudo nano /etc/opendkim/signing.table

Insira o conteúdo abaixo dentro do arquivo, lembre-se de trocar o domínio viniciuspaes.com pelo seu domínio configurado:
*@viniciuspaes.com default._domainkey.viniciuspaes.com
*@*.viniciuspaes.com default._domainkey.viniciuspaes.com

Servidor Email - Tabela de assinaturas dkim

Seguimos agora criando e editando o arquivo de chaves de assinaturas:

sudo nano /etc/opendkim/key.table

Insira o texto no arquivo:

default._domainkey.viniciuspaes.com     viniciuspaes.com:default:/etc/opendkim/keys/viniciuspaes.com/default.private

Servidor Email - tabela de chaves DKIM

Agora crie e edite o arquivo para servidores confiáveis, para que internamente os emails oriundos destes endereços não precisem passar pela verificação do OpenDKIM:
sudo nano /etc/opendkim/trusted.hosts

Insira o texto dentro do arquivo (lembre de trocar viniciuspaes.com pelo seu domínio escolhido):

127.0.0.1
localhost

.viniciuspaes.com

Servidor Email - hosts confiaveis

Caminhamos agora para a etapa final de configuração do OpenDKIM. Vamos criar a pasta onde o par de chave público/privada será armazenado:

sudo mkdir /etc/opendkim/keys/viniciuspaes.com

Vamos gerar o par de chaves do domínio viniciuspaes.com dentro do diretório acima criado, com o comando:

sudo opendkim-genkey -b 2048 -d viniciuspaes.com -D /etc/opendkim/keys/viniciuspaes.com -s default -v

Precisamos agora corrigir as permissões de arquivos (lembre de executar uma linha de cada vez, não cope e cole as 2 linhas no terminal, senão somente o comando da primeira linha será executado):

sudo chown opendkim:opendkim /etc/opendkim/keys/viniciuspaes.com/default.private
sudo chmod 600 /etc/opendkim/keys/viniciuspaes.com/default.private

Vamos reiniciar o OpenDKIM para ter certeza que as mudanças realizadas surtiram efeito:

sudo service opendkim restart

Agora podemos verificar a chave pública DKIM criada com o comando:

sudo cat /etc/opendkim/keys/viniciuspaes.com/default.txt

O comando acima irá gerar uma saída parecida com:

default._domainkey      IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEXW0SRvQxj+8SuWEAzsJ/qbYmaH6lFAAOCAQ8HLCJ+C1QT7PAM"
            "XbFC2PrMmh+XJUKdOvj4z0jBr2ITMDNqpDOuOKWqME5MWslr6xEk6l/A8vydHvyeikS8" )  
; ----- DKIM key default for viniciuspaes.com

Servidor Email - chave dkim pública

Repare que na saída acima temos 4 campos de variáveis:

  • v=DKIM1;
  • h=sha256;
  • k=rsa;
  • p=(uma chave grande dividida em 2 partes)

No caso da variável p=, ela está dividida em 2 partes, estas 2 partes são divididas com aspas duplas. Dependendo da empresa que gerencia seu DNS, ela aceitará a variável p= separada em 2 partes. Mas o ideal é juntar esta variável removendo as aspas duplas e espaçamento que pode haver entre elas.

Então no exemplo acima, precisamos dos dados desta forma:

  • v=DKIM1;
  • h=sha256;
  • k=rsa;
  • p=MIIBIjANBgkqhkiG9w0BAQEXW0SRvQxj+8SuWEAzsJ/qbYmaH6lFAAOCAQ8HLCJ+C1QT7PAM
    IIBCgKCAQsksk3a9Y1ymBZvgXY5bnTyy1w5wK5BG/7UtDUKKSD2ggtIgPNDLaGJGEvxjJiHieRRp
    NeJ2zyOuTJmw1MKcRiJ3pEfT0oBHZl5HZLE1iljXFX58R0/qLp3IdQGvT4/pwKI/ZeBKwBe
    pa80mQ8Es+xGn2Bh7PB7e4j1VDIfrpcXbFC2PrMmh+XJUKdOvj4z0jBr2ITMDNqpDOu
    OKWqME5MWslr6xEk6l/A8vydHvyeikS8s8yntmN473Twca0rGvbdrcfOoZG9VkH7YPC
    iv4ucdf6+btY2moibxqzpeEHswnt+43SQIDAQAB

Estamos prontos então para criar uma entrada DNS do tipo TXT para configurar assinatura DKIM. Lembrando que os dados acima devem ser inseridos neste formado:

v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEXW0SRvQxj+8SuWEAzsJ/qbYmaH6lFAAOCAQ8HLCJ+C1QT7PAM
IIBCgKCAQsksk3a9Y1ymBZvgXY5bnTyy1w5wK5BG/7UtDUKKSD2ggtIgPNDLaGJGEvxjJiHieRRpNeJ2zyOuTJmw1MKcRiJ3pEfT0oBH
Zl5HZLE1iljXFX58R0/qLp3IdQGvT4/pwKI/ZeBKwBepa80mQ8Es+xGn2Bh7PB7e4j1VDIfrpcXbFC2PrMmh+XJUKdOvj4z0jBr2IT
MDNqpDOuOKWqME5MWslr6xEk6l/A8vydHvyeikS8s8yntmN473Twca0rGvbdrcfOoZG9VkH7YPCiv4ucdf6+btY2moibxqzpeEHswnt+43SQIDAQAB

Então, na empresa que gerencia seu DNS, insira os dados da nova entrada (lembre de trocar a chave p= do exemplo abaixo por sua chave gerada):

Nome do host: default._domainkey
Tipo: TXT
TTL: 3600
Dados: v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEXW0SRvQxj+8SuWEAzsJ/qbYmaH6lFAAOCAQ8HLCJ+C1QT7PAMIIBCgKCAQsksk3a9Y1ymBZvgXY5bnTyy1w5wK5BG/7UtDUKKSD2ggtIgPNDLaGJGEvxjJiHieRRpNeJ2zyOuTJmw1MKcRiJ3pEfT0oBHZl5HZLE1iljXFX58R0/qLp3IdQGvT4/pwKI/ZeBKwBepa80mQ8Es+xGn2Bh7PB7e4j1VDIfrpcXbFC2PrMmh+XJUKdOvj4z0jBr2ITMDNqpDOuOKWqME5MWslr6xEk6l/A8vydHvyeikS8s8yntmN473Twca0rGvbdrcfOoZG9VkH7YPCiv4ucdf6+btY2moibxqzpeEHswnt+43SQIDAQAB

Servidor Email - configuração DKIM no DNS

Após a alteração no DNS podemos testar se a chave DKIM está funcionando corretamente. De volta no servidor, execute o comando:

sudo opendkim-testkey -d viniciuspaes.com -s default -vvv

Ao executar o comando acima, receberá uma saída semelhante com:

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.viniciuspaes.com'
opendkim-testkey: key secure
opendkim-testkey: key OK

Servidor Email - Configuração DKIM testkey

Quando faço o teste acima com meus domínios contratados pelo Google Domains sempre recebo notificação de chave segura (key secure). Já meus domínios do Registro.br sempre aparecem como chave insegura (key not secure). Se receberem esse aviso, não se preocupem, pelo que pesquisei é devido ao DNSSEC e nem todas as empresas de registro de domínios possuem ele implementado ainda.

Lembrando que toda vez que alterar os registros DNS de seu domínio, é necessário esperar alguns minutos até que as mudanças sejam propagadas. Então é bom aguardar um pouco, caso esteja recebendo algum erro nesta etapa.

Uma observação pertinente, verifiquei alguns usuários relatando erro sobre “query timed out”. Particularmente quando configurei no Ubuntu 22.04 não percebi problema algum com a autenticação DKIM. Mas caso aconteça com você, basta editar o arquivo “sudo nano /etc/opendkim.conf” e descomentar a linha que começa com “#TrustAnchorFile” e reiniciar o opendkim (sudo service opendkim restart).

Agora é necessário realizar a integração do OpenDKIM com o Postfix. Primeiro vamos criar um diretório para armazenar os arquivos .socket:

sudo mkdir /var/spool/postfix/opendkim

Definir a permissão correta para o diretório criado:

sudo chown opendkim:postfix /var/spool/postfix/opendkim

Agora vamos editar o arquivo de configuração:

sudo nano /etc/opendkim.conf

Agora é necessário encontrar a linha “Socket local:/run/opendkim/opendkim.sock”, vai ser necessário alterar esta linha para o caminho do novo diretório criado:

Socket    local:/var/spool/postfix/opendkim/opendkim.sock

Servidor Email - atualizar caminho socket opendkim

Necessário também editar outro arquivo de configuração:

sudo nano /etc/default/opendkim

Encontre a linha “SOCKET=local:$RUNDIR/opendkim.sock”, será necessário alterar ela para o novo caminho também:

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

Servidor Email - configuração caminho opendkim

Por fim, precisamos editar o último arquivo para ter o OpenDKIM integrado:

sudo nano /etc/postfix/main.cf

Adicionar este texto no fim do arquivo para habilitar o mail filter (milter protocol):

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

Servidor Email - configuração milter opendkim

Integração OpenDKIM e Postfix finalizada, agora precisamos reiniciar os serviços (execute uma linha de cada vez):

sudo service opendkim restart
sudo service postfix restart

Pronto, se tudo correu corretamente, seu servidor de email já tem autenticação DKIM configurada.

Passo 11

Continuando com o processo de garantir confiabilidade e autenticação para o servidor de email que estamos criando, precisamos também habilitar o DMARC (Domain-based Message Authentication, Reporting, and Conformance).

O primeiro passo para seguir com a configuração do DMARC é ter certeza que o SPF e DKIM já estão funcionando corretamente. Nesta etapa do tutorial, já é possível enviar um email para uma caixa do GMAIL sem que ele seja recusado. Então vamos realizar o teste:

echo "teste dkim e spf" | sendmail pessoa@gmail.com

Lembre-se de substituir no comando acima, adicionando uma caixa de email do gmail que tenha acesso.

Agora vá no seu gmail e procure pelo email que acabou de enviar. Seja humilde, procure na pasta de SPAM também. Ao encontrar o email, clique para verificar seu conteúdo.

Servidor Email - Email recebido no gmail

Com o email aberto, no canto superior direito da mensagem, há 3 pontos na vertical, sendo um menu sobre a mensagem. Clique para abrir as opções deste menu e selecione:

Mostrar original

Servidor Email - Como mostrar original da mensagem no gmail

A mensagem em formato texto plano será exibida e é possível verificar no alto, algumas considerações que o gmail faz:

SPF:	PASS com o IP 100.100.100.100
DKIM:	'PASS' com o domínio viniciuspaes.com

Servidor Email - mostrar mensagem original no gmail

Desta forma conseguimos também confirmar que configuramos corretamente o SPF e o DKIM, pois o gmail está reconhecendo a autenticação. Só para confirmar se está tudo correto, podemos também confirmar se há um alinhamento dos identificadores, ou seja, configuramos corretamente o hostname e o domínio (FQDN). Então no texto plano da mensagem de email, procure as linhas que contenham as informações abaixo:

  • Return-Path: <email@viniciuspaes.com>
  • DKIM-Signature: (…) d=viniciuspaes.com
  • From: <email@viniciuspaes.com>

No exemplo acima, podemos ver que os 3 campos contém o mesmo domínio, então é dito que os identificadores estão alinhados. Sendo um sinal verde, para podermos configurar o DMARC.

Caso não tenha uma caixa de email no gmail, uma excelente opção é acessar o site:

https://www.learndmarc.com/

Ao acessar o site, ele irá informar para enviar um email para um destinatário (este destinatário muda a cada acesso, anote o seu!):

Send an email to this address to get started:
ld-123456@learndmarc.com

Basta executar o comando de envio de email por linha de comando e o website após receber o email, irá fazer os testes baseado na mensagem recebida. Então envie um email para eles:

echo “teste” | sendmail ld-123456@learndmarc.com

No comando acima, troque o remetente pelo remetente que o website irá te informar.

Lembrando que neste teste, só precisamos do SPF e DKIM funcionais, caso positivo, podemos continuar.

Vamos então criar a entrada DNS do tipo TXT para configurar o DMARC:

Nome do host: _dmarc
Tipo: TXT
TTL: 300
Dados: v=DMARC1; p=none; pct=100; fo=1; rua=mailto:dmarc@viniciuspaes.com; ruf=mailto:dmarc@viniciuspaes.com;

Servidor Email - Configurar entrada TXT no DNS para o DMARC

Um breve resumo sobre o que estamos fazendo na configuração acima:

  • v=DMARC1, estamos utilizando a versão do protocolo DMARC1
  • p=none, a política do nosso servidor é nenhuma.
  • pct=100, a porcentagem dos emails deste domínio que o DMARC deve ser aplicado
  • fo=1, gerar relatórios caso qualquer mecanismo de segurança apresente falha (SPF, DKIM e DMARC).
  • rua=email@domínio.com, para qual endereço de email os relatórios agregados do DMARC devem ser enviados
  • ruf=email@domínio.com, para qual endereço de email os relatórios forense de emails que falharam DMARC devem ser enviados

É interessante alterar a política (p=none) futuramente. Mas inicialmente é prudente analisar todos os emails que chegam, para verificar se existem emails legítimos que não utilizam o DMARC. A medida que for dando manutenção no servidor e verificando os logs dos remetentes, percebendo que todos estão cumprindo com a política DMARC, é possível então atualizar para:

  • quarantine, os emails que não atendem ao DMARC ficam retidos para o administrador verificar sua legitimidade
  • reject, rejeitar todos os emails que não atendem os critérios do DMARC

Próximo passo é verificar o registro TXT para o DMARC criado no seu DNS:

dig txt +short _dmarc.viniciuspaes.com

A saída do comando acima será exatamente a entrada que criou, no caso do nosso exemplo, vamos ter:

"v=DMARC1; p=none; pct=100; fo=1; rua=mailto:dmarc@viniciuspaes.com; ruf=mailto:dmarc@viniciuspaes.com;"

Vamos agora repetir o teste que realizamos no início deste email. Mas enviar um email do servidor até uma caixa do gmail e verificar se agora o gmail reconhece o DMARC configurado:

echo "email de teste DMARC" | sendmail pessoa@gmail.com

Vá novamente na sua caixa do gmail e procure pelo email que acabou de enviar. Tem chance de ainda aparecer na caixa de SPAM, é normal para um servidor de email novo, sem reputação reconhecida.
Com o email aberto, vá nas opções e selecione:

Mostrar original

Agora será possível verificar uma saída semelhante com:

SPF:	PASS com o IP 100.100.100.100
DKIM:	'PASS' com o domínio viniciuspaes.com
DMARC:	'PASS'

Servidor Email - Mensagem original - spf, dkim e dmarc PASS

Se todas as etapas forem executadas com êxito o DMARC deverá estar configurado e funcional no servidor!

Passo 12

Esta etapa é exclusiva para preparar o servidor para os próximos passos.
Primeiro, vamos aproveitar e habilitar as portas de acesso web (80 e 443), caso estejam bloqueadas:.

sudo ufw allow 80,443/tcp

Precisamos habilitar certificado SSL para o subdomínio “mail.viniciuspaes.com”. Mas antes precisamos instalar um software de servidor http (apache, nginx, etc), depois criar o arquivo de configuração para o subdomínio com acesso http e https. Instalar o certbot e solicitar o certificado.

Você pode optar por qual servidor http deseja utilizar. Nginx é uma ótima opção, com um excelente desempenho. No geral, as próximas etapas do tutorial não são muito influenciadas por qual servidor de páginas escolher. O que muda é a modificação do arquivo de configuração e pacotes de integração com o banco de dados. Mas para efeito deste tutorial, vamos utilizar o apache:

sudo apt install apache2

Agora vamos criar o primeiro arquivo de configuração:

sudo nano /etc/apache2/sites-available/mail.viniciuspaes.com.http.conf

Agora vamos criar o arquivo de configuração para acesso com SSL (TLS):

sudo nano /etc/apache2/sites-available/mail.viniciuspaes.com.ssl.conf

Agora precisamos ativar os 2 arquivos de configuração (executar uma linha por vez):

a2ensite mail.viniciuspaes.com.http.conf
a2ensite mail.viniciuspaes.com.ssl.conf

Reiniciando o apache para que as modificações tenham efeito:

sudo service apache2 restart

Vamos atualizar o gerenciador de pacotes snap para a última versão:

sudo snap install core; sudo snap refresh core

Agora precisamos instalar o certbot, que irá gerenciar a instalação e configuração dos certificados SSL do Let’s Encrypt no servidor:

sudo snap install --classic certbot

Precisamos criar um link lógico da pasta do certbot para correto funcionamento:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

como estamos utilizando o apache neste tutorial, vamos executar o Certbot com o comando:

sudo certbot --apache

Nesta primeira execução do certbot, será necessário “criar uma conta”, informando seu email e suas preferências para compartilhar seu endereço de email com terceiros.
Após este processo, aparecerá a opção para escolher para qual domínio deseja solicitar o certificado SSL.
Neste exemplo, utilizamos o domínio viniciuspaes.com, então o subdomínio escolhido/configurado para o servidor de emails:

mail.viniciuspaes.com

Esta primeira etapa de configuração do certificado SSL para o servidor de emails está pronta.
Uma curiosidade é que, caso siga este tutorial até o fim, vamos configurar o Roundcube para funcionar nesta URL do subdomínio, então os arquivos de configuração acima terão uma pequena mudança.

Passo 13

Um recurso interessante para o servidor de email é permitir que clientes de email se conectem e acessem as mensagens dos usuários. Os clientes de email são softwares/aplicativos presentes nos computadores, celulares e tablets que permitem essa integração com o servidor de email. Ou seja, ao invés de ter que utilizar um navegador de internet, se conectar ao seu servidor, o seu servidor ter um cliente de email web configurado (gmail é um exemplo de cliente web de email), você pode ter um aplicativo que faça todo esse processo de acessar sua conta de email de forma mais prática.

Para ter este suporte, utilizamos o software chamado Dovecot, para dar suporte IMAP e POP3 para clientes de email.

Pensando em todo este processo, o primeiro passo é verificar se o Firewall do Ubuntu conhecido como UFW está bloqueando as portas necessárias para este funcionamento.
Então, para abrir as portas de acesso para IMAP:

sudo ufw allow 587,465,143,993/tcp

Se desejar dar suporte para POP3, precisamos também abrir as portas:

sudo ufw allow 110,995/tcp

Para permitir a conexão de cliente de email no nosso servidor de email, precisamos habilitar o suporte para “Submission Service”. Então vamos editar o arquivo:

sudo nano /etc/postfix/master.cf

Adicione as linhas abaixo no arquivo (lembrete para manter os 2 caracteres de espaço da segunda linha em diante, manter este padrão de identação):

submission     inet     n    -    y    -    -    smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=no
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

#Microsoft Outlook Support
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

Servidor Emails - configuração submission service postfix 1
Servidor Emails - configuração submission service postfix 2

Agora, vamos continuar a configuração editando o arquivo:

sudo nano /etc/postfix/main.cf

Dentro do modo de edição é necessário encontrar as linhas abaixo e inserir o caractere “#” no início delas. Com isso vamos “comentar” a linha e desabilitar sua funcionalidade, precisamos então que fiquem desta forma:

#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_tls_security_level=may
#smtp_tls_security_level=may
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Servidor Emails - configuração submission service postfix 3

Ainda com o editor aberto, é necessário inserir as seguintes linhas no fim do arquivo:

#Enable TLS Encryption when Postfix receives incoming emails
smtpd_tls_cert_file=/etc/letsencrypt/live/viniciuspaes.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/viniciuspaes.com/privkey.pem
smtpd_tls_security_level=may 
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

#Enable TLS Encryption when Postfix sends outgoing emails
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

#Enforce TLSv1.3 or TLSv1.2
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

Servidor Emails - configuração submission service postfix 4

Para que as alterações que fizemos nos arquivos de configuração acima tenham efeito, precisamos reiniciar o postfix:

sudo service postfix restart

Um passo importante agora é verificar quais portas o postfix está escutando. Especificamente a porta 465 e 587 (a 25 também). Vamos utilizar o seguinte comando:

sudo ss -lnpt | grep master

A saída do comando acima irá mostrar algo parecido com:

LISTEN 0	100	0.0.0.0:587	0.0.0.0:*	users:(("master",pid=13,fd=57))                                                                                                                  
LISTEN 0	100	0.0.0.0:465	0.0.0.0:*	users:(("master",pid=13,fd=60))                                                                                                                  
LISTEN 0	100	0.0.0.0:25	0.0.0.0:*	users:(("master",pid=13,fd=53))

Ou seja, na saída acima temos as portas 587 (0.0.0.0:587), 465 (0.0.0.0:465) e 25 (0.0.0.0:25) sendo utilizadas pelo postfix. Como deveriam realmente estar, então podemos prosseguir.

Servidor Emails - Portas abertas no servidor em modo escuta

Agora vamos seguir instalando o Dovecot com suporte IMAP:

sudo apt install dovecot-core dovecot-imapd

Caso queira também suporte POP3, instale:

sudo apt install dovecot-pop3d

Importante verificar a versão do dovecot atualmente instalada, para ver se está em uma versão muito mais atual do que a que vamos cobrir neste tutorial:

dovecot --version

Neste servidor de exemplo, estou utilizando o Dovecot na versão:

2.3.16 (7e2e900c1a)

Agora edite o arquivo de configuração do Dovecot:

sudo nano /etc/dovecot/dovecot.conf

Dentro do editor, procure pela linha “# Enable installed protocols”, precisamos inserir este texto logo abaixo dela (caso não use pop3 no seu servidor, não é necessário inserir o protocolo):

protocols = imap pop3

Servidor Email - habilitar protocolos dovecot

Uma etapa importante é verificar o padrão do caminho onde os emails ficam salvos.
Vamos confirmar este padrão utilizando o comando:

postconf mail_spool_directory

Como acabamos de instalar o servidor e não realizamos modificação nesta etapa, a saída do comando acima será ainda:

/var/mail

É interessante adotarmos o padrão Maildir ao invés do padrão mbox, é uma forma mais robusta de organizar os usuários, suas caixas de email e as mensagens. É mais robusta, pois estamos atualmente utilizando a estrutura de sistema de arquivos para as mensagens, ao invés de estrutura de banco de dados.
Vamos editar então o seguinte arquivo:

sudo nano /etc/dovecot/conf.d/10-mail.conf

Encontre a linha “mail_location = mbox:~/mail:INBOX=/var/mail/%u”, ela precisa ser substituída por:

mail_location = maildir:~/Maildir

E abaixo da linha acima, adicione:

mail_privileged_group = mail

Servidor Emails - mudar caixa de email de mbox para maildir

Neste ponto agora, vamos instalar o suporte ao protocolo lmtp. Ele é interessante para que o postfix e o dovecot conversem entre si.

sudo apt install dovecot-lmtpd

Precisamos agora adicionar o protoclo lmtpd na lista de protocolos que o Dovecot tem suporte. Vamos editar o arquivo:

sudo nano /etc/dovecot/dovecot.conf

Agora vá novamente na linha “protocols = imap pop3” e adicione o protocolo lmtpd, a linha deve ficar como:

protocols = imap pop3 lmtp

Servidor Email - habilitar protocolo lmtp

Continuando com o processo, precisamos agora editar o arquivo:

sudo nano /etc/dovecot/conf.d/10-master.conf

Dentro do modo de edição, procure pela linha “service lmtp { … }“, esta linha define o funcionamento do serviço lmtp. É preciso que edite as linhas que compõem o serviço lmtpd para ficarem desta forma:

service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
  }
}

Servidor Emails - configurar serviço lmtp

Agora vá até o arquivo de configuração do postfix e abra para edição:

sudo nano /etc/postfix/main.cf

Adicione as seguintes linhas no fim do arquivo:

mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no

Servidor Emails - mailbox transport dovecot lmtp

De volta agora editando o arquivo de configuração do dovecot:

sudo nano /etc/dovecot/conf.d/10-auth.conf

Encontre a linha “#disable_plaintext_auth = yes”, é preciso descomentá-la. Então a mesma deve ficar como:

disable_plaintext_auth = yes

Servidor Email - desabilitar autenticação de texto plano

Encontre a linha “#auth_username_format = %Lu” é preciso que esta linha seja descomentada e alterada para:

auth_username_format = %n

 

Servidor Email - Formato de Autenticação de Usuário

Encontre a linha “auth_mechanisms = plain” e altere para:

auth_mechanisms = plain login

Servidor email - Mecanismos de autenticação pleno e email

Agora vamos configurar o processo de conexão e encriptação. Edite o arquivo:

sudo nano /etc/dovecot/conf.d/10-ssl.conf

Encontre a linha “ssl = yes” e altere para:

ssl = required

Encontre as linhas:

ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key

Altere as linhas acima para:

ssl_cert = </etc/letsencrypt/live/mail.viniciuspaes.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.viniciuspaes.com/privkey.pem

Servidor Email - Dovecot, configurações SSL

Encontre a linha “#ssl_prefer_server_ciphers = no”, é necessário descomentá-la e alterar para:

ssl_prefer_server_ciphers = yes
ssl_min_protocol = TLSv1.2

Servidor Email - Dovecot, configurações SSL 2

Agora edite o arquivo:

sudo nano /etc/ssl/openssl.cnf

Procure pela linha “providers = provider_sect”, é necessário comentá-la. Então esta linha ficará como:

#providers = provider_sect

Servidor Email - OpenSSL, comentar providers_sect

Edite o arquivo:

sudo nano /etc/dovecot/conf.d/10-master.conf

Dentro do modo de edição, procure pela linha “service auth { … }“ este serviço engloba uma grande quantidade de linhas. É necessário inserir dentro dele o seguinte texto:

unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

Servidor Email - Postfix Unix Listener

Agora vamos editar o arquivo de configuração para criar automaticamente as pastas de emails enviados e a pasta de emails na lixeira. Para isso, vamos editar o arquivo de configuração:

sudo nano /etc/dovecot/conf.d/15-mailboxes.conf

Agora procure pelas caixas de “Trash” e “Sent”, insira a linha “auto create” para que tenham suporte a criá-las automaticamente no momento que uma caixa de email é criada. Estas linhas devem ficar como:

mailbox Trash {
  auto = create
  special_use = \Trash
}

mailbox Sent {
  auto = create
  special_use = \Sent
}

Servidor Email - Habilitar opção de autocriar caixa de emails enviados e lixo

Após todas estas modificações acima, vamo reiniciar em conjunto o postfix e o dovecot:

sudo systemctl restart postfix dovecot

Agora vamos criar uma pasta para salvar o arquivo de configuração do daemon do dovecot:

sudo mkdir -p /etc/systemd/system/dovecot.service.d/

Vamos criar e editar o arquivo no diretório criado acima:

sudo nano /etc/systemd/system/dovecot.service.d/restart.conf

Inserir o texto abaixo dentro do arquivo:

[Service]
Restart=always
RestartSec=5s

Servidor Email - Configurar autorestart Dovecot

Agora reinicie o daemon do dovecot o comando abaixo:

sudo systemctl daemon-reload

Verifique se o serviço do Dovecot está funcionando:

sudo service dovecot status

Caso encontre algum erro nesta etapa, é provável que tenha inserido ou editado algum arquivo incorretamente. Na maioria das vezes é este o problema. Uma palavra fora de lugar, uma indentação errada, um caractere incorreto inserido.

Vamos agora testar o serviço de reiniciar o dovecot automaticamente. Vamos matar o processo e verificar se o daemon vai reiniciá-lo, da forma que configuramos acima:

sudo pkill dovecot

Verificar novamente o status do serviço:

sudo service dovecot status

Servidor Email - sudo service dovecot status

Se o Dovecot estiver ativo (running) o processo foi executado corretamente e o Dovecot está instalado e funcional! Você também já pode utilizar um cliente de email para se conectar ao servidor. Mas continue seguindo este tutorial, pois a mudança de estrutura de arquivos para banco de dados é indicada e vamos abordar no próximo passo!

Passo 14

Este passo é um divisor de águas. Agora será feita a mudança da estrutura de arquivos para armazenar e-mail, para a estrutura de banco de dados. Após a finalização desta etapa as caixas de email só poderão ser criadas pelo PostfixAdmin, assim como os Alias das caixas de email e domínios. Então é interessante deixar bem claro para você leitor. Caso o setup até o passo anterior esteja satisfatório para as suas necessidades, avalie bem continuar. Porém, recomendo fortemente os próximos passos, para ter um servidor de email completo.

Como mencionei, vamos precisar de um banco de dados instalado. Para este tutorial, optei por utilizar o MariaDB (continuação melhorada da branch do MySQL). Se ainda não instalou o banco de dados, instale agora com o comando:

sudo apt install mariadb-server mariadb-client

Pode não parecer usual, mas é importante verificar se o servidor de banco de dados que acabamos de instalar está funcionando. Execute então o comando abaixo para verificar o funcionamento:

sudo service mariadb status

Para garantir que o servidor será iniciado juntamente com o boot do servidor, pode utilizar o comando abaixo:

sudo systemctl enable mariadb

Por padrão, quando instalamos o MariaDB (ou MySQL) ele vem com uma configuração padrão que não é nada segura. Como é muito utilizado localmente de forma didática para aprendizado sobre Banco de Dados em diversos locais, este setup de fábrica pode fazer sentido para facilitar a vida de quem está começando. Mas para um ambiente de produção igual o servidor de emails que estamos configurando, é necessário utilizar o comando abaixo, para dar os primeiros passos de segurança ao servidor de banco de dados em um ambiente de produção:

sudo mysql_secure_installation

Quando utilizando o comando acima, diversas perguntas vão aparecer. Basicamente você precisa criar uma senha para o usuário root, desabilitar usuário e banco de dados de teste e recarregar a tabela de privilégios para que as mudanças tenham efeito. Dependendo da versão da sua instalação, também será perguntado se deseja ativar o módulo de segurança de senha. Este módulo é do capiroto, não recomendo que seja ativado, a não ser que você realmente saiba o que está fazendo.

Vou deixar aqui um aviso. Nesta etapa foi criada a senha de login root no banco de dados. É necessário que você tenha um controle pessoal das senhas. Anote em um papel, na agenda, ou qualquer outra forma.

Servidor Email - MariaDB secure installation

Servidor Email - MariaDB secure installation

Servidor Email - MariaDB secure installation

Servidor Email - MariaDB secure installation

Agora precisamos instalar o PostfixAdmin, temos 2 opções. Instalar pelo repositório do apt ou baixar a última versão no github do mantenedor.
A primeira vez que instalei meu servidor de emails, tive muito problema com o PostfixAdmin, tanto que achei que não seria uma boa opção. O principal problema que tive era as senhas de admin não funcionarem. Refazia a instalação do zero e ele funcionava bem por alguns dias, mas volta ou outra parava de funcionar. Investigando mais a fundo, percebi que havia problema no certificado SSL e no log verificava erro de contexto do certificado. Também tinha problema do postfixadmin não abrir e recebia uma página em branco. Depois de sofrer bastante com ele, e pesquisando em fórum e outros tutoriais online, deram a dica que era melhor instalar manualmente o postfixadmin. A vantagem é você ter o controle de quando atualizar e poder realizar o backup dos arquivos de configuração para verificar o que mudou, caso recebesse algum erro. Em resumo, pelo apt é um pouco de loteria, melhor ter um pouco mais de trabalho e instalar manualmente para evitar dor de cabeça quando for atualizar o servidor.

Primeiro passo é ir no github do mantenedor e verificar a última versão disponível:

https://github.com/postfixadmin/postfixadmin/releases

Servidor Email - Postfixadmin - download última versão no github

Na data de criação deste tutorial, a última versão era a 3.3.13. Caso venha do futuro ler este tutorial, recomendo sempre pegar a última versão disponível.
Caminhe até a pasta de home do seu usuário:

cd ~

Agora vamos executar o comando wget para fazer o download do postfix admin (mude a versão do arquivo caso necessário):

wget https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.3.13.tar.gz

Servidor Email - download última versão postfixadmin com wget

O download do arquivo veio no formato compactado “.tar.gz”. Com o comando abaixo, vamos descompactar já na pasta de destino “/var/www”.

sudo tar xvf postfixadmin-3.3.13.tar.gz -C /var/www/

Agora vamos mudar o nome da pasta do postfixadmin:

sudo mv /var/www/postfixadmin-postfixadmin-3.3.13/ /var/www/postfixadmin

Precisamos criar uma pasta para os templates:

sudo mkdir -p /var/www/postfixadmin/templates_c

Para gerenciar as permissões de arquivos e diretórios por aqui em diante, vamos optar em utilizar o pacote ACL. Então vamos aproveitar para instalar o mesmo:

sudo apt install acl

Agora vamos definir as permissões da pasta template:

sudo setfacl -R -m u:www-data:rwx /var/www/postfixadmin/templates_c/

Definir permissões da pasta onde os certificados são armazenados:

sudo setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/

Agora precisamos entrar no console do MySQL para criar o banco de dados e o usuário para o postfixadmin:

sudo mysql -u root
ou
sudo mysql -u root -p

Servidor Email - console mariadb

Dentro do console do MySQL, precisamos executar os comandos a seguir. Mas fique atento, evite utilizar control+c + control+v de todos os comando de uma vez, copie e cole um de cada vez e evite copiar espaços em branco de final de linha (lembre-se de trocar a senha @@@mudar123 por uma senha de sua preferência).

create database postfixadmin;
create user 'postfixadmin'@'localhost' identified by '@@@mudar123';
grant all privileges on postfixadmin.* to 'postfixadmin'@'localhost';
flush privileges;
exit;

Vou deixar aqui um aviso. Nesta etapa foi criada a senha de login do postfixadmin no banco de dados. É necessário que você tenha um controle pessoal das senhas. Anote em um papel, na agenda, ou qualquer outra forma.

Servidor Email - Console MariaDB - Criar banco de dados e usuárioServidor Email - Console MariaDB - permitir acesso usuário ao banco, recarregar privilégios e sair

Agora vamos inserir as credenciais de acesso ao banco de dados no arquivo de configuração do postfixadmin:

sudo nano /var/www/postfixadmin/config.local.php

Agora é necessário inserir as configurações do fim do arquivo (lembre de alterar o campo senha pela senha de login do postfixadmin no banco de dados – $CONF[‘database_password’] = ‘@@@mudar123‘:

Servidor Email - PostfixAdmin - arquivo de configuração de conexão ao banco de dados

Agora é importante ter um subdomínio configurado para acessar o postfixadmin. Para fins didáticos, vamos utilizar o “postfixadmin.viniciuspaes.com”. É possível utilizar outro nome de subdomínio se preferir.

Vamos criar o seguinte arquivo de configuração para o apache:

sudo nano /etc/apache2/sites-available/postfixadmin.conf

E dentro do arquivo vamos colar a configuração abaixo (lembrar de realizar as alterações de nome de domínio):

O arquivo acima é para acesso a url sem SSL, agora precisamos criar o arquivo de configuração com certificado SSL:

sudo nano /etc/apache2/sites-available/postfixadmin-ssl.conf

Dentro do arquivo cole a configuração abaixo, lembre-se de atualizar o arquivo abaixo com os dados do seu domínio:

Com os arquivos criados, precisamos ativá-los (execute uma linha de cada vez):

sudo a2ensite postfixadmin.conf
sudo a2ensite postfixadmin-ssl.conf

Agora reinicie o servidor Apache:

sudo service apache2 restart

Com a configuração no servidor http finalizada, precisamos agora criar a entrada DNS.

Nome do host: postfixadmin
Tipo: A
TTL: 1 hora (ou 3600 segundos, no caso, a DigitalOcean expressa o tempo em segundos)
Dados: (coloque o IP do seu servidor)

Servidor Email - Configurar subdomínio postfixadmin com entrada A

Caso o PHP ainda não esteja instalado, vamos realizar a instalação:

sudo apt install php8.1-fpm php8.1-imap php8.1-mbstring php8.1-mysql php8.1-curl php8.1-zip php8.1-xml php8.1-bz2 php8.1-intl php8.1-gmp php8.1-redis libapache2-mod-php

Agora reinicie o servidor Apache para ter a integração do php finalizada:

sudo service apache2 restart

Vamos solicitar agora um certificado para o subdomínio postfix.viniciuspaes.com:

sudo certbot --apache

No menu do certbot, escolha o subdomínio que configuramos para o postfix:

postfix.viniciuspaes.com

Continuamos agora, realizando modificações no arquivo de configuração do Dovecot, para habilitar estatísticas e permissão para usuário www-data:

sudo nano /etc/dovecot/conf.d/10-master.conf

Insira o conteúdo no arquivo:

service stats {
    unix_listener stats-reader {
    user = www-data
    group = www-data
    mode = 0660
}

unix_listener stats-writer {
    user = www-data
    group = www-data
    mode = 0660
  }
}

Servidor Email - Dovecot configurar serviço de estatísticas

Agora precisamos adicionar o usuário do servidor web (www-data) ao grupo do dovecot:

sudo gpasswd -a www-data dovecot

Reiniciar o dovecot:

sudo service dovecot restart

Prover permissões para o usuário www-data:

sudo setfacl -R -m u:www-data:rwx /var/run/dovecot/stats-reader /var/run/dovecot/stats-writer

Agora precisamos terminar parte do processo de setup do PostfixAdmin pela interface web. Acesse então a url:

https://postfixadmin.viniciuspaes.com/setup.php
Escolha uma senha, repita a mesma e depois clique para gerar seu hash

Servidor Email - PostfixAdmin criar senha de setupServidor Email - PostfixAdmin senha de setup criada

Vou deixar aqui um aviso. Nesta etapa foi criada a senha de setup do postfixadmin. É necessário que você tenha um controle pessoal das senhas. Anote em um papel, na agenda, ou qualquer outra forma.

Será então gerada uma linha que começa com “$CONF[‘setup_password’]”. Copie esta linha inteira, pois vamos precisar inserir ela no arquivo de configuração.
Edite então o arquivo:

sudo nano /var/www/postfixadmin/config.local.php

Agora copie a linha do hash da senha no fim do arquivo:

$CONF['setup_password'] = '(seu hash aqui)';

Servidor Email - copiar senha hash de setup para arquivo de configuração

Agora acesse novamente a url:

https://postfixadmin.viniciuspaes.com/setup.php

Agora preencha os dados:

Senha de setup (senha de setup do postfixadmin) criada na etapa anterior (senha normal, não é o hash)
Email do administrador (utilize um email do seu próprio domínio - evite caixas externas no gmail, outlook, etc)
Definir nova senha para o usuário administrador
Confirmar a senha criada

Vou deixar aqui um aviso. Nesta etapa foi criada a senha de login do usuário administrador do postfixadmin. É necessário que você tenha um controle pessoal das senhas. Anote em um papel, na agenda, ou qualquer outra forma.

Servidor de Email - login com senha de setupServidor de Email - login com senha de setup realizadoServidor de Email - criar senha de administrador

Após estes passos, receberá confirmação de login de administrador criado.

Servidor de Email - login e senha de administrador criado

Vamos continuar agora com a integração do postfix com o banco de dados, instalando o pacote de suporte a banco do postfix:

sudo apt install postfix-mysql

Necessário agora editar o arquivo de configuração:

sudo nano /etc/postfix/main.cf

Copiar o texto no fim do arquivo, cuidado especial com o espaçamento/identação:

virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

virtual_transport = lmtp:unix:private/dovecot-lmtp

Servidor de Email - configuração virtual mail box postfix

Vamos criar então o diretório para armazenar os arquivos necessários para integração:

sudo mkdir /etc/postfix/sql/

Agora com foco nos domínios virtuais, precisamos criar o arquivo que mapeia as consultas sql:

sudo nano /etc/postfix/sql/mysql_virtual_domains_maps.cf

Inserir o texto abaixo no arquivo (mudar a senha abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

Servidor email - Mysql Virtual Domains Maps - arquivo de configuração

Agora com foco para as caixas de email virtuais:

sudo nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

Inserir o texto no arquivo (mudar a senha destacada abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

Servidor email - Mysql Virtual Mailbox Maps - arquivo de configuração

Agora com foco nos Alias de domínio:

sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

Colocar o texto abaixo dentro do arquivo (mudar a senha destacada abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

Servidor email - Mysql Virtual Alias Domain Mailbox Maps - arquivo de configuração

Agora com foco em Alias de caixa de domínio, precisamos criar o arquivo:

sudo nano /etc/postfix/sql/mysql_virtual_alias_maps.cf

Dentro do arquivo criado, precisamos inserir a configuração (mudar a senha destacada abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Servidor email - Mysql Virtual Alias Maps - arquivo de configuração

Seguindo, arquivo para mapear alias em domínio:

sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

E no arquivo, necessário inserir o texto (mudar a senha destacada abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Servidor email - Mysql Virtual Alias Domain Maps - arquivo de configuração

Agora para fail safe, vamos criar um mapeamento do tipo catch all, criando o arquivo:

sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

E dentro do arquivo, vamos inserir (mudar a senha destacada abaixo para a senha de login do postfixadmin no banco de dados):

user = postfixadmin
password = @@@mudar123
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Servidor email - Mysql Virtual Alias Domain Catch All Maps - arquivo de configuração

Agora vamos acertar as permissões dos arquivos criados. Lembre de executar um comando abaixo de cada vez:

sudo chmod 0640 /etc/postfix/sql/*
sudo setfacl -R -m u:postfix:rx /etc/postfix/sql/

Lembra no começo do tutorial que alteramos a variável hostname para incluir somente o subdomínio principal do servidor de email? Então, agora como vamos utilizar suporte a domínios/caixas virtuais, será necessário realizar a alteração:

sudo postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost"

Seguindo para configurar o virtual mailbox, precisamos editar o arquivo:

sudo nano /etc/postfix/main.cf

Insira o texto abaixo dentro do arquivo:

virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000

Servidor Email - Postfix configuração virtual mail box path e UID

Vamos reiniciar o postfix:

sudo service postfix restart

Criar agora o usuário chamado de vmail, definir um número de id=2000, desabilitar login e não criar pasta home do usuário:

sudo adduser vmail --system --group --uid 2000 --disabled-login --no-create-home

Criar a pasta de suporte para armazenamento de dados do email:

sudo mkdir /var/vmail/

Definir a permissão da pasta para o usuário vmail que acabamos de criar:

sudo chown vmail:vmail /var/vmail/ -R

Seguindo agora com a integração do Dovecot com o banco de dados MySQL:

sudo apt install dovecot-mysql

Vamos editar o arquivo:

sudo nano /etc/dovecot/conf.d/10-mail.conf

Encontre a variável “mail_location” e insiria logo abaixo a variável “mail_home”, para que fique desta forma:

mail_home = /var/vmail/%d/%n/

Servidor de Email - Postfix configuração virtual mail box mail_home

Agora precisamos alterar novamente como é o formato de autenticação de usuário. Antes utilizávamos os usuários do linux para usuários do email. Então a opção “%n” removia a necessidade de @dominio.com na hora do login. Mas como agora vamos utilizar as caixas de email oriundas do banco, precisamos do caminho completo, então vamos utilizar o formato “%u”. Encontre e altere a variável “auth_username_format” para:

auth_username_format = %u

Servidor de Email - Postfix configuração virtual mail box mudar auth username format novamente

Ainda dentro do arquivo, encontre a linha “#auth_default_realm =”, precisamos que ela seja descomentada e alterada para:

auth_default_realm = viniciuspaes.com

Servidor Email - Definir domínio principal para autenticação - auth_default_realm

O que a linha acima quer dizer? Bom, caso realize o login e esqueça de inserir @dominio.com.br, automaticamente o sistema irá concatenar o domínio principal, que é o viniciuspaes.com.

Ainda no mesmo arquivo, precisamos buscar a linha “#!include auth-sql.conf.ext” e descomentá-la, alterando ela para:

!include auth-sql.conf.ext

Esta alteração acima é para que o dovecot busque informação no banco de dados com solicitações do tipo sql.

Ainda dentro do modo de edição do arquivo, encontre a linha “!include auth-system.conf.ext”. Ela precisa ser comentada (desabilitada), pois agora não vamos mais realizar login com usuário do sistema linux:

#!include auth-system.conf.ext

Servidor Email - Postfix desabilitar login com usuário sistema e habilitar por sql

Continuando com a edição do mesmo arquivo, insira estas informações no fim dele:

auth_debug = yes
auth_debug_passwords = yes

Servidor Email - Postfix habilitar auth_debug_passwords

Seguindo com as configurações no Dovecot, vamos editar o arquivo:

sudo nano /etc/dovecot/dovecot-sql.conf.ext

Insira o texto abaixo no fim do arquivo (lembre de alterar a senha abaixo pela senha de conexão do postfixadmin ao banco de dados):

driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=@@@mudar123
default_pass_scheme = ARGON2I
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT maildir, 2000 AS uid, 2000 AS gid FROM mailbox WHERE username = '%u' AND active='1'
iterate_query = SELECT username AS user FROM mailbox

Servidor Email - configuração conexão sql dovecot

Vamos reiniciar o dovecot novamente:

sudo service dovecot restart

Agora vamos realizar a configuração pela interface web do postfixadmin, acesse a url:

https://postfixadmin.viniciuspaes.com/login.php

Servidor email - Página de login de administrador do postfixadmin

Lembrar que utilizar o login e senha de administrador que criou anteriormente para o postfixadmin, para conseguir realizar o login acima.

No menu, acesse a opção domínios, e em seguida a opção de:

Criar domínio

Agora cadastre seu domínio principal. Ou seja, no meu caso o domínio principal é viniciuspaes.com.

Servidor Email - Cadastrar Domínio
Servidor Email - Cadastrar Domínio Principal do Servidor
Servidor Email - finalizar criação/cadastro do domínio principal
Servidor Email - Confirmação de domínio cadastrado

Ainda dentro da interface do postfixadmin, clique na opção “Virtual” e em seguida clique em:

Criar conta de email

Servidor Email - Criar nova caixa de emailServidor Email - criar nova caixa de email

Servidor Email - criar nova caixa de email - preencher os dados

Servidor Email - criar nova caixa de email - clicar no botão para criar caixa de email

Para configurar sua caixa de email em um cliente de email como o Thunderbird, Outlook, Mail, etc, utilize as configurações:

Login (usuário@domínio.com.br)
Senha (a senha que escolheu ao criar conta de email pelo postfixadmin)
Serviço de chegada de email (POP3/IMAP) - Porta 143 para IMAP (993 também habilitada)
Serviço de saída de email (SMTP) - Porta 587 para SMTP (465 também habilitada)
Hostname para POP3/IMAP/SMTP - mail.viniciuspaes.com
Criptografia ativada (SSL/TLS - STARTTLS) para IMAP e SMTP

Pensando agora na manutenção do servidor de emails, podemos configurar um cron job para limpar mensagens na lixeira:

Entrar no modo de edição da crontab:

sudo crontab -e

Agora insira o texto abaixo no arquivo:

@daily doveadm expunge -A mailbox Trash savedbefore 2w
@daily setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/
MAILTO="seuemail@seudominio.com"

Servidor Email - crontab para limpar lixeira depois de 2 semanas e corrigir permissões de arquivo do certificado ssl

No comando acima usei como o padrão que a pasta de lixo chama “Trash”, caso utilize o padrão “Junk”, basta realizar as modificações.

Um passo final e importante nesta etapa é restringir quais usuários do sistema do linux podem enviar email. Neste caso, vamos deixar somente o usuário root, www-data e vmail.

Edite então o arquivo:

sudo nano /etc/postfix/main.cf

Adicione o texto no fim do arquivo:

authorized_submit_users = root,www-data,vmail

Servidor Email - Postfix configurar remetentes autorizados pelo linux

Reinicie o postfix:

sudo service postfix restart

Passo 15 – Como instalar e configurar o RoundCube Web Cliente

Um passo interessante na hora de configurar um servidor de email é permitir a usuários que possam acessar seus emails, sem a necessidade de ter aplicativo cliente de email instalado e configurado no seu computador pessoal, ou seja, ter a possibilidade de acessar os emails diante uma interface web.

Esta etapa é dita como opcional, pois não é necessária para o funcionamento do servidor de emails. Mas caso queira disponibilizar um setup completo para sua equipe, ou até mesmo fornecer serviço de gestão de emails para clientes, com certeza é uma etapa primordial.

Existem diversos clientes de email disponíveis no mercado, para este tutorial vamos utilizar o RoundCube.

O primeiro passo para instalação do roundcube é verificar a última versão disponível para download:

https://roundcube.net/download/

Servidor Email - Página de Downloads disponíveis roundcube

Na tela acima, podemos verificar as opções de download do RoundCube. Neste tutorial vamos utilizar o link da versão completa. Então clique com botão direito do mouse no link de Download e copie a URL de download.

De volta no servidor, tenha certeza que está na sua pasta home:

cd ~

Agora vamos realizar o download da última versão do RoundCube. Neste exemplo, a última versão disponível é a versão 1.6.1. Então o comando de download juntamente com a url copiada ficam desta forma:

wget https://github.com/roundcube/roundcubemail/releases/download/1.6.1/roundcubemail-1.6.1-complete.tar.gz

Servidor Email - download código fonte completo roundcube mail com wget

Para descompactar o arquivo, utilize o comando:

tar xvf roundcubemail-1.6.1-complete.tar.gz

Agora é necessário mover a pasta descompactada do roundcube para a pasta de produção do webserver:

sudo mv roundcubemail-1.6.1 /var/www/roundcube

Definir as permissões de arquivo da pasta temp e logs (executar um comando por vez):

sudo chown www-data:www-data /var/www/roundcube/temp/ -R
sudo chown www-data:www-data /var/www/roundcube/logs/ -R

Nesta instalação de exemplo, a versão disponível do php é a 8.1. Abaixo segue o comando para instalar os pacotes adicionais do php que vamos precisar para o funcionamento do RoundCube. Pode reparar que alguns pacotes estão vinculados a versão 8.1 do php. Caso seu PHP instalado esteja em outra versão, lembre-se de atualizar a versão dos pacotes abaixo também:

sudo apt install php-net-ldap2 php-net-ldap3 php-imagick php8.1-common php8.1-gd php8.1-imap php8.1-mysql php8.1-curl php8.1-zip php8.1-xml php8.1-mbstring php8.1-bz2 php8.1-intl php8.1-gmp php8.1-redis

Agora precisamos também criar um usuário e tabela de banco de dados para o funcionamento do RoundCube.
O primeiro passo é o login no banco de dados:

sudo mysql -u root

Dentro do prompt do MySQL (ou MariaDB) precisamos então criar o banco de dados. Vamos utilizar o comando abaixo:

CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Agora precisamos criar o usuário roundcube no banco de dados e permitir que ele tenha acesso a tabela de banco de dados chamada roundcubemail. No comando abaixo também é necessário definir uma senha para o login deste usuário. É uma boa prática de segurança que a senha de exemplo abaixo (@@@mudar123) seja alterada:

CREATE USER roundcube@localhost IDENTIFIED BY '@@@mudar123';

Necessário permitir que o usuário criado tenha permissão de acesso ao banco de dados criado:

GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost;

Recarregar a tabela de privilégios para que as modificações acima tenham efeito:

flush privileges;

Sair do prompt do MySQL:

exit;

Vou deixar aqui um aviso. Nesta etapa foi criada a senha de login do usuário roundcube para o banco de dados roundcubemail. É necessário que você tenha um controle pessoal das senhas. Anote em um papel, na agenda, ou qualquer outra forma.

Servidor Email - Criar banco de dados e usuário para roundcube

Servidor Email - Garantir permissão do usuário ao banco, recarregar privilégios e sair; roundcube mail mysql

O RoundCube possui um arquivo SQL com as configurações iniciais do seu banco de dados. Podemos então carregar o arquivo SQL com o comando:

sudo mysql roundcubemail < /var/www/roundcube/SQL/mysql.initial.sql

Pensando no acesso dos usuários ao RoundCube podemos definir qual URL desejamos que isso ocorra. Particularmente acho interessante utilizar o subdomínio mail.viniciuspaes.com. Mas fique a vontade de escolher a melhor forma de acesso que desejar. Vamos então preparar 2 arquivos de configuração do apache para o acesso com e sem SSL.

Agora precisamos editar o arquivo de configuração com acesso http:

sudo nano /etc/apache2/sites-available/mail.viniciuspaes.com.http.conf

Trocar o conteúdo por:

Seguindo, vamos criar/editar o arquivo de configuração para acesso com SSL no roundcube:

sudo nano /etc/apache2/sites-available/mail.viniciuspaes.com.ssl.conf

E trocar o conteúdo para:

Vamos agora editar o arquivo /etc/hosts para adicionar query local para o subdomínio que o roundcube está instalado:

sudo nano /etc/host

Procure a linha que começa com o IP de loopback (127.0.0.1), altere a mesma para que fique desta forma:

127.0.0.1 localhost mail.viniciuspaes.com

Servidor Email - inserindo subdomínio para responder solicitações localhost para roteamento interno de emails

Seguindo com a configuração do RoundCube vamos fazer uma cópia do arquivo de configuração de exemplo, para que possamos realizar as alterações:

sudo cp /var/www/roundcube/config/config.inc.php.sample /var/www/roundcube/config/config.inc.php

Agora vamos editar o arquivo criado:

sudo nano /var/www/roundcube/config/config.inc.php

Encontre a linha que começa com “$config[‘db_dsnw’] =” ela precisa ser substituída por:

$config['db_dsnw'] = 'mysql://roundcube:%40%40%40mudar123@localhost/roundcubemail';

Repare que no campo acima, ao invés de utilizarmos nossa senha padrão de exemplo “@@@mudar123” estamos utilizando “%40%40%40mudar123”. Isto ocorre pois não podemos utilizar caracteres especiais livremente na senha, eles precisam ser convertidos para o padrão “Percent Encode”. Desta forma, o caractere @ é convertido para %40. Se sua senha escolhida possuir caracteres especiais, como os destacados na lista abaixo, lembre-se de realizar a alteração.

  • : deve ser substituído por %3A
  • / deve ser substituído por %2F
  • ? deve ser substituído por %3F
  • # deve ser substituído por %23
  • [ deve ser substituído por %5B
  • ] deve ser substituído por %5D
  • @ deve ser substituído por %40
  • ! deve ser substituído por %21
  • $ deve ser substituído por %24
  • & deve ser substituído por %26
  • “” deve ser substituído por %27
  • ( deve ser substituído por %28
  • ) deve ser substituído por %29
  • * deve ser substituído por %2A
  • + deve ser substituído por %2B
  • , deve ser substituído por %2C
  • ; deve ser substituído por %3B
  • = deve ser substituído por %3D
  • % deve ser substituído por %25
  • (espaço) deve ser substituído por %20 ou +

Servidor Email - Configurar conexão do roudcube ao banco de dados mysql - atenção ao formato percent encode da senha

Ainda dentro do arquivo “sudo nano /var/www/roundcube/config/config.inc.php” precisamos realizar mais alterações.
Encontrar as linhas:

$config['imap_host'] = 'localhost:143';
$config['smtp_host'] = 'localhost:587';

E substituir por:

$config['imap_host'] = 'tls://mail.viniciuspaes.com:143';
$config['smtp_host'] = 'tls://mail.viniciuspaes.com:587';

Servidor Email - configurando conexões imap e tls roundcube

Agora encontre a linha que começa com “$config[‘des_key’]”, ela precisa ser alterada. Substitua o valor da variável da chave  por 24 caracteres aleatórios (lembre de substituir a chave de exemplo abaixo). Esta linha deve ficar semelhante a:

$config['des_key'] = 'ASl95U9Ioepsh*k-@ahGjUIk';

Servidor Email - configurar des-key roundcube

Ainda dentro do arquivo, precisamos encontrar a linha que define os plugins instalados. Procure a linha que comça com “$config[‘plugins’] =”.
Este vetor vem por padrão com apenas 2 plugins:

$config['plugins'] = [
    'archive',
    'zipdownload',
];

Servidor Email - plugins habilitados roundcube

É preciso habilitar diversos outros plugins para que o RoundCube funcione com toda sua glória. Substitua então o texto acima por:

$config['plugins'] = [
        'acl',
        'additional_message_headers',
        'archive',
        'attachment_reminder',
        'autologon',
        'debug_logger',
        'emoticons',
        'enigma',
        'filesystem_attachments',
        'help',
        'hide_blockquote',
        'http_authentication',
        'identicon',
        'identity_select',
        'jqueryui',
        'krb_authentication',
        'managesieve',
        'markasjunk',
        'new_user_dialog',
        'new_user_identity',
        'newmail_notifier',
        'password',
        'reconnect',
        'show_additional_headers',
        'squirrelmail_usercopy',
        'subscriptions_option',
        'userinfo',
        'vcard_attachments',
        'virtuser_file',
        'virtuser_query',
        'zipdownload'
];

Servidor Email - Plugins adicionais habilitados no roundcube

Ainda na edição, insira o texto no fim do arquivo:

$config['enable_spellcheck'] = true;

Servidor Email - habilitar verificação de ortografia no roundcube

Agora acesse a URL onde configurou o RoundCube, neste exemplo:

https://mail.viniciuspaes.com

Servidor Email - tela de login do roundcube

Caso tenha uma caixa de email configurada, digite seu nome de usuário e senha e a configuração inicial do RoundCube está completa!

No primeiro acesso a sua caixa de email, o RoundCube irá perguntar alguns dados básicos, como o Nome do Remetente para aparecer na conta, se deseja adicionar uma assinatura nos emails, etc.

Servidor Email - primeiro login caixa no roundcube - informações adicionais solicitadas

Por motivos de segurança, é recomendado remover a pasta de instalação do RoundCube:

sudo rm /var/www/roundcube/installer/ -r

Uma etapa recomendada é também instalar o serviço de filtro de mensagens Sieve. Ele dá permissões avançadas de integração que permite que os usuários façam configurações adicionais pelo Roundcube, alguns exemplos:

    • Permite que os usuários criem pastas dentro do RoundCube para organizar as mensagens de email
    • Permite que usuários do RoundCube criem filtros para os emails
    • Dá suporte para que os usuários possam alterar os endereços de email pela interface do RoundCube

O primeiro passo é instalar o sieve e pacotes auxiliares:

sudo apt install dovecot-sieve dovecot-managesieved dovecot-lmtpd

Editar o arquivo de configuração do dovecot:

sudo nano /etc/dovecot/dovecot.conf

Encontrar a linha “protocols = “. É necessário adicionar o protocolo sieve. A linha deve ficar como (pop3 é opcional, apenas se estiver utilizando):

protocols = imap pop3 lmtp sieve

Servidor Email - habilitar suporte ao protocolo sieve no dovecot

Editar agora o arquivo de configuração do postfix:

sudo nano /etc/postfix/main.cf

Adicione estas linhas no fim do arquivo:

mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no

Servidor Email - configurando integração postfix e dovecot com lmtp

Agora vamos editar este outro arquivo do Dovecot:

sudo nano /etc/dovecot/conf.d/15-lda.conf

Agora pesquise pela linha “mail_plugins =” que estará dentro do protocolo lda. Esta linha está comentada, será necessário descomentá-la e alterar para:

mail_plugins = $mail_plugins sieve

Servidor Email - dovecot, habilitando sieve mail plugins

Agora vamos editar o arquivo:

sudo nano /etc/dovecot/conf.d/20-lmtp.conf

Procure agora sobre o protocolo lmtp, temos que habilitar o sieve por lá também, ele deve ficar desta forma:

protocol lmtp {
      mail_plugins = quota sieve
}

Servidor Email - habilitando sieve no protocolo lmtp

Vamos reiniciar o postfix e o dovecot:

sudo service dovecot restart
sudo service postfix restart

Ao fim desta parte, já podemos criar em uma mensagem de email dentro do roundcube e verificar no botão de “mais” as opções de filtros habilitadas.
Uma etapa de segurança interessante é remover do header do email, para que o destinatário não saiba que você está utilizando o RoundCube.
Crie e edite o arquivo:

sudo nano /etc/postfix/smtp_header_checks

Agora insira o conteúdo abaixo dentro do arquivo:

/^User-Agent.*Roundcube Webmail/            IGNORE

Servidor Email - configuração para excluir header do roundcube dos emails

Precisamos editar o arquivo de segurança do postfix para habilitar o smtp_header_check que criamos:

sudo nano /etc/postfix/main.cf

Insira o texto abaixo no fim do arquivo:

smtp_header_checks = regexp:/etc/postfix/smtp_header_checks

Servidor Email - postfix - configurando arquivo para remover header do roundcube

Agora execute o comando abaixo para recriar a tabela de hash:

sudo postmap /etc/postfix/smtp_header_checks

Reinicie o postfix para que a alteração que realizamos tenha efeito e o User-Agent do Rounducbe senha removido das mensagens enviadas:

sudo service postfix restart

Seguindo com as configurações extras no RoundCube, vamos realizar modificações para permitir que os usuários possam alterar as próprias senhas diretamente pela interface do Roundcube.

Faça uma cópia do arquivo de exemplo, para que possamos realizar as alterações:

sudo cp /var/www/roundcube/plugins/password/config.inc.php.dist /var/www/roundcube/plugins/password/config.inc.php

Agora edite o arquivo criado:

sudo nano /var/www/roundcube/plugins/password/config.inc.php

Encontre a linha “$config[‘password_db_dsn’] =”, agora é encessário alterar ela para:

$config['password_db_dsn'] = 'mysql://postfixadmin:%40%40%40mudar123@127.0.0.1/postfixadmin';

Lembrando que é necessário alterar a senha padrão acima (%40%40%40mudar123) para a senha que escolheu a conexão do postfixadmin ao banco de dados. Lembrando também que deverá utilizar a senha no padrão “Percent Encode”, trocando os caracteres especiais pelo seu código correspondente. Então novamente, do exemplo acima, a senha @@@mudar123, traduzida para o formato Percent Encode, fica %40%40%40mudar123.

Servidor Email - Roundcube, iserindo dados de login mysql para que usuário consiga mudar a própria senha

Agora no mesmo arquivo, encontre a linha “$config[‘password_query’] = ‘SELECT update_passwd(%c, %u)’;” e altere para:

$config['password_query'] = 'UPDATE mailbox SET password=%P,modified=NOW() WHERE username=%u';

Servidor Email - Query SQL para usuário mudr a própria senha

Encontre a linha “$config[‘password_strength_driver’] = null;” e altere para:

$config['password_strength_driver'] = 'zxcvbn';

Adicione abaixo da linha acima o seguinte texto:

$config['password_zxcvbn_min_score'] = 5;

Servidor Email - Roundcube algoritmo de força de senha

Encontre a linha “$config[‘password_minimum_length’]” e defina o tamanho mínimo para a senha, recomendamos pelo menos 8 caracteres:

$config['password_minimum_length'] = 8;

Servidor Email - Roundcube tamanho mínimo de senha

Agora encontre a linha “$config[‘password_algorithm’] = ‘clear’;” e altere para:

$config[‘password_algorithm’] = ‘dovecot’;

Servidor Email - update algoritmo de senha dovecot

Encontre a linha “$config[‘password_dovecotpw’] = ‘/usr/local/sbin/dovecotpw’;” e altere para:

$config['password_dovecotpw'] = '/usr/bin/doveadm pw -r 5';

Servidor Email - Roundcube update password dovecotpw

Encontre a linha “$config[‘password_dovecotpw_method’] = ‘CRAM-MD5’;” e altere para:

$config['password_dovecotpw_method'] = 'ARGON2I';

Servidor Email - roundcube update algoritmo encriptação argon2i

Encontre a linha “$config[‘password_dovecotpw_with_method’] = false;” e altere para:

$config['password_dovecotpw_with_method'] = true;

Servidor Email - Roundcube habilitar suporte mudança de senha com método de encriptação

Agora altere as permissões dos arquivos (execute um comando de cada vez):

sudo chown www-data:www-data /var/www/roundcube/plugins/password/config.inc.php
sudo chmod 600 /var/www/roundcube/plugins/password/config.inc.php

Agora precisamos alterar o arquivo de configuração do php, lembrando que estamos utilizando a versão 8.1 com o php-fpm habilitado no apache, se estiver em uma versão diferente, ou utilizando o apache handler, altere o caminho até o arquivo:

sudo nano /etc/php/8.1/fpm/php.ini

Encontre a linha “upload_max_filesize =” e altere para habilitar upload de até 25MB:

upload_max_filesize = 25M

Servidor Email - Definir novo tamanho máximo de upload

Encontre a linha “post_max_size = 8M” e altere para poder permitir que o upload de até 25MB funcione:

post_max_size = 25M

Servidor Email - definir limite máximo de post, precisa ser compatível como tamanho máximo de upload para que ambos funcionem corretamente

Agora é necessário reiniciar o apache e o php (php 8.1 com fpm habilitado):

sudo service apache2 restart
sudo service php8.1-fpm restart

Tudo certo! Roundcube instalado e plugins extras configurados corretamente!

Passo 16 – Preparar o servidor para dar suporte a vários domínios

O setup do servidor de emails está completo. Com as configurações realizadas nos passos anteriores toda a proposta que definimos nos objetivos está implementada. Porém, para apenas 1 domínio. Neste exemplo, configuramos o servidor de email para funcionar no domínio viniciuspaes.com.

Mas é possível prover este suporte para mais domínios? Pensando em uma empresa que presta serviços de criação de caixas de email personalizadas para cada cliente do tipo seunome@seudominio.com.br, seria necessário 1 servidor para cada domínio? Não necessariamente, é possível realizar algumas modificações neste setup, para habilitar suporte para diversos domínios distintos.

A forma mais elegante é deixar os certificados SSL de cada domínio independentes e utilizar o mapeamento SNI MAPS para vincular cada domínio ao seu certificado.
Há também a possibilidade de gerar os certificados agrupados junto ao certificado do domínio principal; não fica muito elegante, porém é mais fácil e a compatibilidade com clientes de email é maior.

Neste exemplo vou utilizar o mapeamento SNI (sni_maps), para deixar os certificados independentes.

Primeiro passo é habilitar a função sni-maps:
Edite o arquivo do postfix:

sudo nano /etc/postfix/main.cf

Cole o seguinte texto no fim do arquivo:

tls_server_sni_maps = hash:/etc/postfix/sni_maps

Servidor Email - habilitar suporte mapeamento sni para certificados ssl/tls de domínios

Agora crie o arquivo para o mapeamento:

sudo nano /etc/postfix/sni_maps

Insira o conteúdo que mapeia o primeiro domínio (domínio principal):

mail.viniciuspaes.com   /etc/letsencrypt/live/mail.viniciuspaes.com/privkey.pem    /etc/letsencrypt/live/mail.viniciuspaes.com/fullchain.pem

Servidor Email - criar entrada mapeamento SNI para domínio principal

Agora precisamos recriar o hash da tabela de mapeamento sni:

sudo postmap -F /etc/postfix/sni_maps

Agora é necessário reiniciar o Postfix:

sudo service postfix restart

Uma etapa importante é realizar o hash da tabela de mapeamento sni automaticamente com um cronjob. Quando o certificado dos subdomínios é renovado, é necessário realizar um novo hash. Então fica interessante automatizar este processo para evitar erros. Edite a crontab com o comando:

sudo crontab -e

Agora adicione a seguinte linha:

@daily certbot renew --quiet; /usr/sbin/postmap -F /etc/postfix/sni_maps; systemctl reload postfix dovecot httpd

Servidor Email - editar crontab para adicionar hash automático para sni e renew de certificados

Pronto, o servidor já tem suporte para gerenciar email de vários domínios de forma independente. Agora siga o próximo passo a cada vez que precisar adicionar um novo domínio.

Passo 17 – Como adicionar um novo domínio no servidor de Email

Para configurar um novo domínio no servidor, vamos chamar este novo domínio de dominio2.com (mas pode configurar um domínio com a extensão que quiser).

Etapa 1 – Configurar DNS, SPF, DMARC e DKIM

Crie uma entrada do tipo DNS do MX:

Nome do host: @ (ou deixe em branco)
Tipo: A
TTL: 3600
Prioridade: 0
Dados: mail.dominio2.com

Crie entrada DNS do tipo A

Nome do host: mail
Tipo: A
TTL: 1 hora (ou 3600 segundos, no caso, a DigitalOcean expressa o tempo em segundos)
Dados: (coloque o IP do seu servidor)

Crie entrada DNS do tipo TXT para o SPF

Nome do host: @
Tipo: TXT
TTL: 3600
Dados: v=spf1 mx ~all

Crie entrada DNS do tipo TXT para o DMARC

Nome do host: _dmarc
Tipo: TXT
TTL: 3600
Dados: v=DMARC1; p=none; pct=100; fo=1; rua=mailto:dmarc@dominio2.com; ruf=mailto:dmarc@dominio2.com;

Configurar o DKIM para poder adicionar o DNS dele:

sudo nano /etc/opendkim/signing.table

Adicione a linha do novo domínio no fim do arquivo:

*@dominio2.com	     default._domainkey.dominio2.com

Editar o arquivo de tabela de chaves do DKIM:

sudo nano /etc/opendkim/key.table

Inserir no fim do arquivo:

default._domainkey.dominio2.com	 dominio2.com:default:/etc/opendkim/keys/dominio2.com/default.private

Editar o arquivo de host confiável:

sudo nano /etc/opendkim/trusted.hosts

Inserir no fim do arquivo:

.dominio2.com

Criar a pasta para o par de chaves do DKIM:

sudo mkdir /etc/opendkim/keys/dominio2.com

Gerar o par de chaves dentro da pasta criada:

sudo opendkim-genkey -b 2048 -d dominio2.com -D /etc/opendkim/keys/dominio2.com -s default -v

Definir permissão para a chave criada:

sudo chown opendkim:opendkim /etc/opendkim/keys/dominio2.com/default.private

Ver qual conteúdo da chave pública criada:

sudo cat /etc/opendkim/keys/dominio2.com/default.txt

Criar o Registro DNS do tipo TXT com este padrão, utilizando os dados da sua chave pública (p=)

Nome do host: default._domainkey
Tipo: TXT
TTL: 3600
Dados: v=DKIM1; h=sha256; k=rsa; p=(cole aqui a sua chave, retire as aspas duplas e espaços em branco, pois ela é dividida em 2 partes)

Verificar DNS do DKIM foi configurado corretamente:

dig TXT default._domainkey.dominio2.com

Testar a chave do DKIM configurada:

sudo opendkim-testkey -d dominio2.com -s default -vvv

Reiniciar o serviço opendkim:

sudo service opendkim restart

Configurar novo subdomínio no servidor de página e solicitar certificado SSL

Criar arquivo de configuração para acesso http no domínio:

sudo nano /etc/apache2/sites-available/mail.dominio2.com.http.conf

Inserir o conteúdo no arquivo:

Criar o arquivo de configuração para acesso https no domínio:

sudo nano /etc/apache2/sites-available/mail.dominio2.com.ssl.conf

Insira o conteúdo no arquivo:

Ativar os arquivos de configuração criados (execute 1 linha de cada vez):

sudo a2ensite mail.dominio2.com.http.conf
sudo a2ensite mail.dominio2.com.ssl.conf

Agora reinicie o servidor apache:

sudo service apache2 restart

Agora solicite o certificado do novo subdomínio pelo certbot:

sudo certbot --apache

Escolha o subdomínio onde deseja pedir o certificado, no caso deste exemplo:

mail.dominio2.com

Configurar novo domínio no Postfix e Dovecot

Criar a entrada sni do novo domínio, informando o caminho do certificado:

sudo nano /etc/postfix/sni_maps

Adicionar no fim do arquivo:

mail.dominio2.com   /etc/letsencrypt/live/mail.dominio2.com/privkey.pem     /etc/letsencrypt/live/mail.dominio2.com/fullchain.pem

Recriar hash da tabela SNI:

sudo postmap -F /etc/postfix/sni_maps

Editar o arquivo abaixo para inserir o caminho do certificado do novo domínio no padrão sni:

sudo nano /etc/dovecot/conf.d/10-ssl.conf

Encontre a linha dos certificados do domínio principal:

ssl_cert =</etc/letsencrypt/live/mail.viniciuspaes.com/fullchain.pem 
ssl_key =</etc/letsencrypt/live/mail.viniciuspaes.com/privkey.pem

Adicione o novos domínios, neste padrão:

ssl_cert =</etc/letsencrypt/live/mail.viniciuspaes.com/fullchain.pem 
ssl_key =</etc/letsencrypt/live/mail.viniciuspaes.com/privkey.pem

#entrada modelo sni para subdomínio mail.dominio2.com
local_name mail.dominio2.com {
ssl_cert =</etc/letsencrypt/live/mail.dominio2.com/fullchain.pem
ssl_key =</etc/letsencrypt/live/mail.dominio2.com/privkey.pem
}

Servidor Email - como adicionar dominios adicionais e certificados padrão de mapeamento SNI

 

Reinicie todos os serviços (execute 1 linha de cada vez):

sudo service apache2 restart
sudo service postfix restart
sudo service dovecot restart

Configurar novo domínio e nova caixa de email no PostfixAdmin

Acesse a URL do postfixadmin:

https://postfixadmin.viniciuspaes.com

Clique no menu:

Domínios

Em seguida em:

Criar novo domínio

E configure o novo domínio desejado.

Clique no menu:

Virtual

Em seguida em:

Criar conta de email

E configure sua nova caixa de email no novo domínio configurado.

Agora acesse sua nova caixa de email pelo roundcube:

https://mail.dominio2.com

Ou configure um cliente de email com os dados da sua nova caixa:

IMAP
Recebimento de email
Host: mail.dominio2.com
Porta: 143
SSL: Sim (STARTSSL)

SMTP
Envio de email
Host: mail.dominio2.com
Porta: 587
SSL: Sim (STARTSSL)

Tudo certo, novo domínio configurado! siga este passo novamente quantas vezes for necessário para configurar novos domínios!

Considerações Finais

Lembrando que neste setup não foi configurado/abordado um software anti spam, primordial para um bom funcionamento do servidor; mas será abordado em uma próxima publicação.

A entrada DNS do tipo PTR também não foi abordada. Meu provedor de serviço VPS (Digital Ocean) configura automaticamente a entrada PTR para meu servidor contratado a partir do nome do servidor/hostname configurado. Se tiver um servidor em casa, é muito provável que não consiga configurar a entrada PTR, ela atrapalha um pouco a autoridade do seu servidor, mas no geral terá um funcionamento satisfatório.

Este tutorial é bastante extenso, se tiver algum erro em algum arquivo de configuração é interessante checar caso não tenha inserido alguma informação incorreta, ou algum caracter fora de lugar. Na maioria das vezes que configurei um servidor de email tive estes problemas, é algo comum de acontecer.

No geral, é sempre uma boa prática acompanhar o log do servidor, para verificar problemas:

nano /etc/log/mail.log

Para enviar emails para domínio @icloud.com é necessário entrar em contato com a Spamhaus e remover seu IP da lista de SPAM deles. É um processo bastante rápido, basta alterar a URL e inserir o endereço IP do seu servidor. Ao acessar o link, será necessário confirmar propriedade do servidor para liberação:

http://www.spamhaus.org/query/bl?ip=100.100.100.100

 

Caso tenha alguma dúvida ou sugestão, basta informar nos comentários!