Contenu
- 1 Configurer Postfix
- 1.0.1 Configuration principal du serveur
- 1.0.2 Configuration des domaines virtuels
- 1.0.3 Requete LDAP pour vérifier le destinataire
- 1.0.4 Requete LDAP pour obtenir les adresses de transfert
- 1.0.5 Requete LDAP pour bloquer les clients qui utilise les noms de domaines du serveur
- 1.0.6 Requete contenant les adresses bloquées
- 1.1 Starting Postfix
- 1.2 Tester le SMTP avec Telnet
- 1.3 Liens
Introduction
Postfix est l’agent de transport de courriel de Wietse Venema qui a commencé son existence comme une alternative au très utilisé programme Sendmail. Postfix vise à être rapide, facile à administrer et sécuritaire, tout en restant assez compatible avec Sendmail pour ne pas frustrer ses utilisateurs. Ainsi, l’externe ressemble à Sendmail, alors que la structure interne est complètement différente.
Postfix est le serveur SMTP de messagerie électronique libre le plus répandu. Il se charge de la livraison des e-mails et a été conçu de façon modulaire autour de différents programmes dévolus chacun à une tâche précise. Cela le rend résistant en terme de sécurité, tout en étant extensible. Plusieurs commandes servent à l’administrer, en voici quelques unes :
- postfix : pour démarrer, arrêter et redémarrer Postfix (root seulement)
- postconf : affiche ou permet d’éditer les paramètres du fichier main.cf
- postalias : maintient les bases de données alias de Postfix (cf : newaliases)
- postmap : maintient les tables de correspondances de Postfix (cf : hash)
- postsuper : maintient la file d’attente
La plupart des systèmes Postfix sont des destinations finales pour un nombre réduit de nom de domaines. Cela inclus les nom d’hôtes et les adresse IP de la machine où s’execute Postfix, et parfois le domain parent.
En plus de ces domaines, Posfix peut être configuré comme une destination finales pour d’autres domaines. Ces domaines sont dit "hébergé" car ils en sont pas directement associé avec le nom de la machine elle-même. Les domaines hébergés sont habituellement implémenté avec des alias de domain virtuel et/ou avec boite aux lettres de domain virtuel.
Il est aussi possible de configurer Postfix pour être un hôte de sauvegarde MX pour un autre domaine.
Finallement, Postfix peut aussi être configuré comme un hôte de transit pour envoyer des mail au travers internet. Dans ce cas, Posftix n’est pas une destination finale pour ces emails.
Configurer LDAP pour supporter les uilisateurs Postfix
Les comptes utilisateurs Postfix sont définis avec le schéma LDAP postfix-book
Par défaut, LDAP ne contient pas ce schéma. Il faut l’ajouter.
Télécharger le schéma :
:$ wget http://www.postfix-buch.com/download/postfix-book.schema.gz
:$ gunzip postfix-book.schema.gz
Le schéma postfix-book défini deux nouveau type d’objet avec les attributs suivants (en gras ceux qui sont obligatoir à la création d’un nouvel utilisateur).
L’adresse "mail" sera utilisé pour enregistrer l’adresse email externe de l’utilisateur (ex: monadresse@gmail.com) et "mailAlias" pour la liste des addresses de cet utiilisateur sur le domain (ex: monadresse@zebulon.freeboxos.fr)
PostfixBookMailAccount
- mailHomeDirectory
- mailAlias
- mailGroupMember
- mailUidNumber
- mailGidNumber
- mailEnabled
- mailQuota
- mailStorageDirectory
PostfixBookMailForward
- mailAlias
si la base LDAP contient déjà des utilisateurs il faudra configurer
PostfixBookMailAccount
à la list desobjectClass
de l’utilisateur. Puis, configurermailAlias
avant d’ajouterPostfixBookMailForward
à la list desobjectClass
de l’utilisateur
Les schéma qu’utilisent LDAP sont sauvegardé directement dans LDAP:
:$ ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
Pour retrouver la liste des schema configuré dans la base LDAP
:$ ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config | grep -i dn:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
Ajouter postfix-book à la base existante
how-to-add-new-schema-to-openldap
ATTENTION: Il semble que supprimer un schéma d’une base LDAP et une action difficile voir impossible…
Pour ajouter un schéma dans LDAP il faut convertir le schéma en fichier LDIF puis l’importer avec l’outil ldapadd
.
La convertion du fichier shéma peut être faite manuellement ou avec l’outil slaptest
.
Je recommande l’utilisation de slaptest
pour les gros fichier et la vérification des dépendances vers d’autres schémas avant l’import dans la base LDAP.
Créer un réportoir de travail pour contenir les fichiers qui seront généré par slaptest.
:$ mkdir postfix-book
:$ mv postfix-book.schema /root/postfix-book
Créer le fichier de configuration de "slaptest" en incluant les schémas de la base LDAP actuelle dans l’ordre des indexes pour les dépendances.
:$ cat > /root/postfix-book/postfix-book.conf << EOF
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /root/postfix-book/postfix-book.schema
EOF
:$ slaptest -f /root/postfix-book/postfix-book.conf -F /root/postfix-book
config file testing succeeded
:$ ls -l /root/postfix-book/cn=config/cn=schema/
total 44
-rw------- 1 root root 15546 mars 26 12:21 cn={0}core.ldif
-rw------- 1 root root 11363 mars 26 12:21 cn={1}cosine.ldif
-rw------- 1 root root 6495 mars 26 12:21 cn={2}nis.ldif
-rw------- 1 root root 2857 mars 26 12:21 cn={3}inetorgperson.ldif
-rw------- 1 root root 2425 mars 26 12:21 cn={4}postfix-book.ldif
Copier le fichier généré par "slaptest" en le renomant pour enlever l’index dans le nom du fichier
:$ cp /root/postfix-book/cn=config/cn=schema/cn={4}postfix-book.ldif /root/postfix-book/postfix-book.ldif
Editer le fichier LDIF pour :
- enlever l’index "{4}" dans "dn:" et "cn:"
- ajouter ",cn=schema,cn=config" à la fin du "dn:"
- enlever les dernières lignes du fichier à partir de "structuralObjectClass: olcSchemaConfig" (inclus)
:$ nano /root/postfix-book/postfix-book.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 e83e008f
dn: <b>cn=postfix-book,cn=schema,cn=config</b>
objectClass: olcSchemaConfig
cn: <b>postfix-book</b>
...
:$ ldapadd -Y EXTERNAL -H ldapi:/// -W -f /root/postfix-book/postfix-book.ldif
Enter LDAP Password:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=postfix-book,cn=schema,cn=config"Vérifier la liste des schéma dans la base LDAP
:$ ls -l /root/postfix-book/cn=config/cn=schema/
total 44
-rw------- 1 root root 15546 mars 26 12:21 cn={0}core.ldif
-rw------- 1 root root 11363 mars 26 12:21 cn={1}cosine.ldif
-rw------- 1 root root 6495 mars 26 12:21 cn={2}nis.ldif
-rw------- 1 root root 2857 mars 26 12:21 cn={3}inetorgperson.ldif
-rw------- 1 root root 2425 mars 26 12:21 cn={4}postfix-book.ldif
Copier les fichier postfix-book.ldif
et postfix-book.schema
dans le répertoire /etc/ldap/schema
(pour garder un historique des modifications)
:$ cp /root/postfix-book/postfix-book.ldif /etc/ldap/schema/:$ cp /root/postfix-book/postfix-book.schema /etc/ldap/schema/
Si la base LDAP contient déjà des utilisateurs, il faut :
- configurer "mail" avant d’ajouter "PostfixBookMailAccount" à la list des objectClass de l’utilisateur.
- Puis, configurer "mailAlias" avant d’ajouter "PostfixBookMailForward" à la list des objectClass de l’utilisateur.
- configurer "mailEnabled" à "TRUE"
Il est possible d’utiliser Webmin -> Servers -> LDAP Server -> Browse Database
pour modifier la definition des utilsateurs existants
Il faut aussi configurer le module LDAP Users and Groups
pour ajouter les objectClasses et les paramètres suplémentaires pour créer les utilisateur depuis Webmin.
Depuis Un-used Modules -> LDAP Users and Groups
- Other objectClasses to add to new users: inetOrgPerson PostfixBookMailAccount PostfixBookMailForward
- Extra LDAP user properties to allow editing of:
- mailEnabled Enable mail reception and forwarding
- mail External user email
- mailAlias+ Internal user email
Installer Postfix
Installer les paquets Postfix avec les modules "Pearl Compatible Regular Expressions" et "LDAP Connections"
:$ apt-get update
:$ apt-get install postfix postfix-pcre postfix-ldap
Postfix Paramètres
- Type de serveur: Site Internet
- Nom de courrier (domain): binaryworld.fr.eu.org
:$ apt-cache policy postfix postfix-pcre postfix-ldap
postfix:
Installé : 2.11.3-1
Candidat : 2.11.3-1
Table de version :
*** 2.11.3-1 0
500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
100 /var/lib/dpkg/status
postfix-pcre:
Installé : 2.11.3-1
Candidat : 2.11.3-1
Table de version :
*** 2.11.3-1 0
500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
100 /var/lib/dpkg/status
postfix-ldap:
Installé : 2.11.3-1
Candidat : 2.11.3-1
Table de version :
*** 2.11.3-1 0
500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
100 /var/lib/dpkg/status
Il est aussi possible d’installer quelques outils supplémentaires pour gérer les boites aux lettres (mutt) et envoyer des mails de tests (swaks)
:$ apt-get install mutt swaks
Configurer Postfix
Editer le fichier hosts et ajouter le hostname du server de mail
:$ nano /etc/hosts
...
127.0.2.1 monnas.zebulon.freeboxos.fr monnas
Depuis Webmin dans le menu Servers -> Postfix Mail Sever
Configuration principal du serveur
Ne jamais lister un alias virtuel de domain (virtual alias domain) comme un domain de destination (mydestination) !
Ne jamais lister une boite aux lettres virtuelle de domain (virtual MAILBOX domain) comme un domain de destination (mydestination) !
Ne jamais lister une boite aux lettres virtuelle de domain (virtual MAILBOX domain) comme un alias virtuel de domain (virtual alias domain) !
En éditant les fichier de configuration dans le répertoire /etc/postfix
:$ nano /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
#myhostname = zebulon.freeboxos.fr
myhostname = monnas.zebulon.freeboxos.fr
#alias_maps = hash:/etc/aliases
#alias_database = hash:/etc/aliases
#myorigin = /etc/mailname
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
###################################################################################################
### Local Transport ###
#######################
# Disable local transport (so that system accounts can't receive mail)
local_transport = error:Local Transport Disabled
# Don't use local alias maps
alias_maps =
# Local domain (could be omitted, since it is automatically derived from $myhostname)
mydomain = zebulon.freeboxos.fr
# The mydestination parameter specifies what domains this machine will deliver locally, instead of forwarding to another machine.
mydestination = $myhostname, local.$myhostname, localhost
###################################################################################################
### Virtual Transport ###
#########################
# Deliver mail for virtual recipients to Dovecot
virtual_transport = dovecot
# Process one mail at one time
#dovecot_destination_recipient_limit = 1
# Valid virtual domains
virtual_mailbox_domains = hash:/etc/postfix/virtual_domains
# Valid virtual recipients
virtual_mailbox_maps = proxy:ldap:/etc/postfix/ldap_virtual_recipients.cf
# Virtual aliases
virtual_alias_maps = proxy:ldap:/etc/postfix/ldap_virtual_aliases.cf
###################################################################################################
### ESMTP Settings ###
######################
### SASL ###
# Enable SASL (required for SMTP authentication)
smtpd_sasl_auth_enable = yes
# Enable SASL for Outlook-Clients as well
broken_sasl_auth_clients = yes
### TLS ###
# Enable TLS (required to encrypt the plaintext SASL authentication)
#smtpd_tls_security_level = may
# Only offer SASL in a TLS session
#smtpd_tls_auth_only = yes
# Certification Authority
#smtpd_tls_CAfile = /etc/postfix/certs/example-cacert.pem
# Public Certificate
#smtpd_tls_cert_file = /etc/postfix/certs/mail_public_cert.pem
# Private Key (without passphrase)
#smtpd_tls_key_file = /etc/postfix/certs/mail_private_key.pem
# Randomizer for key creation
tls_random_source = dev:/dev/urandom
# TLS related logging (set to 2 for debugging)
smtpd_tls_loglevel = 0
# Avoid Denial-Of-Service-Attacks
smtpd_client_new_tls_session_rate_limit = 10
# Activate TLS Session Cache
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_session_cache
# Deny some TLS-Ciphers
smtpd_tls_exclude_ciphers =
EXP
EDH-RSA-DES-CBC-SHA
ADH-DES-CBC-SHA
DES-CBC-SHA
SEED-SHA
# Diffie-Hellman Parameters for Perfect Forward Secrecy
# Can be created with:
# openssl dhparam -2 -out dh_512.pem 512
# openssl dhparam -2 -out dh_1024.pem 1024
smtpd_tls_dh512_param_file = ${config_directory}/certs/dh_512.pem
smtpd_tls_dh1024_param_file = ${config_directory}/certs/dh_1024.pem
###################################################################################################
### Connection Policies ###
###########################
# Reject Early Talkers
postscreen_greet_action = enforce
###################################################################################################
### Session Policies ###
########################
# Recipient Restrictions (RCPT TO related)
smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_unknown_recipient_domain
# Allow relaying for SASL authenticated clients and trusted hosts/networks
# This can be put to smtpd_relay_restrictions in Postfix 2.10 and later
permit_sasl_authenticated
permit_mynetworks
# If not authenticated or on mynetworks, reject mailing to external addresses
reject_unauth_destination
# Reject the following hosts
check_sender_ns_access cidr:/etc/postfix/drop.cidr
check_sender_mx_access cidr:/etc/postfix/drop.cidr
# Additional blacklist
reject_rbl_client ix.dnsbl.manitu.net
# Finally permit (relaying still requires SASL auth)
# WARNING: Due to this permit, everyone will be able to send emails to internal addresses without authentication. If this is set to reject though, the server does not receive emails from external addresses. Unfortunately I do not have a solution for this.
permit
# Reject the request if the sender is the null address and there are multiple recipients
smtpd_data_restrictions = reject_multi_recipient_bounce
# Sender Restrictions
smtpd_sender_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
# HELO/EHLO Restrictions
smtpd_helo_restrictions =
permit_mynetworks
check_helo_access pcre:/etc/postfix/identitycheck.pcre
#reject_non_fqdn_helo_hostname
reject_invalid_hostname
# Deny VRFY recipient checks
disable_vrfy_command = yes
# Require HELO
smtpd_helo_required = yes
# Reject instantly if a restriction applies (do not wait until RCPT TO)
smtpd_delay_reject = no
# Client Restrictions (IP Blacklist)
smtpd_client_restrictions = check_client_access cidr:/etc/postfix/drop.cidr
Configuration des domaines virtuels
Liste des noms de domaine des serveurs pour les mails (paramètre de configuration virtual_mailbox_domains
du fichier main.cf
de postfix)
Le nom de fichier doit être sans extension. Il sera convertit en base de donnée plus tard avec l’extension .db
.
Il est aussi possible d’utiliser d’autre type de base de donnée (comme MySQL ou MariaDB) : DATABASE_README
:$ nano /etc/postfix/virtual_domains
# Domain Anything
binaryworld.fr.eu.org OK
zebulon.freeboxos.fr OK
Les paramètres qui point sur un fichier comme base de donnée de type hash
doivent être convertit en .db
.
:$ postmap hash:/etc/postfix/virtual_domains
Requete LDAP pour vérifier le destinataire
La requete vérifie que la clef (l’adresse email de l’utilisateur) est définie dans la liste mailAlias
et que le compte mail de l’utilisateur est activé (avec mailEnabled
)
Comme il n’est pas possible de retourner l’adresse qui match une des entrée de la liste mailAlias
, nous utilisons result_fomat
pour retourner l’adresse email de l’utilisateur.
il est toutefois nécessaire de configurer
result_attribute
autrementresult_format
ne sera pas utilisé.
:$ nano /etc/postfix/ldap_virtual_recipients.cf
domain = hash:/etc/postfix/virtual_domains
bind = yes
bind_dn = cn=client,dc=cyberlogis
bind_pw = ***
server_host = ldap://127.0.0.1:389
search_base = ou=users,dc=cyberlogis
query_filter = (&(mailAlias=%s)(mailEnabled=TRUE))
result_attribute = mail
result_format = %S
Il est possible de tester la configuration avec postmap
.
La commande doit retourner l’adresse email de l’utilisateur recherché si son adresse est définie dans la liste "mailAlias" de son compte LDAP (ou=users,dc=cyberlogis
) et si mailEnabled
est "TRUE".
:$ postmap -q zebulon@openaliasbox.org ldap:/etc/postfix/ldap_virtual_recipients.cf
:$ postmap -q postmaster@zebulon.freeboxos.fr ldap:/etc/postfix/ldap_virtual_recipients.cf
postmaster@zebulon.freeboxos.fr
:$postmap -q webmaster@zebulon.freeboxos.fr ldap:/etc/postfix/ldap_virtual_recipients.cf
webmaster@zebulon.freeboxos.fr
Requete LDAP pour obtenir les adresses de transfert
le transfert de courrier peut être fait en configurant l’adresse externe dans le paramètre mail
du compte LDAP et en copiant l’adresse principale du paramètre ‘mail’ dans le paramètre ‘mailAlias’
:$ nano /etc/postfix/ldap_virtual_aliases.cf
domain = hash:/etc/postfix/virtual_domains
bind = yes
bind_dn = cn=client,dc=cyberlogis
bind_pw = LSlgRa6aRUcHi1wjaUDV
server_host = ldap://127.0.0.1:389
search_base = ou=users,dc=cyberlogis
query_filter = (&(mailAlias=%s)(mailEnabled=TRUE)(mail=*))
result_attribute = mail
result_format = %S, %s
Il est possible de tester la configuration avec postmap
La commande doit retourner l’adresse email de l’utilisateur recherché si son adresse est définie dans la liste mailAlias
de son compte LDAP (ou=users,dc=cyberlogis
) et si mailEnabled
est "TRUE".
:$ postmap -q zebulon@openaliasbox.org ldap:/etc/postfix/ldap_virtual_aliases.cf
:$ postmap -q postmaster@zebulon.freeboxos.fr ldap:/etc/postfix/ldap_virtual_aliases.cf
postmaster@zebulon.freeboxos.fr, zebulon@openaliasbox.org
:$postmap -q webmaster@zebulon.freeboxos.fr ldap:/etc/postfix/ldap_virtual_aliases.cf
webmaster@zebulon.freeboxos.fr, zebulon@openaliasbox.org
Requete LDAP pour bloquer les clients qui utilise les noms de domaines du serveur
:$ nano /etc/postfix/identitycheck.pcre
# Identity (RegEx) Action
/^(monnas.cyberlogis)$/ REJECT Hostname Abuse: $1
/^(1.2.3.4)$/ REJECT Hostname Abuse: $1
/^([1.2.3.4])$/ REJECT Hostname Abuse: $1
Requete contenant les adresses bloquées
:$ nano /etc/postfix/drop.cidr
# IP/CIDR Action
1.2.3.0/24 REJECT Blacklisted
Starting Postfix
Comme Dovecot et TLS ne sont pas encore installé, il faut commenter les lignes suivantes dans le fichier main.cf
:
- dovecot_destination_recipient_limit = 1
- smtpd_tls_security_level = may
- smtpd_tls_auth_only = yes
- smtpd_tls_CAfile = /etc/postfix/certs/example-cacert.pem
- smtpd_tls_cert_file = /etc/postfix/certs/mail_public_cert.pem
- smtpd_tls_key_file = /etc/postfix/certs/mail_private_key.pem
:$ service postfix start
:$ lsof -Pni :25
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1169 root 12u IPv4 19892 0t0 TCP *:25 (LISTEN)
master 1169 root 13u IPv6 19893 0t0 TCP *:25 (LISTEN)
Tester le SMTP avec Telnet
:$ telnet zebulon.freeboxos.fr 25
Trying 2a01:e34:ef43:5ae0::1...
Trying 78.244.53.174...
Connected to zebulon.freeboxos.fr.
Escape character is '^]'.
220 zebulon.freeboxos.fr ESMTP Postfix (Debian/GNU)
HELO client
250 zebulon.freeboxos.fr
MAIL FROM: <vbio@laposte.net>
250 2.1.0 Ok
RCPT TO: <webmaster@zebulon.freeboxos.fr>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test
Corps du texte
.
250 2.0.0 Ok: queued as 4CC86400091
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
Pour voir les log du serveur
:$ tail -f /var/log/mail.log
Pour vérifier que la freebox ne bloque pas le SMTP sortant (il faut autoriser le SMTP sortant avec la freebox en se connectant sur son compte sur le site de Free et redémarrer la freebox)
:$ traceroute -n -T -p 25 gmail-smtp-in.l.google.com
traceroute to gmail-smtp-in.l.google.com (108.177.15.26), 30 hops max, 60 byte packets
1 192.168.1.254 0.241 ms 0.533 ms 0.564 ms
2 78.244.53.254 23.022 ms 23.286 ms 24.183 ms
3 213.228.23.254 25.353 ms 26.452 ms 26.709 ms
4 194.149.162.145 31.876 ms 32.091 ms 32.755 ms
5 78.254.249.102 31.699 ms 32.770 ms 33.065 ms
6 72.14.211.26 33.827 ms 34.248 ms 34.998 ms
7 216.239.46.128 35.144 ms 72.14.239.145 23.854 ms 24.886 ms
8 209.85.252.247 25.424 ms 108.170.235.161 25.050 ms 209.85.252.247 24.278 ms
9 216.239.51.110 29.561 ms 216.239.48.37 40.523 ms 216.239.51.110 28.847 ms
10 72.14.232.213 29.486 ms 209.85.246.117 28.955 ms 29.624 ms
11 * * *
Liens
installing-a-mailserver-with-postfix-dovecot-sasl-ldap-roundc)ube
configure-postfix-and-dovecot-with-virtual-domain-users-in-linux