Pesquisa de site

Como configurar o servidor de correio Postfix e o Dovecot com banco de dados (MariaDB) com segurança - Parte 1


Nesta série de 3 artigos discutiremos como configurar um servidor de e-mail Postfix com antivírus e proteção contra spam em uma caixa CentOS 7. Observe que estas instruções também funcionam em outras distribuições, como RHEL/Fedora e Debian/Ubuntu.

Nosso plano consiste em armazenar contas de e-mail e aliases em um banco de dados MariaDB que para nossa comodidade será gerenciado através do phpMyAdmin.

Se você optar por não instalar o phpMyAdmin, ou estiver lidando com um servidor somente CLI, também forneceremos o código equivalente para criar as tabelas do banco de dados que serão usadas ao longo desta série.

Como manter um servidor de e-mail em funcionamento é uma das tarefas essenciais normalmente atribuídas a administradores e engenheiros de sistema, também forneceremos algumas dicas para executar com eficiência esse serviço crítico em um ambiente de produção.

Crie registros A e MX para domínio em DNS

Antes de prosseguir, existem alguns pré-requisitos que devem ser atendidos:

1. Você precisará de um domínio válido registrado por meio de um registrador de domínios. Nesta série usaremos www.linuxnewz.com, que foi registrado através do GoDaddy.

2. Tal domínio deve estar apontado para o IP externo do seu VPS ou provedor de hospedagem em nuvem. Se você auto-hospedar seu servidor de e-mail, poderá usar o serviço oferecido pelo FreeDNS (requer registro).

De qualquer forma, você também deve configurar registros A e MX para seu domínio (você pode aprender mais sobre registros MX nesta FAQ do Google).

Depois de adicionados, você pode consultá-los usando uma ferramenta on-line como MxToolbox ou ViewDNS para garantir que estejam configurados corretamente.

Importante: Observe que pode demorar um pouco (1-2 dias) até que os registros DNS sejam propagados e seu domínio esteja disponível. Entretanto, você pode acessar o seu VPS através do seu endereço IP para realizar as tarefas indicadas abaixo.

3. Configure o FQDN (nome de domínio totalmente qualificado) do seu VPS:

hostnamectl set-hostname yourhostname

para definir o nome do host do sistema e edite /etc/hosts conforme a seguir (substitua AAA.BBB.CCC.DDD, seu nome de host e seudomínio com o IP público do seu servidor, seu nome de host e seu domínio registrado):

AAA.BBB.CCC.DDD yourhostname.yourdomain.com       yourhostname

onde yourhostname é o nome do host do sistema que foi definido anteriormente usando o comando hostnamectl.

Instalando pacotes de software necessários

4. Para instalar os pacotes de software necessários, como Apache, Postfix, Dovecot, MariaDB, PhpMyAdmin, SpamAssassin, ClamAV, etc, você precisa habilitar o repositório EPEL:

yum install epel-release

5. Depois de seguir as etapas acima, instale os pacotes necessários:

Em sistemas baseados em CentOS:

yum update && yum install httpd httpd-devel postfix dovecot dovecot-mysql spamassassin clamav clamav-scanner clamav-scanner-systemd clamav-data clamav-update mariadb mariadb-server php phpMyAdmin

No Debian e derivados:

aptitude update && aptitude install apache2 postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql spamassassin clamav clamav-daemon clamav-base mariadb-client mariadb-server php5 phpMyAdmin

6. Inicie e ative os servidores web e de banco de dados:

Em sistemas baseados em CentOS:

systemctl enable httpd mariadb
systemctl start httpd mariadb

No Debian e derivados:

systemctl enable apache2 mariadb
systemctl start apache2 mariadb

Quando a instalação for concluída e o serviço acima estiver habilitado e em execução, começaremos configurando o banco de dados e as tabelas para armazenar informações sobre as contas de e-mail Postfix.

Criando banco de dados de contas de correio Postfix

Para simplificar, usaremos o phpMyAdmin, uma ferramenta destinada a administrar bancos de dados MySQL/MariaDB através de uma interface web, para criar e gerenciar o banco de dados de e-mail.

No entanto, para fazer logon e usar esta ferramenta, precisamos seguir estas etapas:

7. Habilite a conta MariaDB (você pode fazer isso executando o utilitário mysql_secure_installation na linha de comando, atribuindo uma senha para o usuário root e definindo as configurações padrão propostas pela ferramenta EXCETO “Proibir login root remotamente?“:

ou de outra forma crie um novo usuário de banco de dados:

MariaDB [(none)]> CREATE USER 'dba'@'localhost' IDENTIFIED BY 'YourPasswordHere';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'dba'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

Proteja o Apache com um certificado

8. Como usaremos um aplicativo Web para gerenciar o banco de dados do servidor de e-mail, precisamos tomar as precauções necessárias para proteger as conexões com o servidor. Caso contrário, nossas credenciais do phpMyAdmin viajarão em texto simples pela rede.

Para configurar o Transport Layer Security (TLS) em seu servidor, siga as etapas descritas na Parte 8 da série RHCE: Implementando HTTPS por meio de TLS usando o Network Security Service (NSS) para Apache antes de prosseguir.

Nota: se você não tiver acesso ao console do servidor você precisará encontrar outra forma de gerar a entropia necessária durante a criação da chave. Nesse caso, você pode considerar instalar rng-tools e executar rngd -r /dev/urandom.

Configurar e proteger o PhpMyAdmin

9. Em /etc/httpd/conf.d/phpMyAdmin.conf (CentOS) ou /etc/phpmyadmin/apache. conf (Debian e derivados), localize todas as ocorrências das seguintes linhas e certifique-se de que elas apontam para o IP público do seu servidor:

Require ip AAA.BBB.CCC.DDD
Allow from AAA.BBB.CCC.DDD

Além disso, desative os aliases padrão e crie um novo para acessar sua página de login do phpMyAdmin. Isso ajudará a proteger o site contra bots e invasores externos que têm como alvo www.seudominio.com/phpmyadmin ou www.seudominio.com/phpMyAdmin.

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /managedb /usr/share/phpMyAdmin

Além disso, adicione a seguinte linha dentro de :

Require all granted

Crie Apache VirtualHost para domínio

10. Certifique-se de que seu domínio esteja adicionado aos sites habilitados. Crie /etc/httpd/sites-available/linuxnewz.com.conf (CentOS) ou /etc/apache2/sites-available/linuxnewz.com (Debian) com o seguinte conteúdo (certifique-se de que DocumentRoot, sites-available e sites-enabled > existem diretórios):

<VirtualHost *:80>
    ServerName www.linuxnewz.com
    ServerAlias linuxnewz.com
    DocumentRoot /var/www/linuxnewz.com/public_html
    ErrorLog /var/www/linuxnewz.com/error.log
    CustomLog /var/www/linuxnewz.com/requests.log combined
    Options Indexes FollowSymLinks
</VirtualHost>

e o link simbólico:

No CentOS:
ln -s /etc/httpd/sites-available/linuxnewz.com.conf /etc/httpd/sites-enabled/linuxnewz.com.conf
No Debian:
a2ensite linuxnewz.com

e pronto.

Configurar banco de dados de e-mail Postfix

11. Agora você pode abrir sua interface phpMyAdmin em https://www.seudominio.com/administradob (observe que gerenciadob< é o alias que configuramos anteriormente para o diretório de dados do phpMyAdmin).

Se isso não funcionar (o que pode ser causado por um atraso na propagação ou falta de configuração dos registros DNS) por enquanto você pode tentar usar o endereço IP público do seu servidor em vez de www.seudominio.com :

De qualquer forma, depois de fazer login no phpMyAdmin você verá a seguinte interface. Clique em Novo na seção esquerda:

Insira um nome para o banco de dados (EmailServer_db neste caso, não há necessidade de selecionar um agrupamento) e clique em Criar:

12. Na próxima tela, escolha um nome para a primeira tabela (onde armazenaremos os domínios que este servidor de e-mail irá gerenciar.

Observe que mesmo nesta série gerenciaremos apenas um domínio, você poderá adicionar mais posteriormente) e o número de campos que deseja nele e clique em Ir. Você será solicitado a nomear e configurar esses dois campos, onde poderá proceder com segurança conforme indicado nas imagens a seguir:

Ao escolher PRIMARY em Index para DomainId, aceite os valores padrão e clique em Ir:

Como alternativa, você pode clicar em Visualizar SQL para ver o código nos bastidores:

CREATE TABLE `EmailServer_db`.`Domains_tbl` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;

Quando estiver pronto, clique em Salvar para confirmar as alterações. Você poderá então clicar em Novo em EmailServer_db para continuar criando tabelas:

13. Agora siga estas etapas para criar o restante das tabelas. Clique na aba SQL e insira o código indicado para cada objeto do banco de dados.

Observe que neste caso optamos por criar a tabela utilizando uma consulta SQL devido aos relacionamentos que devem ser estabelecidos entre as diferentes tabelas:

Usuários_tbl

CREATE TABLE `Users_tbl` ( 
    `UserId` INT NOT NULL AUTO_INCREMENT,  
    `DomainId` INT NOT NULL,  
    `password` VARCHAR(100) NOT NULL,  
    `Email` VARCHAR(100) NOT NULL,  
    PRIMARY KEY (`UserId`),  
    UNIQUE KEY `Email` (`Email`),  
    FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE 
) ENGINE = InnoDB; 

Você deverá receber uma mensagem de confirmação (caso contrário, o phpMyAdmin solicitará erros de sintaxe):

Alias_tbl

CREATE TABLE `Alias_tbl` (
    `AliasId` INT NOT NULL AUTO_INCREMENT, 
    `DomainId` INT NOT NULL, 
    `Source` varchar(100) NOT NULL, 
    `Destination` varchar(100) NOT NULL, 
    PRIMARY KEY (`AliasId`), 
    FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

(Clique em Ir na parte inferior para prosseguir com a criação da tabela).

Até este ponto, você deve ter a seguinte estrutura de banco de dados:

O que significa que você está pronto para começar a adicionar alguns registros na próxima seção.

Criando um domínio Postfix, usuários e aliases

14. Iremos agora inserir os seguintes registros nas três tabelas. As senhas de [email  e [email  serão criptografadas e a instrução INSERT INTO Users_tbl.

Além disso, observe que os e-mails enviados para [email protegido] serão redirecionados para [email protegido]:

INSERT INTO Domains_tbl (DomainName) VALUES ('linuxnewz.com');  
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForFirstEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email ');  
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForSecondEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email ');  
INSERT INTO Alias_tbl (DomainId, Source, Destination) VALUES (1, '[email ', '[email ');

Tendo adicionado nosso domínio, duas contas de usuário e um alias de email, estamos prontos para continuar configurando nosso servidor de email no próximo artigo desta série, onde configuraremos Dovecot e Postfix.

Resumo

Neste artigo listamos os pacotes necessários para instalar um servidor de e-mail Postfix em um VPS CentOS 7 e explicamos como gerenciar o banco de dados subjacente usando phpMyAdmin.

Nos próximos dois artigos revisaremos a configuração dos dois programas que cuidarão da distribuição de e-mails do nosso domínio (Parte 2) e mostraremos como adicionar proteção contra spam e vírus (Parte 2) e mostraremos como adicionar proteção contra spam e vírus (Parte 2) >Parte 3) para o seu servidor.

Até lá, não hesite em contactar-nos através do formulário abaixo se tiver alguma dúvida ou comentário.