Aller à : navigation, rechercher

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

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

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