Installation du serveur

LDAP

Installation

pacman -S openldap

Configuration

La première chose à faire est de générer un hash pour le mot de passe à utiliser pour gérer le serveur LDAP. Pour cela, on utilise la commande :

slappasswd -h {SSHA}
Astuce Ce hash servira dans plusieurs fichiers de configuration, mieux vaut le mettre de côté pendant la mise en place de LDAP.

On va ensuite créer un certificat et une clé de cryptage auto-signés pour sécuriser les communications. On commence par générer ces deux fichiers à l’aide de cette commande :

openssl req -new -x509 -nodes -out slapdcert.pem -keyout slapdkey.pem -days 3650
Important S’il n’est pas nécessaire de répondre aux questions posées par le programme, il est en revanche requis de donner comme ‘Common name’ le nom DNS complet du serveur LDAP.

On créé le dossier /etc/openldap/ssl et on y déplace les deux fichiers générés.

Important La clé doit être lisible par root seulement, mais le certificat doit l'être pour tous. Il convient donc d’appliquer les droits 400 sur slapdkey.pem et 444 sur slapdcert.pem.

On modifie ensuite le fichier /etc/openldap/slapd.conf. Commentaires retirés, il ressemble à ça :

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
#include                /etc/openldap/schema/samba.schema

pidfile   /var/run/slapd.pid
argsfile  /var/run/slapd.args

# À décommenter lors de l'installation de samba
#access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdMustChange,sambaPwdLastSet,shadowLastChange,shadowMax
# by self write
# by * auth

access to * by * read

database        bdb

suffix          "dc=arda"
# Le nom de l'administrateur sera 'root'.
rootdn          "cn=root,dc=arda"
# À remplacer avec le hash de votre mot de passe.
rootpw          {SSHA}Gb4Ka3wc2BsHmXOxq+LJnkfXw89Brjf1
directory       /var/lib/openldap/openldap-data
index   objectClass     eq

TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCertificateFile /etc/openldap/ssl/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/ssl/slapdkey.pem

On a ausi besoin d’un fichier de config pour la base. On part du fichier d’exemple :

cp /var/lib/openldap/openldap-data/DB_CONFIG.example /var/lib/openldap/openldap-data/DB_CONFIG

Il n’est pas nécessaire de le modifier.

On va maintenant configurer le serveur pour qu’il écoute sur le port sécurisé et n’autorise les connexions non-cryptées que localement. Pour cela on édite le ficher /etc/conf.d/slapd et on modifie la ligne SLAPD_SERVICES de cette façon :

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:///"
Autorisation

On a en général besoin de modifier le /etc/hosts.allow pour autoriser les connexions au démon LDAP, en ajoutant cette ligne :

slapd: ALL
Activation

On peut maintenant lancer le serveur.

/etc/rc.d/slapd start

Tant qu'à faire, autant en profiter pour l’ajouter aux démons dans le /etc/rc.conf.

Insertion des données de base

On créé un fichier temporaire avec ces données :

# Domaine arda
dn: dc=arda
objectClass: dcObject
objectClass: organization
o: arda
dc: arda

# Administrateur
dn: cn=root,dc=arda
cn: root
description: LDAP administrator
roleOccupant: dc=arda
objectClass: organizationalRole
objectClass: top
Important Il faut bien laisser une ligne vide entre chaque objet à ajouter.

On l’ajoute à l’arbre:

ldapadd -x -H ldap://127.0.0.1 -D 'cn=root,dc=arda' -W -f base.ldif

Samba

Installation

pacman -S samba

On compile aussi le paquet smbldap-tools depuis le AUR.

Astuce yaourt est très pratique pour installer des paquets depuis AUR. Voir http://archlinux.fr/yaourt

Intégration à LDAP

On ajoute le schéma Samba à openLDAP :

cp /usr/share/doc/samba/examples/LDAP/samba.schema /etc/openldap/schema/

Et on l’active dans la config en décomentant cette ligne au fichier /etc/openldap/slapd.conf :

include         /etc/openldap/schema/samba.schema

On décommente également les trois lignes d’ACL plus bas, afin de protéger les mots de passe des comptes.

On redémarre maintenant le serveur LDAP :

/etc/rc.d/slapd restart

Samba utilisera LDAP pour gérer les informations des utilisateurs. Il utilisera en revanche des appels système pour vérifier que l’utilisateur existe. Il est donc nécessaire de configurer LDAP dans NSS et PAM. Pour cela, suivre les instructions de l'installation du client Arch jusqu'à la section Configuration de NFS exclue.

Configuration

Samba

On place ceci dans le fichier /etc/samba/smb.conf :

[global]
log level = 1
workgroup = arda
netbios name = iluvatar
server string = iluvatar
domain master = Yes
local master = Yes
domain logons = Yes
os level = 40
preferred master = Yes
lock directory = /var/cache/samba
passwd program = /usr/bin/smbldap-passwd ?u %u
ldap passwd sync = Yes
passdb backend = ldapsam:ldap://127.0.0.1/
security = user
ldap admin dn = cn=root,dc=arda
ldap suffix = dc=arda
ldap group suffix = ou=group
ldap user suffix = ou=people
ldap machine suffix = ou=machines
add user script = /usr/bin/smbldap-useradd -a -m "%u"
ldap delete dn = Yes
delete user script = /usr/bin/smbldap-userdel "%u"
add machine script = /usr/bin/smbldap-useradd -W "%u"
add group script = /usr/bin/smbldap-groupadd -p "%g"
delete group script = /usr/bin/smbldap-groupdel "%g"
add user to group script = /usr/bin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/bin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/bin/smbldap-usermod -g "%g" "%u"
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
case sensitive = No
default case = lower
preserve case = yes
short preserve case = Yes
dns proxy = No
wins support = Yes
hosts allow = 172.16.0.0/12 127.0.0.0/8 192.168.100.0/24
winbind use default domain = Yes
nt acl support = Yes
msdfs root = Yes
hide files = /desktop.ini/ntuser.ini/NTUSER.*/
ldap ssl = no
admin users = root
log file = /var/log/samba/%m
logon script = logon.bat
load printers = No
[homes]
   comment = Home Directories
   browseable = no
   writable = yes
[netlogon]
   path = /usr/lib/samba/netlogon
   writable = no
   browseable = no
[public]
   comment = Public Stuff
   path = /export/share
   public = yes
   writable = yes
   printable = no
[documents]
   path = /export/documents
   writable = no
   hide dot files = yes
   veto files = /./../
   guest ok = no
   browseable = yes
   printable = no
[devoirs]
   path = /export/devoirs
   writable = yes
   guest ok = no
   hide dot files = yes
   veto files = /./../
   browseable = yes
   printable = no

Puis on créé le dossier /usr/lib/samba/netlogon et on y place un fichier logon.bat avec ce contenu :

net use Z: \\iluvatar\homes
net use Y: \\iluvatar\documents
net use X: \\iluvatar\devoirs
net use W: \\iluvatar\public
Smbldap

On modifie le fichier /etc/smbldap-tools/smbldap_bind.conf pour simplement mettre les bons DN et le mot de passe du root LDAP, en clair.

Avertissement Changer les droits de ce fichier pour 600. Il contient un mot de passe administrateur LDAP en clair et ne doit donc être lisible par personne d’autre que root.

On met ensuite ceci dans /etc/smbldap-tools/smbldap.conf :

#SID=""
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
verify="require"
suffix="dc=arda"
usersdn="ou=people,${suffix}"
computersdn="ou=machines,${suffix}"
groupsdn="ou=group,${suffix}"
sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}"
scope="sub"
hash_encrypt="SSHA"
crypt_salt_format="%s"

userLoginShell="/bin/bash"
userHome="/export/home/%U"
userHomeDirectoryMode="700"
userGecos="User"
defaultUserGid="600"
defaultComputerGid="500"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="36500"

with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"

with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

On donne ensuite à Samba le mot de passe root de LDAP. Pour cela on arrête le serveur et on tape :

smbpasswd -w secret
Attention Fermer le terminal et supprimer le fichier ~/.bash_history pour ne pas laisser le mot de passe en clair dans l’historique des commandes.
Note Avant de poursuivre, il vaut mieux créer les différents dossiers pour les partages, comme le /export, /export/home, /export/documents etc…

On démarre ensuite Samba avec la commande

/etc/rc.d/samba start

Et tant qu'à faire, on l’ajoute dans la liste des démons à démarrer du rc.conf.

Attention samba doit être placé après network, lui-même au premier plan, pour qu’il puisse se configurer correctement et accepter les clients Windows.

On demande à Samba de nous donner le SID du domaine :

net getlocalsid
Important Si cette commande retourne une erreur ou un warning, il vaut mieux ne pas aller plus loin et chercher l’origine de l’erreur.

Puis on place ce SID à la ligne SID="" du fichier /etc/smbldap-tools/smbldap.conf.

Installation des tables Samba

On utilise la commande suivante pour créer les tables Samba dans l’annuaire LDAP :

smbldap-populate
Important Avant d’essayer d’ajouter des machines ou des utilisateurs au domaine, il faut créer quelques groupes de base. Voir la section Gestion des comptes.

NFS

Installation

Les paquets à installer sont nfs-utils et rpcbind.

Configuration

On indique les partages dans le fichier /etc/exports. Par exemple :

/export                        *.arda(rw,sync) *(rw,sync) ambarona.arda(ro,sync,no_root_squash)

Ensuite on modifie le /etc/hosts.allow pour autoriser rpcbind, puis on démarre (et on active au démarrage) les démons rpcbind et nfs-server.

Note D’après le Wiki, il faut autoriser les connexions à nfsd et mountd dans le /etc/hosts.allow. Mais dans mon cas de test ça n’a pas été nécessaire…

Si on souhaite utiliser NFS en version 3, il n’y a rien d’autre à faire. Pour NFSv4 en revanche, il faut activer le démon idmap pour permettre la correspondance des UID/GID.

Configuration de idmap

Le premier fichier à modifier est /etc/conf.d/nfs-common.conf. Deux modifications sont à faire :

  • Mettre NEED_STATD à no

  • Mettre NEED_IDMAPD à yes

Le second fichier à éditer est le /etc/idmapd.conf. On indiquera arda comme Domain et nsswitch comme Method (cas par défaut). Enfin, on ajoute le service nfs-common à la liste des démons du /etc/rc.conf, avant nfs-server ou netfs et après rpcbind.

Installation des clients

Archlinux

Installation

pacman -S openldap nss_ldap pam_ldap rpcbind nfs-utils

Configuration

Configuration de LDAP

On commence par copier le certificat SSL créé sur le serveur. On le place au même endroit (/etc/openldap/ssl/slapdcert.pem). On ne copie pas la clé.

Puis on modifie le fichier /etc/openldap/ldap.conf pour y ajouter cette ligne :

BASE dc=arda
URI ldaps://iluvatar.arda:636/
TLS_CACERT /etc/openldap/ssl/slapdcert.pem
TLS_REQCERT allow
Configuration de NSS

On commence par modifier le /etc/nss_ldap.conf. Il contiendra :

host iluvatar.arda
base dc=arda
rootbinddn cn=root,dc=arda
port 636
pam_login_attribute uid
pam_template_login_attribute uid
nss_base_passwd ou=people,dc=arda?one
nss_base_shadow ou=people,dc=arda?one
nss_base_group          ou=group,dc=arda?one
ssl start_tls
ssl on
tls_checkpeer no
# Pour éviter un délai de 5 minutes lors d'une connexion console quand le serveur LDAP est indisponible
bind_policy soft

On modifie ensuite le /etc/nsswitch.conf :

passwd: files ldap
group: files ldap
shadow: files ldap
Configuration de PAM

On modifie /etc/pam_ldap.conf, en y mettant en fait la même chose que dans le nss_ldap.conf ci-dessus.

On modifie maintenant plusieurs fichiers du dossier /etc/pam.d.

Note Ces fichiers du dossier /etc/pam.d définissent pour plusieurs entités (login, shadow, su…) les modules à utiliser (pam_ldap.so, pam_unix.so…) pour différentes authentifications (auth, account, …).
Important Chaque ligne doit être ajoutée en haut de la liste de l’authentification qu’elle concerne, sauf pour le fichier login. Voir des exemples plus bas.

On ajoute ces lignes aux fichiers shadow, su, sshd, et other :

auth            sufficient      pam_ldap.so
account         sufficient      pam_ldap.so

Cette ligne aux fichiers passwd, shadow, sshd, et other :

password        sufficient      pam_ldap.so

Et cette ligne aux fichiers shadow et su :

session         sufficient      pam_ldap.so
Exemple : fichier other
#%PAM-1.0
auth            sufficient      pam_ldap.so # <-- Placé avant le module unix
auth            required        pam_unix.so
account         sufficient      pam_ldap.so # <-- et ainsi de suite
account         required        pam_unix.so
password        sufficient      pam_ldap.so
password        required        pam_unix.so
session         required        pam_unix.so
Extrait : fichier login

Tel que présent sur un système Archlinux en date du 5er juillet 2011, avec les modifications concernant LDAP.

#%PAM-1.0
auth            required        pam_securetty.so
auth            requisite       pam_nologin.so
auth            sufficient      pam_ldap.so
auth            sufficient      pam_unix.so nullok use_first_pass
auth            required        pam_deny.so
(...)
account         sufficient      pam_ldap.so
account         required        pam_access.so
account         required        pam_time.so
account         required        pam_unix.so
(...)
session         required        pam_unix.so
session         required        pam_env.so
session         required        pam_motd.so
(...)
Note On ne configure ici que le système de base. Des gestionnaires de connexion comme gdm ou slim créeront leur fichier également. Il faudra y appliquer des modifications similaires à celles du fichier login ci-dessus.

À titre d’exemple, je mets à disposition les fichiers configurés pour Archlinux en date du 8 juin 2011.

Configuration de NFS

On créé d’abord le dossier /export. Ensuite on peut ajouter cette ligne au /etc/fstab :

iluvatar.arda:/export   /export nfs     rw,vers=4,hard,intr,nodev,nosuid,proto=tcp,retrans=2    0       0
Note Il faut que le démon netfs soit activé dans le rc.conf, après network qui doit donc se lancer au premier plan (sans le @).

Quand on utilise NFS en version 4, il faut également activer le démon idmap pour permettre la correspondance des UID/GID sur les clients. Pour celà voir les instructions de mise en place plus haut.

Note Si NFS est utilisé en version 3, il faut modifier l’option vers de l’exemple ci-dessus.

Windows XP

Important Un serveur DNS fonctionnel résolvant le nom du serveur est requis. De plus, si le client n’est pas sur le même réseau que le serveur Samba, il faut lui indiquer l’adresse IP du serveur comme serveur WINS. Cela peut se faire de façon statique ou sur un serveur DHCP comme ceci :
option netbios-name-servers 172.16.1.30;

Modification du registre

Il faut modifier une valeur dans le registre pour que la jonction au domaine Samba puisse se faire. On ouvre donc regedit et on modifie la valeur suivante :

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\netlogon\parameters

    • Mettre la valeur dword "RequireSignOrSeal" à 0.

Il ne reste plus qu'à rejoindre le domaine.

Windows 7

La procédure générale est identique à celle de Windows XP, mais les valeurs de registre à modifier sont différentes.

Modification du registre

Gestion des comptes

Ajout d’un groupe

Avant d’ajouter le premier utilisateur, il faut créer un groupe pour l’accueillir. On utilise la commande :

# Groupe au gid 610 nommé students10
smbldap-groupadd -a -g 610 students10

Avant qu’une machine puisse rejoindre le domaine Samba, il faut également créer le groupe par défaut des machines, indiqué par la valeur defaultComputerGid du /etc/smbldap-tools/smbldap.conf.

# Groupe 500 dans notre exemple
smbldap-groupadd -a -g 500 machines

Ajout d’un utilisateur

smbldap-useradd -a -c "Regis Brouard" -P -g 610 -d /export/home/an10/regis \
-C "\\\\iluvatar.arda\homes\an10\regis" -m regis
Note On met bien quatre barres obliques inversées. Les accents dans les noms semblent poser problème avec ces scripts.

Migration depuis Samba/NIS

Les Migration Tools permettent de faciliter la migration d’un environnement NIS vers LDAP. Malheureusement, il ne prennent pas en charge Samba. Nous proposons donc un script utilisant les smbldaptools pour effectuer la migration. Son fonctionnement est décrit dans le fichier README de l’archive.

Important La méthode de migration proposée ne conserve pas les anciens SID Samba. Pour éviter des erreurs de connexion, il faut soit que les machines Windows soient ‘neuves’, soit qu’un ménage y soit fait en effacant les dossiers contenus dans C:\Utilisateurs et en effacant les clés contenues dans la clé de registre HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList. Dans tous les cas, il faudra effacer le fichier NTUSER.DAT du dossier profile.V2 de chaque utilisateur. Ceux-ci devront ouvrir leur session deux fois avant de récupérer leurs documents.

Maintenance

Il arrive qu’une des fréquentes mises à jour d’Arch Linux casse un des composants de ce système. Chaque problème a sa solution et c’est dans cette section qu’elles seront décrites.

Berkley DB

OpenLDAP utilise une base de données BDB. Lorsque le paquet db est mis à jour, il se peut que le serveur OpenLDAP cesse de fonctionner car sa base doit être mise à jour. On trouve dans les journaux des messages de ce type :

Program version 5.2 doesn't match environment version 5.1
Note Je ne connais pas BDB. La solution donnée ici est celle que j’ai utilisé lorsque j’ai rencontré ce problème, il se peut qu’elle soit incomplète.

Pour effectuer la migration, il faut d’abord réinstaller la version précédente de db (ou faire la migration avant la mise à jour). Il est probable que le paquet de la précédente version soit encore dans /var/cache/pacman/pkg. Dans notre exemple, on le réinstalle comme ceci :

pacman -fd -U /var/cache/pacman/pkg/db-5.1.25-1-x86_64.pkg.tar.xz

On se rend ensuite dans le dossier de la base d’OpenLDAP, soit /var/lib/openldap/openldap-data/, puis on exécute les commandes suivantes (le serveur LDAP étant arrêté) :

db_checkpoint -1
db_recover

Il ne reste plus qu'à réinstaller de la même manière la dernière version de db et relancer le serveur LDAP.

Note Il pourrait également être nécessaire d’exécuter db_recover -e après avoir mis à jour db. Je n’ai pas d’informations précises sur ce détail.