Installer Postfix sous Debian Jessie avec LDAP

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.


Postfix, Dovecot, Roudcube, LDAP


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

  • mail
  • mailHomeDirectory
  • mailAlias
  • mailGroupMember
  • mailUidNumber
  • mailGidNumber
  • mailEnabled
  • mailQuota
  • mailStorageDirectory

PostfixBookMailForward

  • mail
  • mailAlias

si la base LDAP contient déjà des utilisateurs il faudra 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

Les schéma qu’utilisent LDAP sont sauvegardé directement dans LDAP:

:$ ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config


LDAP schémas


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

slapd-config

www.openldap.org

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


Webmin: Browse Database


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

www.postfix.org

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


Webmin: Postfix Mail Server


Configuration principal du serveur

BASIC_CONFIGURATION_README

VIRTUAL_README

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

ldap_table

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 autrement result_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

wiki.debian.org

mail_dovecot

installing-a-mailserver-with-postfix-dovecot-sasl-ldap-roundc)ube

mailserver-postfix-dovecot

configure-postfix-and-dovecot-with-virtual-domain-users-in-linux

postfix-mail-forwarding-debian

Laisser un commentaire