Mail, serveur virtuel
De Diablotins.org.
| Configurer un serveur de messagerie
|
| ||
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
- Filtre de mail
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"

