Servidor de Email · 4 min read · Oct 13, 2025

Configurando Um Servidor de Email Usando Exim4, Clamav, Dovecot, SpamAssassin E Muitos Outros No Debian Lenny

Configurando Um Servidor de Email Usando Exim4, Clamav, Dovecot, SpamAssassin E Muitos Outros No Debian

Este howto descreve uma maneira de construir uma plataforma de email escalável, segura e com todos os recursos. Ele oferece hospedagem virtual de caixas de correio no formato maildir com suporte para quotas e filtragem do lado do servidor, alias de domínio, alias de endereço, encaminhamento de endereço e endereços catchall. O revezamento é protegido com STARTTLS e SMTP-AUTH. Os emails recebidos são verificados quanto a vírus, spam e verificados contra a política SPF e DNSBL.

Para alcançar a escalabilidade, a configuração será dividida em 3 servidores:

  • 1 servidor MX, onde a maioria dos recursos de segurança está (faramir.middle.earth)
  • 1 relay SMTP, para permitir que os usuários enviem emails para o mundo exterior (ectelion.middle.earth)
  • 1 servidor Mailstore, onde a caixa de correio está (denetor.middle.earth)

Claro que mais MX podem ser adicionados usando registros DNS MX para seus domínios, mais servidores relay podem ser adicionados usando round-robin DNS, e mais armazenamentos de email podem ser adicionados usando mecanismos descritos neste howto. Por outro lado, você pode facilmente mesclar a parte MX e relay, ou a parte relay e mailstore. Mesclar MX e mailstore envolve algumas modificações.

Nota Preliminar

Neste howto, assumiremos que você tem um servidor Debian funcionando. Além disso, o sudo deve estar instalado nos sistemas e você deve ser um sudoer.

Configurando LDAP

As informações dos usuários serão armazenadas em um diretório LDAP. Aqui, instalaremos no servidor relay.

Primeiro, vamos instalar os pacotes necessários:

 sudo apt-get install slapd ldap-utils

Para o tutorial, usaremos os seguintes parâmetros LDAP:

ldapBase: dc=middle,dc=earth

adminDn: cn=admin,dc=middle,dc=earth

adminPwd: thirdAge

Além disso, usaremos um esquema LDAP específico. A maioria dos atributos e objetos são padrões, exceto um ou dois. Cuidado: como há muitos atributos padrão, você terá que garantir que nenhum deles esteja definido duas vezes.

Então, vamos adicionar o esquema no openldap em /etc/ldap/schema/mailMEO.schema:

 attributetype ( 2.16.840.1.113730.3.1.13   
    NAME 'mailLocalAddress'   
    DESC 'Endereço de email RFC822 deste destinatário'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.16   
    NAME 'mailQuota'   
    DESC 'Quantidade máxima de espaço em disco para uma caixa de correio em kilobytes'   
    EQUALITY integerMatch   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )   
  
attributetype ( 2.16.840.1.113730.3.1.18   
    NAME 'mailHost'   
    DESC 'FQDN do SMTP/MTA deste destinatário'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}   
    SINGLE-VALUE )   
  
attributetype ( 2.16.840.1.113730.3.1.22   
    NAME 'mailCopyAddress'   
    DESC 'Endereço de cópia sombra RFC822'   
    EQUALITY caseIgnoreIA5Match   
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.47   
    NAME 'mailRoutingAddress'   
    DESC 'Endereço de roteamento RFC822 deste destinatário'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
attributetype ( 2.16.840.1.113730.3.1.49   
    NAME 'spamassassinUserPrefs'   
    DESC 'Preferências do usuário SpamAssassin'   
    EQUALITY caseIgnoreIA5Match   
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   
  
objectclass ( 2.16.840.1.113730.3.2.147   
    NAME 'inetLocalMailRecipient'   
    DESC 'Destinatário de email local da Internet'   
    SUP top AUXILIARY   
    MAY    ( mailLocalAddress $ mailHost $ mailRoutingAddress $ mailCopyAddress $ mailQuota $ spamassassinUserPrefs ) )   
   
objectclass ( 2.16.840.1.113730.3.2.148   
    NAME 'inetMailForwarder'   
    DESC 'Endereço de encaminhamento de email da Internet'   
    SUP top AUXILIARY   
    MAY    ( mailHost $ mailRoutingAddress ) )

Então, certifique-se de adicionar o esquema necessário em /etc/ldap/slapd.conf:

...  
include /etc/ldap/schema/inetorgperson.schema  
include /etc/ldap/schema/mailMEO.schema  
...

… e verifique o sufixo (debconf já deve ter configurado isso quando você instalou o slapd):

suffix          "dc=middle,dc=earth"

Agora adicionamos algumas ACLs que os daemons precisarão para se conectar ao LDAP.

Um acesso somente leitura ao atributo userPassword para dovecot:

access to attrs=userPassword,shadowLastChange   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by anonymous auth   
        by self write   
        by * none

Um acesso somente leitura a outros atributos para exim e dovecot:

access to *   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by dn="uid=exim,dc=middle,dc=earth" read   
        by * read  
        by anonymous none

A última ACL desabilita leituras anônimas, mas permite leitura (busca) para cada usuário autenticado, o que você pode não querer.

Agora podemos reiniciar o slapd para que as alterações tenham efeito:

sudo /etc/init.d/slapd restart

Precisamos criar os usuários da ACL anterior. Para isso, usaremos o seguinte arquivo user.ldif:

dn: uid=exim,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: exim  
userPassword:: e01ENX1hOElTeXAwV2hnVzFSVnhHd0hCNDF3PT0=  
  
dn: uid=dovecot,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: dovecot  
userPassword:: e01ENX1yZGp2Q1lPNmtDRm1scXAyVWQwa0xBPT0=

Os usuários/senhas são:

dovecot/dovecotpopper
exim4/eximmta 

Para alimentar o diretório, digite:

ldapadd -x -D cn=admin,dc=middle,dc=earth -W < users.ldif

Aqui está outro arquivo ldif que contém dados de exemplo (cuidado, este exemplo contém endereços IP que não se adequarão à sua configuração, altere-os manualmente):

dn: ou=domains,dc=middle,dc=earth  
objectClass: organizationalUnit  
objectClass: top  
ou: domains  
  
dn: dc=middle.earth,ou=domains,dc=middle,dc=earth  
dc: middle.earth  
objectClass: dNSDomain  
objectClass: top  
objectClass: inetLocalMailRecipient  
objectClass: domainRelatedObject  
objectClass: posixAccount  
mailLocalAddress: [email protected]  
cn: catchall  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/c/catchall  
uid: catchall  
uidNumber: 8  
userPassword:: e01ENX1EV3RteGErOFROanJKNUFXZWt1Z0tBPT0=  
mailQuota: 102400  
mailHost: denetor.middle.earth  
associatedDomain: middle.earth  
associatedDomain: lotr.middle.earth  
  
dn: uid=sam,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: sam  
displayName: Sam Gamji  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/s/sam  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Gamji  
uidNumber: 8  
uid: sam  
userPassword:: e01ENX1NeVV5M1BxaHkvWWVLaVpyMXlOaExBPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=frodo,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: frodo  
displayName: Frodo Baggins  
gidNumber: 8  
givenName: Frodo  
homeDirectory: /var/mail/middle.earth/f/frodo  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Baggins  
uidNumber: 8  
uid: frodo  
userPassword:: e01ENX04UGlDRHVnWEdCMmNhRktnbDljTmpRPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=gmail,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: gmail  
mail: [email protected]  
mailHost: 172.16.16.23  
mailRoutingAddress: [email protected]  
objectClass: inetMailForwarder  
objectClass: inetOrgPerson  
objectClass: top  
sn: alias to Gmail address  
uid: gmail
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.