Mail, serveur virtuel

De Diablotins.org.


Configurer un serveur de messagerie
Image:brush.png


Sommaire

Serveur Entrant

Postix avec Anti-Spam et Antivirus en Maildir Virtuelle et LDAP/SASL/TLS.

Cadre et contraintes

Fonctionnalités

Nous allons vous expliquer comment installer un serveur Postfix en Maildir Virtuelle sur LDAP avec Anti-Virus et Anti-Spam et SASL/TLS. les fonctionnalités sont :

  • Serveur SMTP Postfix
    • Filtre de mail
      • Antivirus Clamav
      • Antispam Spammassassin
    • Authentification SASL via Démon authentification SUR LDAP
    • Securisation SSL/TLS
    • Support de configuration sur Annuaire LDAP
    • Maildir virtuelle avec domaine virtuel

Versions

  • La configuration de la machine est une FreeBSD 5.*.
  • Le serveur de mails est un Postfix, version postfix-2.1.4,1.
  • L'anti-Virus est clamav-0.88.
  • le filtre Anti-spam p5-Mail-SpamAssassin-3.1.0_6 et spampd-2.12
  • le filtre global est Amavisd-new-2.3.3.
  • la librairie d'authentification SASL est cyrus-sasl-2.1.21_2
  • le démon SETUID SASL est cyrus-sasl-saslauthd-2.1.21_1

Conditions

  • Nous allons utiliser une MailDir plutot qu'une MailBox.
  • La liste des utilisateurs se trouve dans un LDAP, sous l'arborescence: "ou=mail,dc=domaine,dc=tld".
  • la PKI se trouve dans /data/certificats
  • les mails seront posés dans /data/mails
sous le format ; /data/mails/domain.tld/account

Pré-requis

Il est obligatoire d'avoir un serveur LDAP opérationnel pour continuer.
OpenLDAP convient tout à fait et nous baserons sur sa version 2.3.

Installation des ports.

Nous avons 3 ports a installer. Rien de plus simple :

  # portinstall -P clamav
  # portinstall -P postfix

choisir les options :

  [X] PCRE      Perl Compatible Regular Expressions                   
  [X] SASL      Cyrus SASL (Simple Authentication and Security Layer) 
  [X] OpenLDAP  OpenLDAP map lookups                                  
  [X] TLS       Secure Sockets Layer and Transport Layer Security     

Au questions suivantes, répondre :

   Added group "postfix".
   Added group "maildrop".
   Added user "postfix".
   You need user "postfix" added to group "mail".
   Would you like me to add it [y]? y
   Done.
   Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y


  # portinstall -P amavisd-new
  # portinstall -P p5-Mail-SpamAssassin
  # portinstall -P spamd
  # portinstall -P -m '-DWITHOUT_OTP' cyrus-sasl2
  # portinstall -P cyrus-sasl2-saslauthd

Mise en place des fichiers.

/etc/rc.conf

  # ee /etc/rc.conf
  --
  [...]
  # antivirus and antispam
  amavisd_enable="YES"
  clamav_clamd_enable="YES"
  spamd_enable="YES"
  # SASL2 authentification daemon
  saslauthd_enable="YES"
  saslauthd_flags="-a ldap -c -t 30"
  [...]

Vous pouvez aussi ajouter les lignes suivantes :

[...]
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO" 
[...]

/usr/local/etc/postfix/master.cf

  # cd /usr/local/etc/postfix
  # ee master.cf
  --
  [...]
  127.0.0.1:10025 inet n - n - - smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject_unauth_destination
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  smtp-amavis unix - - n - 2 smtp
  -o smtp_data_done_timeout=1200
  # -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  [...]

/usr/local/etc/postfix/main.cf

# ee main.cf
--
# globals skills
# paths
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
mail_owner = postfix
myhostname = monserveur.domaine.tld
mydomain = domaine.tld
myorigin = $mydomain

# net skills
inet_interfaces = all
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = <192.168.1.0>/24, 127.0.0.0/8

# default overlay
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
home_mailbox = Maildir/
mail_spool_directory = /data/mails/
smtpd_banner = $myhostname SUPER Mailer

# remap commands
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop

# path
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = no

# filtering instance bridge
content_filter=smtp-amavis:[127.0.0.1]:10024
canonical_maps = hash:/usr/local/etc/postfix/canonical


# SASL / SASLAUTHD
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

## TLS
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /data/certificats/pubkeys/domaine.tld.key
smtpd_tls_cert_file = /data/certificats/certs/domaine.tld.crt
smtpd_tls_CAfile = /data/certificats/ca.crt
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

#
# LDAP PARAMETERS 
#

# transports
transport_server_host = localhost
transport_search_base = ou=transports,ou=mail,dc=domaine,dc=tld
transport_query_filter = (&(pvd=%s)(objectClass=PostfixVirtualDomain))
transport_result_attribute = postfixTransport
transport_cache = no
transport_bind = no
transport_scope = one

# aliases
aliases_server_host = localhost
aliases_search_base = ou=aliases,ou=mail,dc=domaine,dc=tld
aliases_query_filter = (&(objectClass=PostfixMailAlias)(mail=%s)(accountActive=TRUE))
aliases_result_attribute = maildrop
aliases_bind = no
aliases_cache = no
aliases_scope = sub

# accounts delivery
accounts_server_host = localhost
accounts_search_base = ou=accounts,ou=mail,dc=domaine,dc=tld
accounts_query_filter = (&(objectClass=PostfixMailAccount)(mail=%s)(accountActive=TRUE))
accounts_result_attribute = mailbox
accounts_cache = no
accounts_bind = no
accounts_scope = sub

# accounts
accountsmap_server_host = localhost
accountsmap_search_base = ou=mail,dc=domaine,dc=tld
accountsmap_query_filter = (&(objectClass=PostfixMailAccount)(mail=%s)(accountActive=TRUE))
accountsmap_result_attribute = mail
accountsmap_cache = no
accountsmap_bind = no
accountsmap_scope = sub

# destination
acceptdomains_server_host = localhost
acceptdomains_server_port = 389
acceptdomains_search_base = ou=mail,dc=domaine,dc=tld
acceptdomains_query_filter = (pvd=%s)
acceptdomains_result_attribute = pvd
acceptdomains_bind = no
acceptdomains_cache = no
acceptdomains_scope = sub

# delivery
local_transport=virtual
# transport map
transport_maps = ldap:transport
# virtual map

virtual_maps = ldap:aliases, ldap:accountsmap
# destination map
mydestination = $myhostname, localhost.$mydomain, localhost.localdomain, ldap:acceptdomains

# virtual
virtual_mailbox_base = /mail
virtual_mailbox_maps = ldap:accounts
virtual_minimum_uid = 125
virtual_uid_maps = static:125
virtual_gid_maps = static:125
virtual_mailbox_limit = 0

Création des maps fichiers

Nous allons maintenant créer les databases locales, même si nous ne les utilisons pas.
En tant que root:

  # cd /usr/local/etc/postfix
  # postmap /usr/local/etc/postfix/transport

Puis la database des aliases

  # cd /etc
  # ln -s mail/aliases aliases
  # newaliases

Configuration de SASL

On edite le fichier /usr/local/lib/sasl2/smtpd.conf :

 # ee /usr/local/lib/sasl2/smtpd.conf
 --
 pwcheck_method: saslauthd

On lance le démon SASLAUTHD :

 # /usr/local/etc/rc.d/saslauthd.sh start

usr/local/etc/saslauthd.conf

 ldap_servers:           ldap://127.0.0.1/
 ldap_search_base:       ou=users,dc=domaine,dc=tld
 #ldap_timeout:          30
 #ldap_filter:           cn=%u
 ldap_bind_dn:           cn=root,dc=domaine,dc=tld
 ldap_password:          <SECRET>
 #ldap_scope:            sub

Configuration de TLS

l'extrait de /usr/local/etc/postfix/main.conf ;

## TLS
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /data/certificats/pubkeys/domaine.tld.key
smtpd_tls_cert_file = /data/certificats/certs/domaine.tld.crt
smtpd_tls_CAfile = /data/certificats/ca.crt
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom


Il faut donc pauser la clef pour le domaine domaine.tld dans :

 /data/certificats/pubkeys/domain.tld.key

Il faut pauser le certificat pour domaine.tld

 /data/certificats/certs/domaine.tld.crt

Il faut pauser la CA dans :

 /data/certificats/ca.crt

Configuration LDAP

Organigramme LDAP

Fichier de schema OpenLDAP pour Postfix

# From Courrier/Jamm Mail Account: derived lecid for Ultragreen
#
# OID prefix: 1.3.6.1.4.1.12461
#
# Attributes: 1.3.6.1.4.1.12461.1.1
#

attributetype ( 1.3.6.1.4.1.12461.1.1.1 NAME 'postfixTransport'
        DESC 'A string directing postfix which transport to use'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{20} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.12461.1.1.2 NAME 'accountActive'
        DESC 'A boolean telling whether an account is active or not'
        EQUALITY booleanMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.12461.1.1.4 NAME 'pvd'
        DESC 'A Postfix virtual domain '
        EQUALITY caseIgnoreIA5Match
        SUBSTR caseIgnoreIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.12461.1.1.5 NAME 'mailbox'
        DESC 'The absolute path to the mailbox for a mail account in a non-default location'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.12461.1.1.6 NAME 'quota'
        DESC 'A string that represents the quota on a mailbox'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.12461.1.1.7 NAME 'clearPassword'
        DESC 'A separate text that stores the mail account password in clear text'
        EQUALITY octetStringMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128})

attributetype ( 1.3.6.1.4.1.12461.1.1.8 NAME 'maildrop'
        DESC 'RFC822 Mailbox - mail alias'
        EQUALITY caseIgnoreIA5Match
        SUBSTR caseIgnoreIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.12461.1.1.9 NAME 'mailsource'
        DESC 'Message source'
        EQUALITY caseIgnoreIA5Match
        SUBSTR caseIgnoreIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

# Back to more of specific attributes


#
# Objects: 1.3.6.1.4.1.12461.1.2
#
objectclass ( 1.3.6.1.4.1.12461.1.2.1 NAME 'PostfixMailAccount'
        SUP top STRUCTURAL
        DESC 'Mail account objects'
        MUST ( mail $ homeDirectory $ mailbox $ accountActive )
        MAY ( uidNumber $ gidNumber $ uid $ cn $ description $ quota $
              userPassword $ clearPassword ) )

objectclass ( 1.3.6.1.4.1.12461.1.2.2 NAME 'PostfixMailAlias'
        SUP top STRUCTURAL
        DESC 'Mail aliasing/forwarding entry'
        MUST ( mail $ maildrop $ accountActive )
        MAY ( mailsource $ cn $ description $ userPassword ) )

objectclass ( 1.3.6.1.4.1.12461.1.2.3 NAME 'PostfixVirtualDomain'
        SUP top STRUCTURAL
        DESC 'Virtual Domain entry to be used with postfix transport maps'
        MUST ( pvd )
        MAY ( postfixTransport $ description  ) )

/usr/local/etc/openldap/slapd.conf

dans le fichier de conf de OpenLDAP on ajoute le modèle Postfix d'ou un fichier du genre :

# vi /usr/local/etc/openldap/slapd.conf
--
# Config SLapd for server
include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/nis.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/postfix.schema

#referral       ldap://root.openldap.org

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

# Load dynamic backend modules:
# modulepath    /usr/local/libexec/openldap
# moduleload    back_bdb
# moduleload    back_ldap
# moduleload    back_ldbm
# moduleload    back_passwd
# moduleload    back_shell

#loglevel 0


database        ldbm
suffix          "dc=domaine,dc=tld"
rootdn          "cn=root,dc=domaine,dc=tld"
rootpw          <SECRET>
directory       /var/db/openldap-data


# Indexing
index   objectClass     eq

cachesize 2000

# ACL's
access to attrs=userPassword
        by dn="cn=root,dc=domaine,dc=tld" write
        by anonymous auth
        by self write
        by * none
access to *
        by dn="cn=root,dc=domaine,dc=tld" write
        by self write
        by * read

Exemples de LDIF

pour ajouter chacun de ses LDIF il faut faire :

# ldapadd -D 'cn=root,dc=domaine,dc=tld' -W <SECRET> -f <fichier.ldif> 

Account

LDIF pour ajouter un account :

dn: pvd=undomaine.tld,ou=accounts,ou=mail,dc=domaine,dc=tld
pvd: undomaine.tld
description: Main domain for undomaine.tld
objectClass: PostfixVirtualDomain
objectClass: top

dn: mail=user@undomaine.tld,pvd=undomaine.tld,ou=accounts,ou=mail,,dc=domaine,dc=tld
accountActive: TRUE
homeDirectory: /data/mails
mail: user@undomaine.tld
cn: Nom du user
description: Boite de nom du user
objectClass: PostfixMailAccount
objectClass: top
uid: user
mailbox: undomaine.tld/user/


Remarque : le / à la fin du champs mailbox est OBLIGATOIRE dans la cas des Maildir.

Alias

Pour ajouter un alias ou une mailing list; maildrop est multivalue :

dn: pvd=undomaine.tld,ou=aliases,ou=mail,dc=domaine,dc=tld
pvd: undomaine.tld
description: Main domain for undomaine.tld
objectClass: PostfixVirtualDomain
objectClass: top

dn: mail=user@undomaine.tld,pvd=undomaine.tld,ou=aliases,ou=mail,dc=domaine,dc=tld
accountActive: TRUE
mail: user@undomaine.tld
maildrop: autreuser@autredomaine.tld
cn: John DOE alias
description: alias de John DOE
objectClass: PostfixMailAlias
objectClass: top

Transport

Pour ajouter un transport pour un domaine :

dn: pvd=undomaine.tld,ou=transports,ou=mail,dc=domaine,dc=tld
pvd: undomaine.tld
description: Main domain for undomaine.tld
objectClass: PostfixVirtualDomain
objectClass: top

SASL User

Pour ajouter un utilisateur SASL ( a faire correspondre avec un user smtp, mais ici on organise son arbre comme on veut) :

dn: cn=saslusers,ou=groups,dc=domaine,dc=tld
cn: saslusers
gidNumber: 125
objectClass: top
objectClass: posixGroup
description: SASL Users Group

dn: uid=user, cn=saslusers,ou=groups,dc=domaine,dc=tld
objectClass: inetOrgPerson
objectClass: posixAccount
cn: user
sn: user
uid: user
uidNumber: 125
gidNumber: 125
homeDirectory: /tmp
loginShell: /bin/nologin
gecos: SASL posix account for User
description: User

Les uidNumber et GidNumber sont ceux de l'utilisateur Unix de Postfix

lancement du serveur

En root toujours, verification de la conf:

  # postfix check

Lancement de postfix

  # postfix start

vérification

Un petit telnet...

  # telnet mondomain.tld 25

devrait vous donner une ligne du genre:

  220 $myhostname Diablotins Mailer

Nous allons maintenant essayer d'envoyer un mail a la main:

# telnet localhost 25
220 $myhostname Diablotins Mailer
> ehlo mamachine
> mail from: you@yourdomain.tld
> rcpt to: you@yourdomain.tld
> subject: sujet de votre mail
> DATA
> votre corps de message
> .

Vous devriez recevoir le message envoyé si tout va bien. Si vous ne recevez pas ce mail, allez voir dans /var/log/maillog le problème.

Serveurs Sortant

Cadres et contraintes

Fonctionnalités

Les serveurs de courrier sortant doivent offrir :

  • le suuport LDAP
  • Le support des Maildirs virtuelles
  • le support des domaines virtuels
  • le support des paths de maildrop arbitraire

et d'autres possibilités, bref la liste diminue fortement et ne reste que Courier, un grand classique .

Versions

la version du seul et unique package est courier-imap-4.0.6 Cette petite merveille offre tout (comme son nom ne l'indique pas) :

  • IMAP4
  • POP3
  • IMAP4/SSL
  • POP3/SSL
  • MAILDROP

Conditions

Ici, toujours pareil :

l'arborescence est :

/data/mails ; path vers les mails

Pré-requis

- l'étape serveur sortant doit-être faite ou une équivalence fonctionnelle - Le serveur LDAP doit être opérationnel

Installation du port

Il suffit d'installer juste un port pour installer tous les éléments du serveur de courriers sortants :

 # portinstall courier-imap

les options sont :

[X] OPENSSL      Build with OpenSSL support
[ ] FAM          Build in fam support for IDLE command     
[ ] TRASHQUOTA   Include deleted mails in the quota         
[ ] GDBM         Use gdbm db instead of system bdb          
[X] IPV6         Build with IPv6 support                     
[X] AUTH_LDAP    LDAP support                                
[ ] AUTH_MYSQL   MySQL support                               
[ ] AUTH_PGSQL   PostgreSQL support                          
[ ] AUTH_USERDB  Userdb support                              
[ ] AUTH_VCHKPW  Vpopmail/vchkpw support

Configuration générale des serveurs IMAP et POP

On doit configurer le démon d'authentification pour les deux services :

/usr/local/etc/courier-imap/authdaemonrc

 # vi /usr/local/etc/courier-imap/authdaemonrc
 --
 authmodulelist="authldap"
 daemons=5
 version=""
 authdaemonvar=/usr/local/var/authdaemon

/usr/local/etc/courier-imap/authldaprc

# vi /usr/local/etc/courier-imap/authldaprc 
--
LDAP_SERVER             localhost
LDAP_PORT               389
LDAP_PROTOCOL_VERSION   3
LDAP_BASEDN             ou=accounts, ou=mail, dc=domaine, dc=tld
LDAP_BINDDN             cn=root, dc=domaine, dc=tld
LDAP_BINDPW             <SECRET>
LDAP_TIMEOUT            5

LDAP_MAIL               uid
LDAP_FILTER             (&(objectClass=PostfixMailAccount)(accountActive=TRUE))
LDAP_GLOB_UID           125
LDAP_GLOB_GID           125
LDAP_HOMEDIR            homeDirectory
# LDAP_MAILROOT         /data/mails
LDAP_MAILDIR            mailbox
LDAP_FULLNAME           cn
LDAP_CRYPTPW            userPassword
LDAP_DEREF              never
LDAP_TLS                0

Serveur IMAP

Mise en place des fichiers

/usr/local/etc/courier-imap/imap

# vi /usr/local/etc/courier-imap/imap
--
ADDRESS=0
AUTHMODULES="authdaemon"
AUTHMODULES_ORIG="authdaemon"
DEBUG_LOGIN=0
HEADERFROM=X-IMAP-Sender
IMAPDSTART=NO
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
IMAP_CHECK_ALL_FOLDERS=0
IMAP_DISABLETHREADSORT=0
IMAP_EMPTYTRASH=Trash:7
IMAP_ENHANCEDIDLE=0
IMAP_IDLE_TIMEOUT=60
IMAP_KEYWORDS=1
IMAP_MOVE_EXPUNGE_TO_TRASH=0
IMAP_OBSOLETE_CLIENT=0
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
IMAP_TRASHFOLDERNAME=Trash
IMAP_ULIMITD=65536
IMAP_USELOCKS=1
MAILDIRPATH=Maildir
MAXDAEMONS=40
MAXPERIP=4
PIDFILE=/var/run/imapd.pid
PORT=143
SENDMAIL=/usr/sbin/sendmail
TCPDOPTS="-nodnslookup -noidentlookup"

lancement du serveur

vérification

Serveur POP

Mise en place des fichiers

/usr/local/etc/courier/pop3d

# vi /usr/local/etc/courier/pop3d
--
ADDRESS=0
AUTHMODULES="authdaemon"
AUTHMODULES_ORIG="authdaemon"
DEBUG_LOGIN=0
MAILDIRPATH=Maildir
MAXDAEMONS=40
MAXPERIP=4
PIDFILE=/var/run/pop3d.pid
POP3AUTH=""
POP3AUTH_ORIG="LOGIN CRAM-MD5 CRAM-SHA1"
POP3AUTH_TLS=""
POP3AUTH_TLS_ORIG="LOGIN PLAIN"
POP3DSTART=NO
PORT=110
TCPDOPTS="-nodnslookup -noidentlookup"

lancement du serveur

vérification

Outils personnels
Projets :