Authentification via LDAP

Création des users dans l’AD

Dans l’OU utilisateur, cliquez droit et choisissez “Utilisateur”.

Postfix

Cliquez sur “Suivant”.

Postfix

Cliquez sur “Suivant”.

Postfix

Cliquez sur “Terminer”.

Postfix

Nous pouvons voir que les utilisateurs sont créés.

Postfix

Pour la suite, nous allons aussi créer un utilisateur qui a tous les droits et qui nous servira à lire les users de l’AD via LDAP.
Nous le mettons dans un OU particulier.

Postfix

Nous pouvons voir que notre user ‘Reader’ possède uniquement les droits du groupe Utilisateurs du domaine.

Postfix

Mise en place de l’authentification via LDAP

Cette partie comprendra deux sous parties. La première, avec dovecot, pour pouvoir se connecter et la seconde avec postfix pour envoyer des mails.

Dovecot

Éditez le fichier /etc/dovecot/dovecot.conf et ajouter les champs suivants.

# paths for log file
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log

# Flag debug
auth_debug = yes
auth_username_format = %Lu

listen = *, ::

# path for mail location
mail_location = maildir:~/Maildir

# indicate that the connexion will use ldap and dovecot-ldap.conf as config file
passdb {
  args = /etc/dovecot/dovecot-ldap.conf
  driver = ldap
}

# postfix is a imap server
protocols = imap

# indicate that mails are stored in local machine in the virtual user vmail
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%u
}

# Improve response time
auth_cache_size = 200M
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 0
auth_cache_verify_password_with_worker = yes

Créez maintenant le fichier /etc/dovecot/dovecot-ldap.conf qui permettra de configurer la connexion ldap.


# IP of the ldap serveur (DC01 in our network)
hosts = 192.168.2.2

# Here we reach the reader user with full permissions that permit dovecot to access LDAP users
base = DC=epitaf, DC=local
dn = CN=reader,OU=specialperm,OU=Paris,DC=epitaf,DC=local
dnpass = ReaderPwd
ldap_version = 3
auth_bind = yes

# Expression of information we want to get from the LDAP request
user_filter = (&(ObjectClass=user)(|(mail=%u)(sAMAccountName=%u)))
pass_filter = (&(ObjectClass=user)(sAMAccountName=%u))

Nous pouvons désormais nous connecter à roundcube avec un utilisateur que nous venons de créer dans l’AD.

Postfix

Cela fonctionne aussi avec un utilisateur mythique de notre AD créé il y a bien longtemps.

Pour être sur que les users sont bien ceux de l’AD et pas des homonymes locaux, nous pouvons utiliser whireshark sur notre domain contrôler DC01 pour voir les requêtes LDAP.
Nous voyons ici les requêtes correspondant à notre user sbombal et qu’elles sont acceptées par le l’AD.

Postfix

Postfix

Éditez le fichier /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

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2



# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = INFRA01.domain.local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
home_mailbox=Maildir/

# Here we manage for LDAP
# Our domain
virtual_mailbox_domains = epitaf.local

# path for architecture of mail
virtual_mailbox_base = /home/vmail

# Our virtual maps that indicate the path for each user in /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/virtual_maps

virtual_minimum_uid = 1005
virtual_transport = virtual
virtual_uid_maps = static:1005
virtual_gid_maps = static:1006

mydestination = $myhostname, INFRA01.domain.local, localhost.domain.local, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

Nous allons donc maintenant créer notre virtual maps permettant à postfix de savoir ou déposer les mails envoyés.
Nous aurons une ligne par user de notre LDAP.
Créez le fichier /etc/postfix/virtualmaps et mettez y :

maverik@epitaf.local maverik/Maildir/new/message
goose@epitaf.local goose/Maildir/new/message

Tapez : postmap /etc/postfix/virtualmaps
Puis relancez postfix systemctl restart postfix Nous pouvons envoyer un mail à chaque user présent dans ce fichier.
Envoyez un mail.

Postfix

Le mail a bien été envoyé.

Postfix

Lorsque nous nous connectons sur le destinataire du mail, nous le voyons bien apparaître dans nos mails reçus.

Postfix

Nous pouvons essayer d’envoyer un mail dans l’autre sens.

Postfix

Le mail a bien été ajouté à l’architecture.

Postfix

Le mail a bien été reçu.

Postfix

Pour finir cette installation, nous allons améliorer notre service de mail déjà fonctionnel.
En effet, comme vous l’avez sûrement compris, il nous faut ajouter dans le fichier chaque user de l’AD chaque fois qu’un nouvel utilisateur est créé. Cela est fastidieux. Nous allons donc créer une tâche crone qui va se lancer plusieurs fois par jour, récupérer les users de l’AD et mettre à jour notre fichier virtual_maps.

# !/bin/sh

vmaps_file="/etc/postfix/virtual_maps"

# Delete vmaps file to have a clean one
rm -f "$vmaps_file"

# Make a ldapsearch wich is a LDAP request permitting to get all the ldap users informations
# The grep permit to get only adresse mail informations in the entire text
adresses=$(ldapsearch -x -b "dc=epitaf,dc=local" -H ldap://192.168.2.2:389 -D reader -w Cfmt.10 | grep -P '(?<=mail: ).*' -o)

# We iterate in the adresses
for one_adresse in $adresses; do
	# Get the user name for exemple 'goose'
	user=$(echo "$one_adresse" | grep -P '.*(?=@.+)' -o)

	# Create a customized path for each user
	path="${user}/Maildir/new/message"

	# Create the address mail to write in file
	new_mail="${user}@epitaf.local"

	# Write in file
	echo "${new_mail} ${path}" >> "$vmaps_file"
done

# Update the virtual maps
postmap "$vmaps_file"

Pour la récupération automatiques des adresses emails des utilisateurs de l’active directory, nous avons choisi le domaine epitaf.local par soucis de cohérence avec toutes les étapes effectuées précédemment. En pratique nous pouvions récupérer les vraies adresses emails du domaine via la variable one_adresse dans la boucle for du script (domaine epitaf.fr).