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
