Vendredi 1er septembre 2017 (Modifié le Vendredi 1er septembre 2017)

KVM Debian Stretch 4GB mémoire 30GB SSD

Package: 4 GB Mémoire, 2 CPU, 30 GB SSD, 100 Mbps
Selected Location: Paris
Debian Stretch 64
Livraison : vps-26381 93.115.96.97 Root Nz78NKng7LHU

Première connexion SSH

Via SSH
ssh root@93.115.96.97
Màj
apt update && apt upgrade
Modifier mot de passe root
passwd root

Configuration DNS OVH

Configuration des champs DNS domaine xoyize.xyz (OVH)

$TTL 3600
@	IN SOA dns106.ovh.net. tech.ovh.net. (2017081700 86400 3600 3600000 300)
         		  IN NS     dns106.ovh.net.
         		  IN NS     ns106.ovh.net.
         		  IN A      93.115.96.97
         		  IN AAAA   2a03:75c0:35:670d::1
                          IN MX 1   mail.xoyize.xyz.
imap                      IN A      93.115.96.97
imap                      IN AAAA   2a03:75c0:35:670d::1
mail                      IN A      93.115.96.97
mail                      IN AAAA   2a03:75c0:35:670d::1

OpenLDAP

Getting started with OpenLDAP on Debian
LDAP managed mail server with Postfix and Dovecot for multiple domains
Installation d’un serveur mail avec backend OpenLDAP

Installation

L’installation d’OpenLDAP sur Debian est faite à l’aide de la gestion des paquets APT.
root@ldaphost:~# apt install slapd ldap-utils

Pendant l’installation, vous devrez choisir un mot de passe de l’administrateur pour le compte racine LDAP. rhTJH8f97dkS65

Reconfigurer ldap

sudo dpkg-reconfigure slapd
Voulez-vous omettre la configuration d’OpenLDAP ? Non
Nom de domaine : xoyize.xyz
Nom d’entité (« organization ») : yanspm
Mot de passe de l’administrateur : f43z7C9TBwxX3h
Module de base de données à utiliser : MDB
Faut-il supprimer la base de données lors de la purge du paquet ? Non
Faut-il déplacer l’ancienne base de données ? Oui

Ensuite, nous devons redémarrer slapd .
root@ldaphost:~# service slapd restart
Et nous pouvons vérifier si les changements ont pris effet

root@ldaphost:~# netstat -lpn | grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      3106/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      3106/slapd          

Comme on peut le voir, slapd écoute les interfaces locales IPv4 et IPv6.
Mot de passe administration LDAP après reconfiguration : f43z7C9TBwxX3h

Tests
ldapsearch -x -h localhost -b "dc=xoyize,dc=xyz" -LLL "dc=xoyize" dn
dn: dc=xoyize,dc=xyz

ldapsearch -Y EXTERNAL -H ldapi:// -b cn=config "(&(objectClass=olcDatabaseConfig)(olcSuffix=dc=xoyize,dc=xyz))"

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (&(objectClass=olcDatabaseConfig)(olcSuffix=dc=xoyize,dc=xyz))
# requesting: ALL
#

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=xoyize,dc=xyz
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=xoyize,dc=xyz
olcRootPW: {SSHA}oRMsWBL+zwlKcGi0muInMrQJUTkmeD8H
olcDbCheckpoint: 512 30
olcDbIndex: objectClass eq
olcDbIndex: cn,uid eq
olcDbIndex: uidNumber,gidNumber eq
olcDbIndex: member,memberUid eq
olcDbMaxSize: 1073741824

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Modifier les accès
Exécutez la commande suivante pour créer donc notre fichier temporaire (encore une fois, exécutez les copier/coller depuis vos résultats, et non pas depuis ce tutorial :

cat > changeAccess.ldif << EOF
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcAccess
-
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=xoyize,dc=xyz" write by * none
-
add: olcAccess
olcAccess: {1}to dn.base="" by * read
-
add: olcAccess
olcAccess: {2}to * by self write by dn="cn=admin,dc=xoyize,dc=xyz" write by * none
-
EOF

Comme vous pouvez le remarquer, la seule modification apportée est le remplacement de read par none à la fin du dernier attribut.
Une fois ce fichier créé (pour lequel vous vérifierez plutôt deux fois qu’une le contenu), vous pouvez appliquer les modifications de ce fichier dans votre base :
ldapmodify -c -Y EXTERNAL -H ldapi:/// -f changeAccess.ldif

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}mdb,cn=config"

Une fois ceci fait, vérifions que nous n’avons bien plus accès à notre base en anonyme :
ldapsearch -x -c -h localhost -b dc=xoyize,dc=xyz
Le résultat devrait être semblable à celui-ci :

# extended LDIF
#
# LDAPv3
# base <dc=xoyize,dc=xyz> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Le no such object indique que la configuration est bonne. Le serveur indique qu’il n’y a pas d’objet dc=xoyize,dc=xyz. Ce qui est tout à fait logique puisque les règles empêchent un anonyme d’accéder à cette arborescence.
Essayons maintenant en nous connectant en administrateur f43z7C9TBwxX3h
ldapsearch -c -h localhost -b dc=xoyize,dc=xyz -D "cn=admin,dc=xoyize,dc=xyz" -W

# extended LDIF
#
# LDAPv3
# base <dc=xoyize,dc=xyz> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# xoyize.xyz
dn: dc=xoyize,dc=xyz
objectClass: top
objectClass: dcObject
objectClass: organization
o: spm
dc: xoyize

# admin, xoyize.xyz
dn: cn=admin,dc=xoyize,dc=xyz
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9b1JNc1dCTCt6d2xLY0dpMG11SW5NclFKVVRrbWVEOEg=

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Nous voyons bien nos résultats. Ainsi, nous pouvons considérer que la configuration de notre arborescence est bonne.

Seconde petite modification de la configuration, nous allons étendre le schéma actuel pour qu’il soit en adéquation avec les fonctionnalités de Postfix. Bien que nous n’utiliserons pas Courier comme serveur POP/IMAP, nous allons tout de même nous servir des extensions de schéma LDAP qu’il propose, dans le sens où il est très complet, documenté dans des RFC, et donc meilleur pour la portabilité.
apt install –y courier-ldap

La première (et dernière) question vous propose d’installer les répertoires nécessaires à l’administration web. Étant donné que nous n’utiliserons pas Courier, vous pouvez répondre non pour en installer le minimum.
Create directories for web-based administration? No

Nous allons copier le schéma en question dans le répertoire contenant les schémas ldap.
cp /usr/share/doc/courier-authlib-ldap/authldap.schema /etc/ldap/schema

Nous allons voir maintenant une seconde méthode pour modifier la configuration de OpenLDAP, à savoir l’utilisation de slaptest.

Mais avant ceci, nous avons besoin de savoir quels sont les schémas que OpenLDAP intègre déjà.
Pour se faire, nous allons parcourir la base cn=schema,cn=config de notre arbre, et nous allons nous limiter à l’attribut cn (Common Name) car les entrées correspondant aux schémas étant très fournies, le résultat en serait vite indigeste.
Toujours dans le souci de rendre le schéma plus digeste et de vous en faire connaître d’avantage sur ldapsearch, nous allons également utiliser –LLL qui va nous permettre de supprimer les commentaires et versions Ldif.
Ainsi, notre commande sera :
ldapsearch -Y EXTERNAL -H ldapi:// -b "cn=schema,cn=config" -LLL "(objectClass=*)" cn
Le résultat devrait être semblable à celui-ci :

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=schema,cn=config
cn: schema

dn: cn={0}core,cn=schema,cn=config
cn: {0}core

dn: cn={1}cosine,cn=schema,cn=config
cn: {1}cosine

dn: cn={2}nis,cn=schema,cn=config
cn: {2}nis

dn: cn={3}inetorgperson,cn=schema,cn=config
cn: {3}inetorgperson

Ainsi, de notre résultat, nous pouvons en conclure qu’openLDAP intègre quatre schémas (dans cette configuration), à savoir core, cosine, nis et inetorgperson. Il nous faudra également ajouter l’extension courier que nous venons d’ajouter au répertoire /etc/ldap/schema
Créons donc un fichier qui inclura tous ces schémas (ceux déjà présents, ainsi que courier).

mkdir /tmp/ldapConfig
cat > /tmp/ldapConfig/schemaInclude.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 /etc/ldap/schema/authldap.schema
EOF

Maintenant, nous allons exécuter notre commande slaptest, qui va nous convertir ce fichier (qui correspond au format des anciens fichiers de configuration LDAP) au format ldif pour pouvoir l’inclure à notre configuration.

BUG ,éditer le fichier /etc/ldap/schema/authldap.schema et à supprimer les # devant les 4 premières lignes commentées décrivant l’attribut CourierMailAccount (attention, la ligne qui commence par Objects : 1.3.6[…] est, quant à elle, bel et bien un commentaire à garder.

#attributetype ( 1.3.6.1.4.1.10018.1.1.14 NAME 'mailhost'
#        DESC 'Host to which incoming POP/IMAP connections should be proxied'
#        EQUALITY caseIgnoreIA5Match
#        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

Une fois ceci fait, nous pouvons exécuter notre commande slaptest comme suit :
slaptest -f /tmp/ldapConfig/schemaInclude.conf -F /tmp/ldapConfig
Résultat
config file testing succeeded
La commande slaptest nous a créé, dans le répertoire /tmp/ldapConfig toute une arborescence, correspondant à l’arborescence de configuration de LDAP. Je vous encourage à vous rendre dans le répertoire contenant nos schémas et à en observer le contenu :

cd /tmp/ldapConfig/cn=config/cn=schema
ls -l

Vous pourrez constater la présence d’un fichier cn={x]authldap.ldif (où x est un entier variable, chez moi par exemple, c’est 4). Nous allons effectuer quelques modifications à ce fichier. Ouvrez le avec votre éditeur préférez via l’une des deux commandes suivantes :
nano cn={*}authldap.ldif
Ligne 1 et ligne 3, supprimez les parties {x} (crochets inclus) de authldap. En fait, il s’agit de nombres que votre serveur va attribuer automatiquement, en fonctions des dépendances, nous ne souhaitons pas intervenir là-dessus.
Sur la première ligne, complétez le nom du chemin, en ajoutant : ,cn=schema,cn=config

dn: cn=authldap,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: authldap

Rendez-vous à la fin du fichier et supprimer les 7 dernières lignes, qui sont là aussi des lignes que notre serveur LDAP va générer automatiquement.
Vous avez votre fichier cn={x}authldap.ldif, prêt à être importé dans votre configuration LDAP. Pour se faire, exécutez la commande ldapadd, dont la syntaxe est assez proche de ldapsearch et ldapmodify.
ldapadd -Y EXTERNAL -H ldapi:// -f /tmp/ldapConfig/cn=config/cn=schema/cn={4}authldap.ldif

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=authldap,cn=schema,cn=config"

Il faut supprimer les packages courier-ldap utilisés pour les schémas LDAP :
apt-get purge courier-ldap courier-authlib courier-authlib-ldap courier-base courier-doc

Nous reviendrons plus tard sur la configuration, afin d’ajouter le SSL à notre annuaire car il faut que l’adresse admin@domaine.tld existe, et ce n’est pas encore le cas vu que l’on doit configurer notre serveur de mail avant.
Pour générer un hash des mots de passe (afin de ne pas stocker en clair le mot de passe de vos utilisateurs), vous pouvez utiliser la commande suivante (la seconde ligne étant le retour) :
slappasswd -s mot-passe-en-clair -h {SSHA} {SSHA}H8v4t6NnK4/rtR3IMwsCIRAgttkJkGZ+

Donc maintenant, avant d’installer Postfix, nous allons créer des entrées correspondant aux adresses email que l’on souhaite créer initialement. Afin que tous les schémas possibles soit explorés, j’ai décidé d’opter pour la configuration suivante :

#
# Création d'une arborescence mail qui contiendra l'ensemble
#

dn:dc=mail,dc=xoyize,dc=xyz
dc: mail
o: mail
objectClass: top
objectClass: dcObject
objectClass: organization


#
# Création des entrées pour les domaines à prendre en charge
# Je créée également, dans chaque domaine, une arborescence
# mailAlias, et une arborescence mailAccount, afin d'avoir un
# meilleur classement
#

dn:dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
o: xoyizexyz
dc: xoyize.xyz
description: virtualDomain
userPassword: {SSHA}cbPM32CCzgLXhxnpSq6W7OJdg7hq+zqD
objectClass: top
objectClass: dcObject
objectClass: organization

dn:dc=mailAccount,dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
dc: mailAccount
o: mailAccount
objectClass: top
objectClass: dcObject
objectClass: organization

dn:dc=mailAlias,dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
dc: mailAlias
o: mailAlias
objectClass: top
objectClass: dcObject
objectClass: organization


#
#Création des comptes mails
#

dn:mail=vargisj@xoyize.xyz,dc=mailAccount,dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
cn:vargisj@xoyize.xyz
mail:vargisj@xoyize.xyz
sn: VARGIS
givenName: Julien
displayName: Julien VARGIS
mailbox: xoyize.xyz/vargisj/
homeDirectory: /home/vmail/
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAccount
userPassword: {SSHA}cbPM32CCzgLXhxnpSq6W7OJdg7hq+zqD

dn:mail=admin@xoyize.xyz,dc=mailAccount,dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
cn:admin@xoyize.xyz
mail:admin@xoyize.xyz
sn: Administrateur
displayName: Administrateur
mailbox: xoyize.xyz/admin/
homeDirectory: /home/vmail/
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAccount
userPassword: {SSHA}cbPM32CCzgLXhxnpSq6W7OJdg7hq+zqD

dn:mail=all@xoyize.xyz,dc=mailAlias,dc=xoyize.xyz,dc=mail,dc=xoyize,dc=xyz
cn:all@xoyize.xyz
mail:all@xoyize.xyz
maildrop:admin@xoyize.xyz,vargisj@xoyize.xyz
sn: Tous
displayName: Tous
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAlias

RWThRMPQ6yHg