Configurar servidor de email em Ubuntu Server

O que ando aprendendo nesta caminhada sobre a Terra

Configurar servidor de email em Ubuntu Server

A RedHat descontinuou o CentOS e deixou muita gente como eu acostumado a linha derivada do RHEL orfão de um servidor Linux estável e baseado em RPMs.

E o que isso tem a ver com este tutorial? Resposta direta: “Para mim tudo”.

Fui obrigado a migrar meu servidor de CentOS 8 para outra distrô disponível em VPSs da OVH e consequentemente reconfigurar tudo o que já estava em “voo de cruzeiro” e isso inclui o servidor de email que inclusive escrevi um tutorial. Para manter a tradição, conforme vou fui executando os passos da configuração escrevo o tutorial.

Inicialmente informo que continuarei a utilizar os mesmos softwares e com a mesma intenção de uso. Isso inclui o uso de Postfix, Dovecot, MariaDB, Spamassassin, Clamav, Amavisd-new, Fail2ban, Nginx, Postfixadmin e RoundCube mas em suas utlimas versões sob o Ubuntu Server.

Por que Ubuntu?

Tenho recebido algumas perguntas sobre o porquê de eu escolher o Ubuntu Server para substituir o CentOS. A resposta passa por duas premissas: Disponibilidade no serviço contratado e familiaridade com o uso.

Dentre as distribuições disponiveis, com Debian, Fedora e Ubuntu como opções, optei usar uma que tem LTS (suporte de longo termo) e como uso há algum tempo o Ubuntu como SO principal em meu ambiente de desenvolvimento fiquei mais inclinado a usar o Ubuntu Server 20.04 por ter suporte no mínimo até 2025 e provavelmente será bem mais garantido que a Canonical não descontinue o Ubuntu assim como a RedHat fez com o CentOS.

Agora que os motivos estão claros podemos seguir com o que realmente interessa que é a configuração.

Instalação dos pacotes

O início de qualquer configuração está em instalar os pacotes necessários e suas dependências e friso aqui que utilizarei a versão que está disponível nos repositorios oficiais da distribuição escolhida.

O comando abaixo irá instalar todos os pacotes que irei utilizar e cada um deles que precise ser configurado ganhará um texto explicativo.

$ sudo apt install -y curl htop vim wget net-tools certbot postfix postfix-mysql postfix-pcre dovecot-coreamavisd-new clamdscan mariadb-server nginx php-fpm

A ordem de configuração importa porque a ideia é ter um servidor rodando com processos determinados de forma a ter alguns serviços utilizando outros, seja para controle de informações, seja para melhorar seu próprio modelo de execução. Por exemplo: o Postfix não faz nenhum controle de nocividade do conteudo das mensagens e isso será delegado para software especializado nisso. Outro fator é que por padrão o controle de caixas de correio seria feito via contas de usuarios do Sistema Operacional (instalação padrão), mas iremos utilizar um controle baseado em tabelas no banco de dados e que iremos configurar mediante o uso do navegador web o que torna necessario ter um gerenciador de banco de dados e um webserver previamente instalado.

Configurando o MariaDB

Versão mais atual: 10.6.5
Versão instalada: 10.3.32

Durante a configuração do meu Webserver sofri um pouco para ter o MariaDB instalado, configurado e estável porque parece haver um problema de compatibilidade entre um perfil do apparmor e o SGBD.

Precisei executar os seguintes passos para conseguir com que o serviço do MariaDB parasse de ser terminado automaticamente minutos após ter sido iniciado. Os passos foram tirados daqui e daqui.

$ sudo systemctl stop apparmor.service
$ sudo update-rc.d -f apparmor remove

$ sudo apt-get remove --purge mysql-server mysql-client mysql-common mariadb-server mariadb-common
$ sudo apt-get autoremove && sudo apt-get autoclean
$ sudo apt-get install mariadb-server mariadb-common mariadb-client

$ sudo systemctl start apparmor.service
$ sudo update-rc.d apparmor defaults

Após a instalação há dois passos opcionais que podem ser executados para melhorar a segurança no acesso ao banco de dados.

O primeiro que cito é a execução do script sudo /usr/bin/mysql_secure_installation.

Ao executá-lo você poderá alterar a senha de acesso do usuário root, remover a conta de acesso anonima, remover a capacidade de se autenticar como root remotamente e remover a base de dados de teste.

Segue o que utilizei:

Para a pergunta sobre alterar a senha do usuário root eu apenas dei Enter sem digitar uma senha pois não irei utilizar conexão externa de nenhum tipo e o usuario root do SO só será acessivel via shell local.

Enter current password for root (enter for none): 

Removi usuarios anonimos respondendo com y a pergunta abaixo.

Remove anonymous users? [Y/n] y

Desabilitei o acesso remoto para o usuario root respondendo com y a próxima pergunta. Posteriormente irei configurar o ssh para não permitir login pelo usuario root tambem o que me obrigará a ter um usuario com capacidade de conectar remotamente e escalar privilegio localmente para root e somente assim conseguir se conectar ao MariaDB como tal.

Disallow root login remotely? [Y/n] y

Removi a base de dados de testes porque afinal não devería ser necessário tê-la por ser um ambiente produtivo. Para isso respondi com y a pergunta logo abaixo:

Remove test database and access to it? [Y/n] y

E por fim permiti recarregar a tabela de privilégios respondendo com y a questão seguinte.

Reload privilege tables now? [Y/n] y

Após executar esses passos executei também o comando sudo /usr/bin/mysql_install_db --user=mysql para inicializar as tabelas necessarias incluindo o diretorio de dados para a correta execução do banco de dados.

Por fim configurei para que o serviço inicialize junto com o boot do sistema operacional executando o comando sudo systemctl enabled mariadb e inicie o serviço para checar se tudo está correto com o comando sudo systemctl start mariadb.

Ao final, executando o comando indicado abaixo para checar o estado do serviço deverá ter uma saída similar à exibida.

root@vps:/home/regis# systemctl status mariadb
● mariadb.service - MariaDB 10.3.32 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-12-24 11:19:52 -03; 1 day 17h ago
       Docs: man:mysqld(8)
             https://mariadb.com/kb/en/library/systemd/
   Main PID: 773 (mysqld)
     Status: "Taking your SQL requests now..."
      Tasks: 35 (limit: 4566)
     Memory: 494.7M
     CGroup: /system.slice/mariadb.service
             └─773 /usr/sbin/mysqld

Dec 24 11:19:50 vps systemd[1]: Starting MariaDB 10.3.32 database server...
Dec 24 11:19:51 vps mysqld[773]: 2021-12-24 11:19:51 0 [Note] /usr/sbin/mysqld (mysqld 10.3.32>
Dec 24 11:19:52 vps systemd[1]: Started MariaDB 10.3.32 database server.

Com o serviço iniciado podemos considerar o MariaDB pronto para ser utilizado nos próximos passos.

PostfixAdmin

O PostfixAdmin é um script PHP que torna a manutenção das caixas de email bem mais facil e prática. Por ser uma aplicação web PHP é necessário que tenhamos já instalado e configurado um servidor WEB que não é o escopo desse manual. Se você não tem um webserver instalado, sugiro seguir os passos dessa publicação na qual mostro a instalação de um servidor WEB com Nginx, Php-fpm, LetsEncrypt e MariaDB e somente depois de ter o servidor configurado é que conseguirá prosseguir com a configuração proposta por esse manual.

Vamos executar o comando abaixo para iniciar a instalação. Este pacote não foi incluido na configuração inicial porque ele inicia um wizard que iremos abordar nos proximos passos.

$ sudo apt install postfixadmin

Ao final do processo de instalação será iniciado um wizard para que possamos configurar o Postfixadmin.

Configuring postfixadmin screenshot

Ao teclar Enter em <Yes> será questionado pela senha de acesso a base de dados. Digite a senha desejada, navegue com a tecla Tab até <Ok> e pressione Enter.

Configuring postfixadmin password confirmation screenshot

Na tela de confirmação da senha, repita-a, navegue até <Ok> e pressione Enter.

Primeiro conecte-se ao MariaDB utilizando o usuario root, que de acordo com nossa definição somente pode ter acesso localmente.

$ sudo mysql

Se tudo estiver certo, você estará no shell do MariaDB e terá uma saída similar ao conteúdo abaixo.

usuario@host:~$ sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 284405
Server version: 10.3.32-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

O próximo passo é criar a base de dados e as tabelas que serão utilizados para armazenar os usuários, as caixas e diversas outras configurações. Você pode utilizar os nomes aqui citados como exemplo ou personalizá-los (aconselhável). Os passos aqui seguem os existentes no arquivo de instalação do manual de instalação do Postfixadmin e como já deve imaginar, vamos precisar configurar o PostfixAdmin para continuar a tarefa.

Vamos criar a base de dados de nome mypostfixconfig.

Nota: Se você não está familiarizado como funciona uma base de dados e usuários em MySQL pode ter alguma dificuldade caso algum dos passos abaixo não funcione de primeira, mas no geral é um processo bem simples e fácil.

MariaDB [(none)]> CREATE DATABASE mypostfixconfig;
Query OK, 1 row affected (0.001 sec)

Após criar a base de dados e as tabelas, criamos um usuário, definimos a senha de acesso e damos permissões adequadas para ele. Note que daremos todas os privilegios sobre a base de dados criada porque será através dele que daremos continuidade à configuração.

MariaDB [(none)]> GRANT ALL PRIVILEGES ON mypostfixconfig.* TO 'mypostfixuser'@'localhost' IDENTIFIED BY '*******';
Query OK, 0 rows affected (0.000 sec)

Após ter criado o usuário, digite exit para desconectar o usuário root.

Agora iremos testar se o usuário criado consegue conectar e enxergar a base. Para isso digite mysql -u mypostfixconfiguser -h localhost -p e em seguida tecle Enter. Entre com a senha definida no comando de criação do usuário e se tudo estiver certo a saída será como a exibida abaixo.

MariaDB [(none)]> mysql -u mypostfixuser -h localhost -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 950396
Server version: 10.3.32-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

Vamos exibir quais as bases de dados que este usuario possui permissão de acesso.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mypostfixconfig    |
+--------------------+
2 rows in set (0.001 sec)

MariaDB [(none)]>

Se a saída exibir a base que criamos nos passos anterios significa que podemos seguir em frente. Caso contrário repita os passos anterioes, de preferencia alterando os nomes da base de dados e do usuario a serem criados.

Dovecot

O Dovecot é responsável por entregar as mensagens trocadas entre MTAs nas caixas que no nosso caso serão do tipo virtuais.

A configuração a seguir fará com que somente usuarios utilizando SSL sejam capazes de se conectar em suas caixas.

Primeiro vamos fazer backup das configurações atuais para que em caso de problemas possamos retornar as versões originais.

$ sudo cp -R /etc/dovecot/conf.d /etc/dovecot/conf.d.orig

O Dovecot irá armazenar as mensagens (e todo o seu contéudo) em um diretório definido em arquivos de configuração e para que que ele possa fazer isso é necessário que esteja executando com um usuário com as permissões apropriadas.

$ groupadd -g 5000 vmail
$ useradd -g 5000 -G mail -u 5000 -d /var/mail vmail

O usuário criado será usado no mecanismo de autenticação e então será por ele que iremos iniciar. Irei utilizar o MariaDB para armazenar as informações de autenticação e para isso será modificado dois arquivos. O primeiro configura o tipo de autenticação e o segundo irá fazer a validação da autenticação.

Edite o arquivo /etc/dovecot/conf.d/10-auth.conf e descomente (ou adicione) as linhas abaixo.

$ vim /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
!include auth-sql.conf.ext

Depois, edite o arquivo /etc/dovecot/conf.d/auth-sql.conf.ext para que contenha as seguintes linhas:

$ vim /etc/dovecot/conf.d/auth-sql.conf.ext


passdb {
  driver = sql
  args = /etc/dovecot/dovecot-mariadb.conf.ext
}

userdb {
  driver = sql
  args = /etc/dovecot/dovecot-mariadb.conf.ext
}

O arquivo /etc/dovecot/dovecot-mariadb.conf.ext que está presente no modelo configura a conexão com a base de dados para que o Dovecot consiga utilizá-lo. Ele não existe ainda e vamos criá-lo no próximo passo. Preste atenção para substituir as informações de dbname, user e password pelas utilizadas no passo da criação da base de dados.

$ vim /etc/dovecot/dovecot-mariadb.conf.ext

driver = mysql
connect = host=localhost dbname=mypostfixdb user=mypostfixdbuser password=**********
default_pass_scheme = SHA512-CRYPT

password_query = SELECT username as user, password, concat('/home/vmail/', maildir) as userdb_home, concat('maildir:/home/vmail/', maildir) as userdb_mail, 'vmail' as userdb_uid, 'mail' as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

user_query = SELECT concat('maildir:/home/vmail/', maildir) as mail, CONCAT('*:messages=10000:bytes=', quota) as quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

É uma boa prática dar uma boa olhada nos exemplos existentes dos programas que instalamos. Se tiver curiosidade sobre cada detalhe das linhas acima dê uma olhada no arquivo /etc/dovecot/dovecot-sql.conf.ext.

Postfix

Conforme já expliquei na publicação feita e que é base para essa, o Postfix é um MTA e faz a ligação entre serviços para troca de mensagens do tipo correio eletrônico.

A versão mais atual do Postfix que está disponível neste fim de 2021, momento em que escrevo este texto, é a 3.6, mas no repositório do Ubuntu está disponível a 3.4 e é a que usarei.

Se chegou até aqui comente pedindo para continuar o tutorial. Isso incentiva a continuar criando conteúdo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.