Servidor de e-mails no Debian com Dovecot + Postfix + MySQL

Última atualização: 11/30/2013

Este artigo irá explicar como configurar um servidor de e-mails desde o princípio em um ambiente Linux baseado na distribuição Debian. O texto é longo e há muitos passos, mas tentei resumir e explicar o que é mais importante para o funcionamento do serviço. Este passo a passo é baseado em vários artigos que li e por sinal é a solução de e-mails que uso hoje em alguns servidores, as principais referências estão no final do artigo.

O serviço de e-mail é composto por várias aplicações, cada uma com uma função específica, e a configuração do grupo de aplicativos é o maior desafio. Aqui irei abordar desde a configuração do hostname e DNS até a configuração do webmail e espero que ajude a qualquer um que queira montar seu próprio servidor de e-mails e largar de mão serviços gratuitos (que sempre lhe cobram/leem algo, mesmo sem você saber).

Que serviços estão envolvidos?

O funcionamento de um servidor de e-mail depende de vários serviços, e muitos são necessários para garantir uma boa qualidade do serviço, filtrando e identificando por exemplo SPAMs. Abaixo uma lista de aplicações e qual a responsabilidade de cada uma delas.

Postfix: O postfix é responsável por despachar os e-mails através do protocolo SMTP. Sua aplicação de e-mail e os servidores externos irão conectar neste serviço para enviar novos e-mails para sua caixa de e-mail ou encaminhar a outro servidor de e-mails;

Dovecot: O Dovecot é responsável por gerenciar as caixas de e-mail no seu servidor. Quando você conecta sua caixa de e-mail por IMAP ou POP3 é este serviço que estará utilizando. O Postfix também usa o Dovecot para armazenar novos e-mails recebidos;

MySQL: O MySQL é a base de dados utilizada pelo Postfix e Dovecot para armazenar as informações de caixas de domínios, caixas de e-mail e senhas destas caixas de e-mail;

Amavisd-new: Normalmente servidores de e-mail possuem um aplicativo de checagem de vírus e SPAM. O Amavisd-new é a interface entre o MTA (Mail Transfer Agent) e estes filtros. O Postfix encaminha um e-mail recebido ao Amavisd-new e este interage com um ou mais serviços para identificar e marcar possíveis problemas no e-mail.

ClamAV: Este serviço é um famoso anti-virus open source utilizado por muitos servidores para filtrar rapidamente uma grande quantidade de arquivos;

Postgrey: O Postgrey tem como função controlar e-mails suspeitos, os deixando em quarentena até que outros e-mails de mesma origem cheguem ou o tempo de identificação de novos vírus seja atingido. Isto evita que SPAMs ou vírus novos se propaguem rapidamente pela Internet enquanto outros serviços não tem suas assinaturas de vírus atualizadas;

SpamAssassin: O Postfix também usa o serviço do SpamAssassin para detectar com base em pontuação possíveis SPAMs. Este serviço é um dos mais utilizados e possui diversas formas de detecção, desde SPF até análise estatística de palavras suspeitas;

PostfixAdm: Esta aplicação web é usada apenas para gerenciar as caixas de e-mail na base MySQL. É através dela que você fará o cadastro dos domínios e das caixas de e-mail, podendo também criar aliases e limitar as contas;

Roundcube: O Roundcube é a aplicação web utilizada como webmail. Para que os usuários do servidor de e-mail não sejam obrigados a utilizar uma aplicação cliente como Thunderbird ou Outlook;

Apache: O Apache é um servidor web utilizado para servir outros dois serviços, o RoundCube e o PostfixAdm. Junto ao Apache também instalaremos os módulos do PHP, linguagem na qual ambos serviços web foram desenvolvidos;

OpenSSL: Esta aplicação é responsável por gerar os certificados e CSRs utilizados para garantir a criptografia tanto na conexão HTTP como nas conexões SSL/TLS do IMAP, POP e SMTP;

Iptables: Esta aplicação será utilizada para configurar o firewall do servidor.

Note que além destas aplicações todas você precisará configurar o DNS do domínio o qual irá criar as caixas de e-mail. Para tal você pode utilizar qualquer serviço que lhe permita configurar as entradas do tipo A, MX e TXT.

Configurando o ambiente

Como já citei no início do artigo, este tutorial é voltado a distribuição Debian (6 ou 7). Algumas variações devem acontecer em outras distribuições porém não há grandes diferenças, e o Google é seu amigo caso fique preso em algum dos passos. Esta configuração já utilizei para um VPS (Virtual Private Server)) de 512Mb de RAM e um vCore na DigitalOceanopen in new window e acredito que suporta muito bem cerca de 50 contas de médio uso com IMAP, seu limite é apenas o espaço em disco. Em um servidor um pouco melhor como de 2Gb e 8 vCores do Linodeopen in new window você pode muito bem instalar este mail server e configurar várias páginas web de uso moderado sem medo de ter atrasos consideráveis no recebimento de e-mails.

Para começar, você precisa decidir qual será o nome do seu servidor de e-mails. Isto é importante pois você baseará toda sua instalação neste mesmo nome e configurará no DNS dos seus domínios este mesmo nome.

Normalmente domínios como exemplo.com possuem um servidor separado para gerenciar os e-mails, como mail.exemplo.com. Isto é natural visto que o serviço de e-mail é considerado crítico na maioria das empresas, sendo assim é ideal um servidor dedicado a esta função, tanto por segurança quanto por questões de desempenho. No nosso exemplo iremos considerar o nome mail.exemplo.com. Lembre-se que ter um servidor dedicado ou adicionar "mail" ao nome do domínio não é regra, só uma boa prática.

Comece acessando o servidor em modo root, e defina o hostname do servidor com o nome que escolheu para o seu mail server.

echo "mail.exemplo.com" > /etc/hostname
hostname -F /etc/hostname

Note que em alguns serviços de hospedagem seu servidor irá trocar o hostname automaticamente devido ao DHCP instalado por padrão. Para evitar que o hostname mude edite o arquivo /etc/default/dhcpcd e comente a linha onde há algo parecido com SET_HOSTNAME='yes'.

Não esqueça de editar seu arquivo de hosts (/etc/hosts) e de configurar os nomes da própria máquina para o endereço loopback.

127.0.0.1 localhost mail mail.paulo.cc

Este artigo irá armazenar tanto as caixas de e-mail como as aplicações de webmail e configuração de contas em um diretório comum no /var do servidor chamado mailserver. Aproveite e atualize os pacotes instalados no servidor com o apt-get pois precisará instalar várias aplicações nos próximos passos.

mkdir /var/mailserver
apt-get update
apt-get upgrade

Observe que neste tutorial estarei referenciando sempre o domínio exemplo.com e mail.exemplo.com. Substitua estes domínios pelos domínios que você escolheu para seu servidor!

Certificados digitais para a conexão SSL/TLS

Entenda que serviços de e-mails foram desenvolvidos em um tempo onde a preocupação com segurança não era o maior foco. Portanto os protocolos de comunicação comuns como SMTP, IMAP e POP3 não possuem nenhuma criptografia no nível de protocolo em sua implementação inicial, tanto que as senhas são passadas de forma aberta e qualquer usuário mal intencionado pode ler estas senhas. Com o tempo o SSL e o TLS foram desenvolvidos nestes protocolos para garantir um mínimo de proteção.

Neste artigo precisaremos utilizar um conjunto de certificado e chave privada para garantir esta segurança. O ideal seria que você adquirisse um certificado digital em uma autoridade certificadora, da mesma forma que faz com um certificado digital HTTP para o Apache por exemplo, porém isto irá lhe gerar um custo que pode variar entre 10 a 1000 reais dependendo muitas vezes da fama da autoridade certificadora.

Se você já tem um certificado digital SSL para seu servidor web você pode utilizar o mesmo para as configurações de e-mail. O único inconveniente é que você precisa usar o mesmo nome de domínio do seu servidor web para o servidor de e-mail. É claro que você pode também utilizar um certificado wildcard para utilizar em todos os casos, mas aí o valor do certificado é maior ainda.

Para nosso tutorial vamos criar um certificado digital assinado por uma entidade certificadora criada por nós mesmos. Na prática só há dois problemas relacionados a isso. O primeiro é que todos os clientes que conectarem no seu servidor verão uma mensagem de certificado emitido por uma certificadora desconhecida (a famosa tela vermelha ou o aviso para confirmar a exceção de segurança, que há um risco). E o segundo é que certificados deste tipo não servem muito bem para conexões iniciadas em SSL/TLS.

Há três formas de um cliente conectar ao serviço de SMTP/IMAP/POP3:

  • Insegura: Quando o cliente conecta e não pede por criptografia da conexão, deixando tudo se passar em conexão de texto puro, onde qualquer um pode ler a informação enviada;

  • Segura por STARTTLS: Que se parece muito com a insegura no início da conexão, porém logo que conecta pede por um "upgrade" na conexão. Nesta situação o cliente conecta como no primeiro caso e antes de enviar qualquer dado sensível o cliente solicita o início da comunicação criptografada (pelo comando STARTTLS);

  • Segura por SSL/TLS: Onde o cliente já conecta o servidor requisitando uma conexão 100% criptografada. Neste caso o servidor já inicia o processo de conexão enviando os dados de certificado com a chave pública para criptografia por parte do cliente;

O último método com certeza é o mais seguro, porém exige que o certificado digital tenha uma autoridade válida. Você pode tentar gerar certificados e instalar em todas as máquinas, porém ainda precisará distribuir os certificados para todos que usarem o servidor. Nesta situação o ideal é adquirir um certificado digital de uma autoridade certificadora. Neste artigo iremos garantir que ocorra pelo menos o nível de segurança do STARTTLS que em todo caso é suficiente para garantir que ninguém roube sua senha de e-mail. Para tal utilize os seguintes comandos para gerar um certificado que permite assinar outros certificados e também criar um certificado assinado por esta certificadora.

# Você precisará informar o nome do seu servidor de e-mail (exatamente igual) quando a seguinte
# pergunta for feita:
# Common Name (e.g. server FQDN or YOUR name) []
# No nosso caso preencheriamos com mail.exemplo.com
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
	-keyout /etc/ssl/private/mail.exemplo.com.key \
	-out /etc/ssl/certs/mail.exemplo.com.crt

# Ajustamos as permissões
chmod 600 /etc/ssl/private/mail.exemplo.com.key
chmod 600 /etc/ssl/certs/mail.exemplo.com.crt

Configurando o Apache+MySQL+PHP

Para instalar os pacotes necessários execute o comando seguinte. Em algum momento será solicitado que preencha uma senha para o usuário root do banco de dados, não perca esta senha!

apt-get install apache2 php5 php5-cli mysql-server php5-curl php5-gd php5-imap php5-mcrypt php5-mysql php5-intl

Ajustes finos no PHP

Após instalar todos os pacotes recomendo ajustar alguns parâmetros no PHP. Edite o arquivo /etc/php5/apache2/php.ini ajustando os seguintes valores.

# Ajuste e mamória máxima que pode ser utilizada pelas aplicações web
memory_limit = 128M
# Ajuste o tamanho máximo do arquivo aceito pelo PHP. Importante para que o webmail aceite
# anexos maiores que 2MB
upload_max_filesize = 16M
post_max_size = 16M
# Ajuste básicos de segurança, para não identificar que você roda PHP no servidor
expose_php = Off
# Ajuste para não perder a sessão o tempo todo (tempo em segundos)
session.gc_maxlifetime = 21600
# Ajuste de fuso horário
# Lista de timezones http://php.net/manual/en/timezones.php
date.timezone = America/Sao_Paulo

Configuração do Virtualhost no Apache

Será preciso ativar alguns módulos do Apache para que o webmail funcione e o servidor aceite conexões HTTPS. Para tal ative tanto o módulo rewrite, que permite que URLs sejam sobrescritas como o módulo ssl.

a2enmod rewrite ssl

No Apache também recomendo ajustar alguns parâmetros de segurança, evitando que identifiquem qual é a versão e tecnologia usada. Para tal edite o arquivo /etc/apache2/conf.d/security e ajuste os dois parâmetros abaixo.

ServerTokens Prod
ServerSignature Off

Após precisamos criar um Virtualhost para o webmail e também para o aplicativo usado para gerar as contas de e-mail. Crie um novo arquivo de texto chamado de mailserver dentro pasta de virtualhosts (/etc/apache2/sites-available/mailserver) e insira o seguinte conteúdo.

<VirtualHost *:80>
    ServerAdmin seuemail@exemplo.com
    ServerName mail.exemplo.com
    DocumentRoot /var/mailserver/webmail
    <Directory /var/mailserver/webmail>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error-mailserver.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access-mailserver.log combined
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
    # Se possuir um IP específico comente a linha acima e descomente abaixo
    # Ajustando o IP
    #<VirtualHost 1.2.3.4:443>
        ServerAdmin seuemail@exemplo.com
        ServerName mail.exemplo.com
        DocumentRoot /var/mailserver/webmail
        <Directory /var/mailserver/webmail>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error-mailserver.log
        CustomLog ${APACHE_LOG_DIR}/ssl-mailserver.log combined
        SSLEngine on
        # Caminhos para os dados de certificado
        SSLCertificateFile    /etc/ssl/certs/mail.exemplo.com.crt
        SSLCertificateKeyFile /etc/ssl/private/mail.exemplo.com.key
        # Em alguns casos é preciso ajustar os certificados de cadeia ou de autoridade,
        # verifique com sua certificadora os detalhes
        #SSLCACertificateFile /etc/ssl/certs/cacert.pem
        #SSLCertificateChainFile /path/to/my/ca-bundle.crt
        # Ajustes para o Internet Explorer
        BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>
</IfModule>

Em alguns casos é necessário configurar também o ServerName e instruir o apache de forma que ele use virtualhosts para os domínios. Para isso edite o arquivo /etc/apache2/ports.conf e ajuste conforme o conteúdo a seguir:

ServerName mail
NameVirtualHost *:80
Listen 80
<IfModule mod_ssl.c>
    # Se possuir mais de um IP na máquina e quiser usar um específico para o SSL
    # Não esqueça de ajustar o IP no arquivo do virtualhost e descomentar a linha abaixo
    # e comentar a liga abaixo dela
    # NameVirtualHost 1.2.3.4:443
    NameVirtualHost *:443
    # Nota: Clientes com Windows XP não suportam SNI e portanto você não pode usar um
    # mesmo IP para mais de um virtualhost!
    Listen 443
</IfModule>

Não esqueça de criar a pasta do webmail e ativar o virtualhost criado.

mkdir /var/mailserver/webmail
a2ensite mailserver
/etc/init.d/apache2 restart

Ajustes no MySQL e bases de dados

Após configurar os domínios e o PHP você precisa ajustar algumas configurações do MySQL, recomendo editar o arquivo /etc/mysql/my.cnf e comentar a linha do bind-address e também evitar que o MySQL consulte o nome de todos os clientes que consultam o banco de dados, adicionando o skip-name-resolv.

#bind-address           = 127.0.0.1
skip-name-resolv

Não esqueça de reiniciar o banco de dados para que ele carregue as configurações. Aproveite para conectar o banco de dados e criar a base de dados que armazenará as preferências do webmail e as próprias contas de e-mail.

/etc/init.d/mysql restart
mysql -uroot -p # Utilize a senha que inseriu na instalação do banco de dados

Após digitar a senha um terminal do MySQL irá abrir. Execute o SQL abaixo para criar tanto as bases como os usuários. Lembre-se do usuário, senha, e nome dos bancos. Você precisará destas informações nas configurações dos demais aplicativos.

CREATE DATABASE mail;
GRANT ALL ON mail.* TO 'mail'@'127.0.0.1' IDENTIFIED BY 'mailpass';
CREATE DATABASE roundcube;
GRANT ALL ON roundcube.* TO 'roundcube'@'127.0.0.1' IDENTIFIED BY 'roundpass';
FLUSH PRIVILEGES;

Configurando o Dovecot

O Dovecot cria uma determinada estrutura de pastas e arquivos para armazenar os e-mails no disco rígido. Porém é preciso criar as pastas básicas e criar um usuário específico do Linux. Note o UID 150 informado no comando useradd, é importante usar um UID não existente, caso não queira informar anote o UID criado pois você precisará dele para as configurações de segurança dos próximos passos.

mkdir /var/mailserver/vmail
useradd -r -u 150 -g mail -d /var/mailserver/vmail -s /sbin/nologin -c "Mailserver dir" vmail
chmod 770 /var/mailserver/vmail
chown vmail:mail /var/mailserver/vmail

Agora que criamos as pastas, você precisa usar o apt-get mais uma vez para baixar todos os pacotes relacionados ao Dovecot, aproveite para instalar os pacotes do Postfix, ClamAV, Amavis e SpamAssassin.

apt-get install postfix postfix-mysql dovecot-mysql dovecot-imapd postgrey amavis clamav clamav-daemon spamassassin libnet-dns-perl \
   pyzor razor arj bzip2 cabextract cpio file gzip nomarch pax unzip zip

Durante a instalação do pacote do Postfix você será questionado quanto ao tipo de mail server que estará configurando, selecione Internet Site. Também será questionado sobre o nome do mail server, digite no campo o seu hostname.

Opção internet no Postfix

Após instalar os pacotes recomendo ajustar as permissões da pasta do Dovecot para que o usuário vmail (que criamos anteriormente) possa ler estas informações também.

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Agora o processo mais trabalhoso começa, você precisará criar/editar os arquivos de configuração do módulo SQL do Dovecot, para que ele leia os domínios e caixas de e-mail do banco de dados que criamos anteriormente. O primeiro passo é criar o arquivo /etc/dovecot/conf.d/auth-sql.conf.ext e preenche-lo com o seguinte conteúdo. Este arquivo irá definir os arquivos que contêm as Querys de banco para usuários e senhas.

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

O arquivo que referênciamos agora precisa ser criado. Crie /etc/dovecot/dovecot-sql.conf.ext e preencha com as informações abaixo. Note que neste arquivo precisamos passar o usuário e senha do banco de dados mail, que criamos anteriormente. Caso você tenha trocado a pasta das caixas de e-mail você também precisará ajustar as Querys de acordo.

driver = mysql
connect = host=localhost dbname=mail user=mail password=mailpass
default_pass_scheme = MD5-CRYPT
password_query = \
  SELECT username as user, password, '/var/mailserver/vmail/%d/%n' as userdb_home, \
  'maildir:/var/mailserver/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
  FROM mailbox WHERE username = '%u' AND active = '1'
user_query = \
  SELECT '/var/mailserver/vmail/%d/%n' as home, 'maildir:/var/mailserver/vmail/%d/%n' as mail, \
  150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'

Com as Querys configuradas precisamos alterar algumas configurações no arquivo /etc/dovecot/conf.d/10-auth.conf. Neste arquivo você pode configurar várias definições de autenticação do Dovecot. Por enquanto só altere as informações citadas abaixo. Não substitua o arquivo inteiro.

disable_plaintext_auth = yes
auth_mechanisms = plain login

# Comente a autenticação do auth-system e habilite a autenticação por sql
# !include auth-system.conf.ext
!include auth-sql.conf.ext

Agora você precisa ajustar as configurações de segurança do Dovecot, para que ele use apenas os arquivos que estão nas caixas de e-mail dele. Edite o arquivo /etc/dovecot/conf.d/10-mail.conf e ajuste os parâmetros abaixo.

mail_location = maildir:/var/mailserver/vmail/%d/%n
mail_uid = vmail
mail_gid = mail
# lembre-se do uid usado na criação do usuário vmail
first_valid_uid = 150
last_valid_uid = 150

O Dovecot irá servir também conexões criptografadas, para que isso aconteça corretamente você precisa configurar o arquivo /etc/dovecot/conf.d/10-ssl.conf, ajustando os caminhos para os certificados que criamos no início do artigo. Caso você tenha um certificado intermediário provido pela sua autoridade certificadora não se esqueça de configurar o ssl_ca. Este arquivo pode ser tanto um arquivo .pem como um .crt.

ssl = yes
ssl_cert = </etc/ssl/certs/mail.exemplo.com.crt
ssl_key = </etc/ssl/private/mail.exemplo.com.key
# Certificado com senha, descomente e preencha a linha abaixo
#ssl_key_password =
# Certificado intermediário, descomente e preencha a linha abaixo
#ssl_ca = </etc/ssl/certs/cacert.pem
ssl_verify_client_cert = no

Ajuste o arquivo /etc/dovecot/conf.d/10-master.conf para que o Postfix possa consultar as caixas de e-mail. Verifique o trecho onde há o service auth e substitua apenas o conteúdo deste bloco.

service auth {
    unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = mail
    }
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

A última configuração necessária do Dovecot é o e-mail do postmaster. Caso você não ajuste este parâmetro é bem provável que tenha vários erros a cada recebimento de e-mail /etc/dovecot/conf.d/15-lda.conf.

postmaster_address = postmaster@exemplo.com

Quanto ao Dovecot, era isso pelo momento. O próximo passo é configurar o Postfix.

Configurando o Postfix

O Postfix também precisa que todas as SQLs responsáveis pelo mapeamento de caixas e e-mails sejam configuradas. Para isso edite os seguintes arquivos. Note que todos eles precisam do usuário, senha e nome da base mail que criamos anteriormente. Você pode substituir o conteúdo destes arquivos completamente caso eles já existam.

Arquivo /etc/postfix/mysql_virtual_alias_domainaliases_maps.cf

user = mail
password = mailpass
hosts = 127.0.0.1
dbname = mail
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

Arquivo /etc/postfix/mysql_virtual_alias_maps.cf

user = mail
password = mailpass
hosts = 127.0.0.1
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

Arquivo /etc/postfix/mysql_virtual_domains_maps.cf

user = mail
password = mailpass
hosts = 127.0.0.1
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Arquivo /etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf

user = mail
password = mailpass
hosts = 127.0.0.1
dbname = mail
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

Arquivo /etc/postfix/mysql_virtual_mailbox_maps.cf

user = mail
password = mailpass
hosts = 127.0.0.1
dbname = mail
table = mailbox
select_field = CONCAT(domain, '/', local_part)
where_field = username
additional_conditions = and active = '1'

O Postfix também pode realizar uma limpeza de cabeçalhos no seu e-mail. Sempre que você envia um e-mail as aplicações costumam adicionar vários cabeçalhos identificando a aplicação que você usa de e-mails e o IP da sua máquina. Na configuração do Postfix iremos configurar para que alguns destes cabeçalhos sejam removidos, para tal crie o arquivo /etc/postfix/header_checks e adicione o seguinte conteúdo.

/^Received:/                 IGNORE
/^User-Agent:/               IGNORE
/^X-Mailer:/                 IGNORE
/^X-Originating-IP:/         IGNORE

Agora vamos para as configurações do Postfix de fato. Há muitos parâmetros ajustáveisopen in new window, porém recomendo editar os seguintes no /etc/postfix/main.cf. Irei explicar brevemente os mais importantes através de comentários.

# O banner é a mensagem apresentada quando algum usuário conecta na porta do Postfix
smtpd_banner = $myhostname ESMTP $mail_name
# Desative o biff, visto que nenhum usuário usará o e-mail diretamente pelo bash
biff = no

# Desative a adição automática de e-mail, pois vamos servir mais de um domínio
append_dot_mydomain = no

# Integração com o Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes

# Configurações de SSL/TLS
# Configure aqui exatamente os certificados que você criou anteriormente e que foram configurados no dovecot
smtpd_tls_cert_file=/etc/ssl/certs/mail.exemplo.com.crt
smtpd_tls_key_file=/etc/ssl/private/mail.exemplo.com.key
#smtpd_tls_CAfile=/etc/ssl/certs/cacert.pem
smtpd_use_tls=yes
smtpd_tls_security_level = may
smtp_tls_security_level = may

# Algumas configurações adicionais do SSL/TLS, é importante pelo menos deixar o loglevel = 1 durante a instalação
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

# Configuramos quais são os filtros usados para restringir o recebimento de e-mail
# Note que há inclusive o endereço do Postgrey (na porta 10023)
smtpd_relay_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit

smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit


# Configuramos quais são os filtros usados para restringir quem pode conectar ao servidor
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit

# Configuramos quais são os filtros usados para restringir quem envia e-mail
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit

# Restrições baseadas no contexto de quem já está conectado ao servidor
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org

# Restrições de filtragem de acordo com o conteúdo do e-mail
smtpd_data_restrictions = reject_unauth_pipelining


# Algumas configurações de timeout
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
smtp_helo_timeout = 60s
smtpd_recipient_limit = 16
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12

# Algumas configurações de segurança
smtpd_helo_required = yes
smtpd_delay_reject = yes
disable_vrfy_command = yes


# Configuração de hostname e nome de origem
myhostname = mail.exemplo.com
myorigin = /etc/hostname

# Configuração de destino (se você tiver erros, preencha "." ou deixe vazio)
mydestination = localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
mynetworks_style = host

# Configurações de pastas e dos arquivos que permitem a leitura de domínios e caixas de e-mail
virtual_mailbox_base = /var/mailserver/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_uid_maps = static:150
virtual_gid_maps = static:8
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

# Indicamos quem irá armazenar os e-mails
virtual_transport = dovecot

# Indicamos qual é o filtro de e-mail usado para antivírus e detecção de SPAM
content_filter = amavis:[127.0.0.1]:10024

# Indicamos o arquivo de cabeçalhos que iremos remover
header_checks = regexp:/etc/postfix/header_checks

# Indicamos que o Postfix não deve adicionar o cabeçalho com o nome da caixa de e-mail que enviou o e-mail
enable_original_recipient = no

Você precisará editar também o arquivo /etc/postfix/master.cf. Este arquivo configura todos os processos que devem ser usados pelo Postfix para gerenciar o recebimento e envio de e-mails. Recomendo que faça um backup do arquivo original para consultar posteriormente e substitua todo o arquivo com o seguinte conteúdo.

# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================

# SMTP na porta 25
smtp      inet  n       -       -       -       -       smtpd

# SMTP com STARTTLS na porta 587
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_enforce_tls=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_tls_security_options=noanonymous

# SMTP com SSL/TLS na porta 465
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous

# Outros processos relacionados a limpeza da fila de e-mails e filtragens
pickup    fifo  n       -       -       60      1       pickup
  -o content_filter=
  -o receive_override_options=no_header_body_checks
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache

# Configuração da interface com o maildrop/sendmail
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

# Configuração da interface com o UUCP (se desejável)
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)

# Outros métodos de envio de e-mail
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

# Integração com o Amavis e o SpamAssassin
amavis      unix    -       -       -       -       3       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

# Integração com o Dovecot
dovecot      unix   -        n      n       -       -   pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)

As opções usadas neste arquivo sobrescrevem as configurações do arquivo principal. Portanto caso mude algo no arquivo de configuração e o parâmetro não parece ter efeito, verifique aqui se o parâmetro não foi sobrescrito.

Configurando o Amavis, ClamAV e o SpamAssassin

A configuração destes três aplicativos é bem mais simples comparadas as configurações do Dovecot e Postfix. Para iniciar adicione os usuários do clamav e amavis aos grupos de cada um deles.

adduser clamav amavis
adduser amavis clamav

Edite o arquivo /etc/amavis/conf.d/15-content_filter_mode para indicar ao Amavis quais são as filtragens que ele deve realizar.

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

O Amavis também vai precisar consultar os domínios existentes no servidor. Edite o arquivo /etc/amavis/conf.d/50-user para ajustar o acesso ao banco de dados, indicar qual é o número máximo de processos paralelos e a pontuação de SPAM necessária (feita pelo SpamAssassin) para que o filtro adicione os cabeçalhos de pontuação. Neste caso colocamos um valor negativo para que o cabeçalho esteja sempre disponível.

# Número de processos
$max_servers  = 3;

# Nível que irá apresentar
$sa_tag_level_deflt  = -9999;
# Nível no qual irá considerar SPAM
$sa_tag2_level_deflt = 5;
# Sem isso nem todos os e-mails serão analisados
@local_domains_maps = ['.'];

@lookup_sql_dsn = (
    ['DBI:mysql:database=mail;host=127.0.0.1;port=3306',
     'mail',
     'mailpass']);
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';

# $log_level = 2; # Nível de log, em produção deixe comentado

O SpamAssassin já está configurado para integrar com os outros aplicativos, basta editar o arquivo /etc/default/spamassassin para que o processo seja ativado e a rotina que atualiza as tabelas de probabilidade de SPAM sejam atualizadas automaticamente.

ENABLED=1
CRON=1

Reiniciando os serviços

Após toda a instalação reinicie todos os serviços que configuramos.

service postfix restart
service spamassassin restart
service clamav-daemon restart
service amavis restart
service dovecot restart

Caso observe algum erro, verifique os arquivos /var/log/mail.log e /var/log/mail.err.

Instalando o PostfixAdm

Agora que todas as aplicações já foram configuradas podemos instalar o gerenciador de caixas de e-mail. Esta ferramenta open source é muito prática e basicamente gerencia as tabelas que foram criadas na base mail.

cd /var/mailserver/webmail
wget 'http://bit.ly/1b7p2Cu' -O postfix.tar.gz
tar xvzf postfix.tar.gz
mv postfixadmin-2.3.6/ postfixadm
rm postfix.tar.gz

Você precisará configurar alguns parâmetros no arquivo /var/mailserver/webmail/postfixadm/config.inc.php para que a aplicação conecte a base de dados corretamente.

$CONF['configured'] = true;
$CONF['setup_password'] = ''; // Deixe vazio por enquanto
$CONF['postfix_admin_url'] = 'http://mail.exemplo.com/postfixadm';
$CONF['admin_email'] = 'root@mail.exemplo.com';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'mailpass';
$CONF['database_name'] = 'mail';

Entre em http://mail.exemplo.com/postfixadm/setup.php e digite algo no campo setup password (esta senha será útil apenas na instalação do PostfixAdm) e clique em criar administrador. Copie o Hash que será informado na tela e cole no parâmetro $CONF['setup_password'] conforme instruções.

Chave de configuração do PostfixAdm (use a sua chave, esta é apenas um exemplo)

Volte a página de setup (dê um F5 se já estiver nela) e crie o usuário administrador. Através deste usuário é que você poderá configurar os domínios e caixas de e-mail em http://mail.exemplo.com/postfixadm/login.php.

Acesse a URL de login e configure o domínio em Dominios > Adicionar. Depois clique em Virtual > Criar conta de e-mail para configurar sua primeira conta de e-mail.

Por segurança apague o arquivo setup.php, evitando assim que qualquer outro usuário tente configurar a conta de administrador.

rm /var/mailserver/webmail/postfixadm/setup.php

Instalando o Roundcube

Para instalar o Roundcube o processo é simples. Baixe a versão atual e descompacte na pasta do webmail. Os comandos abaixo podem variar caso a versão do Roundcube seja outra (que não a 0.9.5).

cd /var/mailserver/webmail
wget 'http://bit.ly/1c4eAtb' -O roundcube.tar.gz
tar xvzf roundcube.tar.gz
mv roundcubemail-0.9.5/* .
mv roundcubemail-0.9.5/.htaccess .
rm -rf roundcubemail-0.9.5/ roundcube.tar.gz
chown www-data:www-data temp/ logs/
mysql -u roundcube -p -D roundcube < SQL/mysql.initial.sql

Acesse http://mail.exemplo.com/installer/ e verifique se há algum detalhe faltando na configuração do servidor. Não se preocupe com bases, você precisará apenas do MySQL.

Apenas o banco MySQL é necessário

No próximo passo configure o SMTP/IMAP e banco de dados.

Ajuste as configurações de SMTP

Ajuste os parâmetros do IMAP

Ajuste os parâmetros do banco de dados

Após as configurações clique em Create config. Será apresentada uma tela com dois arquivos de configuração. Crie e preencha ambos arquivos com os respectivos conteúdos apresentados na tela.

No caso edite o arquivo /var/mailserver/webmail/config/main.inc.php e /var/mailserver/webmail/config/db.inc.php. E depois de salvar ambos arquivos você já pode apagar a pasta do instalador do Roundcube, ela não é mais necessária.

rm -rf /var/mailserver/webmail/installer/

Garantindo o uso do HTTPS

Para garantir que nenhum usuário acesse o webmail sem estar em ambiente seguro (já que configuramos o SSL para HTTPS no passo de configuração do Apache) edite o arquivo /var/mailserver/webmail/.htaccess e adicione o seguinte conteúdo ao início do arquivo.

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*) https://mail.exemplo.com/$1 [L]

Este redirecionamento forçará sempre o usuário a usar a porta 443 do Apache quando entrar no webmail. O que é o ideal, assim evitamos que um usuário desavisado tenha sua senha roubada por algum usuário mal intencionado.

Configurações de Firewall

Recomendo também a configuração de um Firewall, você pode ver o esquema de um Firewall básico aquiopen in new window. E adicionar regras para liberar as portas importantes do serviço de e-mail. Nesta configuração que realizamos teremos as seguintes portas:

  • 25 (SMTP): Porta de envio de e-mail sem criptografia;

  • 80 (HTTP): Porta do servidor web, usada para acessar o Roundcube e o PostfixAdm sem criptografia;

  • 110 (POP3): Porta do serviço POP3, usada normalmente para baixar e remover os e-mails baixados de uma caixa de e-mail, sem criptografia;

  • 143 (IMAP): Porta do serviço IMAP, usada normalmente para consultar as caixas de e-mail, sem realizar o download e remoção dos e-mails baixados, com criptografia opcional por STARTTLS;

  • 443 (HTTPS): Porta do servidor web, criptografada;

  • 465 (SMTPS): Porta de envio de e-mails com camada de criptografia obrigatória por SSL/TLS;

  • 587 (SMTP/SMTPS): Porta de envio de e-mail com camada de criptografia opcional por STARTTLS;

  • 993 (IMAPS): Porta do serviço IMAP, com camada de criptografia obrigatória por SSL/TLS;

  • 995 (POP3S): Porta do serviço POP3, com camada de criptografia obrigatória por SSL/TLS;

As regras do Iptables para liberar estas portas estão a seguir.

iptables -A INPUT -p tcp -m multiport --destination-ports 80,443 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --destination-ports 25,110,143 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --destination-ports 443,465,587,993,995 -j ACCEPT

Observação importante sobre a porta 25: O Antispam.br indica que os provedores de Internet residenciais bloqueiem o acesso a porta 25 dos servidores, em uma medida para diminuir o uso de bots e ferramentas mal intencionadas que geram SPAM (veja mais aquiopen in new window). Porém você não deve de forma alguma bloquear esta porta no seu Firewall. Caso você o faça poderá ter problemas no recebimento por parte de muitos domínios.

Configurações de DNS

Após toda a configuração do servidor ainda é importante configurar um serviço fora do seu servidor de e-mails. Neste caso o DNS. Este é responsável por indicar que seu servidor de e-mails para o domínio configurado no PostfixAdm (exemplo.com) é o mail.exemplo.com.

A primeira coisa que você deve fazer é configurar a entrada A e AAAA (se disponível IPv6) para o mail.exemplo.com. Recomenda-se usar uma entrada A ao invés de uma entrada CNAME por questões de verificação de antispam. Além desta configuração, você precisará configurar o DNS reverso.

O DNS reverso é configurado através de uma entrada PTR, porém estas entradas só a empresa que lhe disponibilizou o IP pode configurar. É neste passo que algumas pessoas enfrentam problemas. Em provedores de serviço como Linode e DigitalOcean você possui uma opção no painel de controle para configurar você mesmo o nome do servidor. Em provedores como a Amazon AWS você precisará enviar um formulário requisitando a alteração do nome. Se você está tentando configurar um servidor em uma conexão ADSL com IP dinâmico você pode esquecer, seu provedor não irá atribuir um nome para seu IP.

Quando um serviço de e-mail recebe um e-mail informando que é de determinado IP com determinado domínio o servidor que recebeu o e-mail pode realizar uma consulta de DNS reverso, para tentar identificar o nome do seu servidor e associa-lo a uma lista de servidores "limpos" ou "sujos", caracterizando como e-mail legítimo ou SPAM. Por isso é importante configurar o DNS reverso.

Após configurar o domínio exemplo.com no PostfixAdm você deve criar uma entrada MX neste domínio para o endereço mail.exemplo.com. Normalmente junto a esta configuração você terá a opção de definir um número relacionado a prioridade. Esta prioridade faz mais sentido quando você tem mais de um servidor de e-mails para um mesmo domínio (quando usar um servidor de backup) e quanto menor o valor, mais prioridade ele terá. Normalmente se usar apenas um servidor de e-mail configure com a prioridade 10.

Outra configuração muito importante para evitar que seus e-mails sejam caracterizados como SPAM é a configuração de uma entrada TXT chamada SPF. Esta entrada nada mais é que uma entrada TXT com um conteúdo similar ao informado abaixo.

"v=spf1 mx ip4:111.222.333.444 ip6:2600:aaaa::bbbb:cccc:dddd:eeee/64 a:exemplo.com -all"

Não vou explicar aqui a sintaxe do SPF pois é um pouco longa, você pode consultar EL{http://antispam.br/admin/spf/{a documentação completa do SPF no site do Antipam.br}LE. Basicamente o que indicamos acima é que se qualquer servidor de e-mail receber um e-mail do domínio onde este SPF está configurado, ele poderá confiar nos servidores MX configurados, ou no IPv4 indicado, ou no IPv6 indicado, ou ainda no IP do servidor exemplo.com. Caso contrário ele deverá considerar SPAM (-all).

Lembre-se que qualquer alteração de DNS que fizer você pode estar sujeito a esperar de 2 a 48 horas até que as regras de DNS propaguem pelos servidores de DNS. Então tente configurar certo de primeira =].

Testando o envio e recebimento de e-mails

Com tudo configurado, hora de testar o envio e recebimento de e-mails. Acesse https://mail.exemplo.com e faça login com o e-mail completo e a senha que você configurou quando criou a conta no PostfixAdm.

Tente enviar um e-mail para uma conta do Gmail ou de um e-mail que você já possui e verifique se o e-mail chega adequadamente. Depois tente fazer o processo reverso, respondendo o e-mail em questão. Caso veja alguma mensagem de erro ou o e-mail não chegue, tente observar os logs de erro. Com certeza eles lhe darão a pista do que está errado, se não lhe der exatamente o ponto que está falhando.

Você também pode tentar configurar o seu e-mail no Gmail ou no Thunderbird/Outlook. Mas preste atenção nos endereços usados e o tipo de criptografia. Caso não tenha configurado um certificado válido ou tenha algum bloqueio de Firewall você pode perder muito tempo tentando configurar o e-mail com SSL/TLS, use o STARTTLS.

Resolvendo problemas

Dê uma olhada nos logs, eles podem lhe ajudar a identificar qualquer problema. O mail.log lhe expõe exatamente o que acontece com os e-mails recebidos ou enviados, indicando inclusive a mensagem que o servidor destino enviou quando aceitou o e-mail enviado.

tail -f /var/log/mail.log /var/log/mail.err

Todos os e-mails enviados que estão pendentes de envio para outro servidor ficam na fila de envio chamada "mailqueue". Para ver esta fila use o comando mailq no servidor.

Caso faça algum ajuste no postfix você pode forçar o reenvio dos e-mails na fila usando o comando sendmail -v -q.

Referências

Este artigo foi baseado principalmente nos artigos de ExRationeopen in new window e Flurdyopen in new window, que possui um dos artigos mais completos que já ví relacionados a servidores de e-mail baseados em Postfix.

Com certeza você encontrará outros tutoriais interessantes por aí caso não queira usar o Postfix ou o Dovecot. Na biblioteca do Linodeopen in new window há vários tutoriais.