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 disponíveis, 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-fpmA 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 realiza nenhum controle sobre a nocividade do conteúdo das mensagens, e isso será delegado a um software especializado nisso. Outro fator é que, por padrão, o controle das caixas de correio seria feito através das contas de usuários do Sistema Operacional (instalação padrão), mas usaremos um controle baseado em tabelas no banco de dados, que será configurado por meio do navegador web, o que torna necessário ter um gerenciador de banco de dados e um servidor web previamente instalados.
Configurando o MariaDB
Versão mais recente: 10.6.5
Versão instalada: 10.3.32
Durante a configuração do meu servidor web, tive algumas dificuldades para instalar o MariaDB, 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 defaultsApó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] yDesabilitei 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] yRemovi 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 the question right below:
Remove test database and access to it? [Y/n] yAnd finally I allowed reloading the privileges table by responding with y the next question.
Reload privilege tables now? [Y/n] yAfter executing these steps I also ran the command sudo /usr/bin/mysql_install_db --user=mysql to initialize the necessary tables including the data directory for the correct execution of the database.
Finally, I configured the service to start with the operating system boot by running the command sudo systemctl enabled mariadb and start the service to check if everything is correct with the command sudo systemctl start mariadb.
In the end, running the command indicated below to check the service status should produce an output similar to the one shown.
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.With the service started we can consider MariaDB ready to be used in the next steps.
PostfixAdmin
O PostfixAdmin é um script PHP que torna a manutenção das caixas de email bem mais fácil 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 incluído na configuração inicial porque ele inicia um wizard que iremos abordar nos próximos passos.
$ sudo apt install postfixadminAo final do processo de instalação será iniciado um wizard para que possamos configurar o Postfixadmin.

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.

Na tela de confirmação da senha, repita-a, navegue até <Ok> e pressione Enter.
Primeiro conecte-se ao MariaDB utilizando o usuário root, que de acordo com nossa definição somente pode ter acesso localmente.
$ sudo mysqlSe tudo estiver certo, você estará no shell do MariaDB e terá uma saída semelhante 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 todos os privilégios 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 visualizar a base. Para isso digite mysql -u mypostfixconfiguser -h localhost -p e em seguida pressione Enter. Digite a senha definida no comando de criação do usuário e, se tudo estiver correto, 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 mostrar quais as bases de dados que este usuário 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 mostrar a base que criamos nos passos anteriores significa que podemos seguir em frente. Caso contrário, repita os passos anteriores, de preferência alterando os nomes da base de dados e do usuário 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 usuários 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.origO Dovecot irá armazenar as mensagens (e todo o seu contéudo) em um diretório definido em arquivos de configuração e para 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 vmailO usuário criado será utilizado no mecanismo de autenticação e será por meio dele que iremos iniciar. Irei utilizar o MariaDB para armazenar as informações de autenticação e, para isso, dois arquivos serão modificados. O primeiro configura o tipo de autenticação e o segundo fará 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.extDepois, 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 o banco de dados para que o Dovecot possa utilizá-lo. Ele ainda não existe 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 você chegou até aqui, comente pedindo para continuar o tutorial. Isso incentiva a continuar criando conteúdo.
Deixe um comentário