SAMBA - Synchronisation des mots de passe entre un Samba4 et une OpenLDAP
Besoin d'accompagnement, n'hésitez pas à nous contacter chez http://www.tranquil.it
Sommaire
Prérequis
- Vous devez utiliser une version récente de samba (>= 4.5 ) et avoir compilé Samba avec le support gpgme.
Dans notre documentation SAMBA - Installer Samba 4, le support gpgme est actif
- On part du principe que le domaine est en place et que vous avez suivi cette documentation : SAMBA - Installation d'un AD Samba4 pour un nouveau domaine
- Seul les nouveaux changements de mot de passe seront répliqués
Génération de clé la GPG
Il faut installer le paquet rng-tools
yum install rng-tools python-ldap python-gpgme
ou
apt-get install rng-tools python-ldap python-gpgme
On génère le l'entropie
rngd -r /dev/urandom
On prépare le fichier de clé samba-key
Key-Type: 1 Key-Length: 2048 Subkey-Type: 1 Subkey-Length: 2048 Name-Real: samba Name-Email: root@localhost Expire-Date: 0
On génère la clé
gpg --batch --gen-key samba-key
On affiche l'id de la clé
gpg --list-keys --with-colon samba 2> /dev/null | awk -F: '/^pub:/ { print $5 }'
Ajouter la clé à la fin de la section [global] dans le fichier /etc/samba/smb.conf
password hash gpg key ids = E5104421691AC214
Ajout des scripts
On créé le script de synchronisation des mots de passe /opt/syncpwd.py et on modifie les variables du début
#!/usr/bin/python2 # -*- coding: utf-8 -*- import ldap import ldap.modlist as modlist import sys import time pdc_host = "srvpdc" pdc_base_dn = "dc=test,dc=lan" pdc_user = "cn=admin," + pdc_base_dn pdc_password = "Mot_de_passe" pdc_ou = "ou=monsite" if pdc_ou and not pdc_ou.endswith(','): pdc_ou = pdc_ou+',' def ldap_connection(server, bind_dn, bind_password): l = ldap.initialize('ldap://' + server) l.protocol_version = 3 l.set_option(ldap.OPT_REFERRALS, 0) l.simple_bind_s(bind_dn, bind_password) return l def set_user_password(ldap_destination, sAMAccountName, new_password): Filter = "(&(objectClass=sambaSamAccount)(uid=%s))" % (sAMAccountName) Attrs = ["dn", 'userPassword', 'uid','shadowLastChange','shadowExpire'] result = ldap_destination.search(pdc_ou+pdc_base_dn, ldap.SCOPE_SUBTREE, Filter, Attrs) result_type, result_data = ldap_destination.result(result, 0) if not len(result_data) > 0: print "DONE-EXIT: User '%s' not exist" % sAMAccountName sys.exit(0) try: dn, data = result_data[0] old = { 'userPassword': data['userPassword'], 'shadowLastChange': data.get('shadowLastChange',[]), 'shadowExpire': data.get('shadowExpire',[]), } changed_on = int(time.time()/(24*3600)) new = {'userPassword': [new_password], 'shadowLastChange': ["%s"%changed_on] , 'shadowExpire': ["%s"% (changed_on + 90,)], } ldif = modlist.modifyModlist(old, new) ldap_destination.modify_s(dn, ldif) except Exception, e: print "DONE-EXIT: Exception %s" % e ldap_destination = ldap_connection(pdc_host, pdc_user, pdc_password) user = {} for line in sys.stdin.read().split('\n'): if "sAMAccountName:" in line: user['sAMAccountName'] = line.split(':')[1].strip() if "virtualSSHA:" in line: user['password'] = line.split(':')[1].strip() if len(user) == 2: set_user_password(ldap_destination, user['sAMAccountName'], user['password']) print "DONE-EXIT: change password to %s " % user['sAMAccountName'] else: print "DONE-EXIT: NOK"
On met les bons droits
chmod 750 /opt/syncpwd.py
On créé le fichier systemd /lib/systemd/system/samba-syncpasswords.service
[Unit] Description=samba-syncpasswords After=network-online.target [Service] ExecStart=/usr/bin/samba-tool user syncpasswords Restart=always SyslogIdentifier=samba-syncpasswords TimeoutStopSec=10 [Install] WantedBy=multi-user.target
Lancement
On relance samba
smbcontrol ALL reload-config
On génère le cache des mots de passe
samba-tool user syncpasswords --cache-ldb-initialize --attributes=virtualSSHA,samaccountname --script=/opt/syncpwd.py --decrypt-samba-gpg
On lance le service
systemctl enable samba-syncpasswords systemctl start samba-syncpasswords
Tests
La commande suivante permet d'avoir le hash SSHA de l'utilisateur test
samba-tool user getpassword test --attributes=virtualSSHA --decrypt-samba-gpg
En cas de plusieurs DC
Sur tous les autres contrôleurs de domaines
- Installer rng-tools python-ldap python-gpgme rsync
- Copier la clé gpg
rsync -av dc1:/root/.gnupg/ /root/.gnupg/
- Répéter les actions de la DOC sauf la partie génération de clé GPG