Samba4 (LDAP/Active Directory)

Qu’est-ce que Samba4 ?

Samba 4 est la continuité du projet de l’équipe Samba pour proposer un remplacement au domaine Windows. Bien que très intéressant, de nombreuses fonctionnalitées ne sont pas présente, et Windows reste légèrement en tête dans cette course. A savoir, pour un Linux, FreeIPA semble être une meilleur alternative (pas encore testé).

Installation

NOTE : Les dépots ne bénéficiant pas des dernières versions de samba4, on le compilera à la main. Peut-être que ça a changé depuis que j’ai commencé à travailler avec Samba, mais j’ai gardé mes habitudes … Le jour où j’irai bosser chez Tranquil IT, je verrai pour changer tout ça.

Pré-requis

Comme à chaque installation, il est important d’avoir un système à jour. Cependant, pour l’installation de samba, quelques modifications sont également à faire dans les fichiers de confs du serveur.

  • Bien vérifier que l’on est en IP fixe (se référer aux docs d’intallation du serveur)

  • Vérifier que le hostname est bien le FQDN et non juste le Name: hostnamectl set-hostname $HOSTNAME

  • modifier le fichier /etc/hosts pour qu’il connaisse le nom court et le fqdn :

 127.0.0.1 $FQDN $HOSTNANE
$IP $FQDN $HOSTNAME
  • Relancer la machine pour que les modifications soient prises en compte.

Installation des dépendances

La partie pas drôle mais obligatoire … On installe tout pleins de truc. Je suis pas sûr qu’ils soient encore tous nécessaires, mais c’est ce dont j’avais beosin il y a ……..

export DEBIAN_FRONTEND=noninteractive
apt update
apt dist-upgrade
export DEBIAN_FRONTEND=noninteractive
apt install --reinstall acl apt-utils attr autoconf bind9utils binutils bison build-essential ccache chrpath curl debhelper dnsutils docbook-xml docbook-xsl flex gcc gdb git glusterfs-common gzip heimdal-multidev hostname htop krb5-config krb5-kdc krb5-user lcov libacl1-dev libarchive-dev libattr1-dev libavahi-common-dev libblkid-dev libbsd-dev libcap-dev libcephfs-dev libcups2-dev libdbus-1-dev libglib2.0-dev libgnutls28-dev libgpgme11-dev libicu-dev libjansson-dev libjs-jquery libjson-perl libkrb5-dev libldap2-dev liblmdb-dev libncurses5-dev libpam0g-dev libparse-yapp-perl libpcap-dev libpopt-dev libreadline-dev libsystemd-dev libtasn1-bin libtasn1-dev libunwind-dev lmdb-utils locales lsb-release make mawk mingw-w64 patch perl pkg-config procps psmisc python3 python3-cryptography python3-dbg python3-dev python3-dnspython python3-gpg python3-iso8601 python3-markdown python3-matplotlib python3-pexpect python3-pyasn1 python3-setproctitle rng-tools rsync sed sudo tar tree uuid-dev wget xfslibs-dev xsltproc zlib1g-dev perl-modules-5.32
apt autoremove
apt autoclean
apt-get -y clean
unset DEBIAN_FRONTEND

Installation du binaire - MAKE

Pour récupérer les sources, direction samba.org. Dans le cas de plusieurs serveurs, s’assurer que tous les serveurs aient la même version. Version actuelle : 4.19.0.

wget https://download.samba.org/pub/samba/stable/samba-4.19.3.tar.gz -O /srv/SOURCES/samba-4.19.0.tar.gz
tar -zxf /srv/SOURCES/samba-4.19.0.tar.gz

Et aller dans le répertoire dézippé. Une fois dedans, on va configurer samba, puis l’installer. Pour ça, plusieurs choix, perso je préfère répartir mes fichiers sur différents emplacement pour respoecter une logique Linux (Les fichiers de conf dans /etc …).

cd /srv/SOURCES/samba-4.19.0
./configure --enable-fhs --bindir=/bin/ --sbindir=/sbin/ --sysconfdir=/etc/samba --libexecdir=/usr/libexec/ --libdir=/lib/ --localstatedir=/var/ --datarootdir=/usr/share/ --systemd-install-services --with-systemddir=/usr/lib/systemd/system/
make
make install

Installation du binaire - Dépots

Tranquil IT, une entreprise qui me fait bien de l’oeil propose des paquets déjà tout fait de samba4. À l’époque (2016), ils étaient à la traine, mais maintenant, on dirait qu’ils mettent moins d’un mois pour faire un nouveau paquet… On va tenter de voir ce qu’ils ont de bien :

wget -qO-  https://samba.tranquil.it/tissamba-pubkey.gpg | tee /usr/share/keyrings/tissamba.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/tissamba.gpg] https://samba.tranquil.it/debian/samba-4.19/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/tissamba.list

Configuration

Configuration des dépendances

On va commencer par le Kerberos : modifier le fichier /etc/krb5.conf et mettre dedans juste ce qui suit.

[libdefaults]
 dns_lookup_realm = false
 dns_lookup_kdc = true
 default_realm = LUCLIS.FR

Configurer le DNS pour qu’il pointe sur lui même ou sur un serveur du domaine dans resolv.conf :

domain luclis.fr
search luclis.fr.
nameserver 127.0.0.1
nameserver XXX.YYY.ZZZ.AAA ## Adresse IP d'un DC du domaine si multiples

NOTE : Dans le cas d’un serveur qui récupère son ip par DHCP, il faut « bloquer » ces paramètres dans /etc/dhcp/dhclient.conf :

interface "NOM_DE_L'INTERFACE" {
 supersede domain-name "luclis.fr";
 supersede domain-search "luclis.fr";
 prepend domain-name-servers 127.0.0.1;
}
  • supersede = Applique et ignore le DHCP

  • prepend = passe avant le DHCP puis rajoute ceux du DHCP.

Rajouter les acl sur la partition qui contient le /usr

Dans /etc/fstab, vérifier ou modifier cette ligne :

  • Pour du btrfs : UUID=3854ddc6-1cd2-4387-8e93-fa59672cf55e /   btrfs   defaults,acl    0   1

  • Dans le cas d’une partition en ext4 : UUID=9abb590f-8a5e-496f-ad2a-2c877415bdc5 / ext4 defaults,errors=remount-ro,user_xattr,acl 0 1

  • ou si on est en lvm : /dev/mapper/SytemPart-System /   ext4    defaults,errors=remount-ro,acl,user_xattr 0   1

Quoi qu’il en soit, on remonte la partition /

mount -o remount /

/!\ S’il met la moindre erreur à ce moment là, regarder les logs.
Il y a un soucis dans le fichier fstab & le disque ne voudra plus remonter. Il faudra passer par du live ou enlever le paramètre bloquant.

Configuration de samba4

Tenter d’effacer le fichier smb.conf. il va être régénéré (lors de ma tentative, il n’était pas créer). rm /usr/local/samba/etc/smb.conf

Provision du domaine AD

  • Pour le premier serveur du domaine : samba-tool domain provision --realm=LUCLIS.FR --domain=LUCLIS --function-level=2008_R2 --server-role=dc  --site=OVH /!\ Il vous donnera le mot de passe administrateur. Le noter puis le changer dès que possible.

  • Pour les autres : samba-tool domain dcpromo LUCLIS.FR DC -site=SITE /!\ Jamais testé. Il est possible qu’il demande un compte pour se joindre au domaine -ex : le compte administrator !

Modification des units systemd

systemctl unmask samba-ad-dc
systemctl enable samba-ad-dc
systemctl disable samba winbind nmbd
systemctl mask samba winbind nmbd

Modification du fichier de configuration

On vérifie que le forward dns est bien configuré dans le fichier /usr/local/samba/etc/smb.conf

[global]
    workgroup = LUCLIS
    realm =LUCLIS.FR
    netbios name = SRVPRJ01DDC
    server role = active directory domain controller
    dns forwarder = 208.67.222.222 ##Un serveur d'OPENDNS.
    idmap_ldb:use rfc2307 = yes
    tls enabled = yes
    tls keyfile = /usr/local/samba/private/tls/ad.luclis.fr.key
    tls certfile= /usr/local/samba/private/tls/ad.luclis.fr.pem
    tls cafile  = /usr/local/samba/private/tls/ca_chain.pem
    idmap config *:unix_nss_info = yes

    map acl inherit = yes
    vfs objects = acl_xattr
    winbind use default domain = yes
    winbind refresh tickets = yes
    winbind offline logon = yes
    winbind enum users = yes
    winbind enum groups = yes
    template shell = /bin/bash
    template homedir = /home/%U

/!\ Le certfile doit etre un vrai PEM (==> Que le certif en base64). Il doit egalement contenir toute la chaine de certification (cert+acd+acr). Relancer le service : systemctl restart samba-ad-dc

Tests

Si les trois tests passent, le serveur est bien configuré.

Vérifier kerberos

kinit administrator

Relancer les replications

Si vous avez plusieurs sites, les réplications auront peut-être du mal à marcher. Pour les forcer, il faut faire : samba_dnsupdate --use-samba-tool --rpc-server-ip=<IP DISTANTE> --all-names

Tester les DNS

dig @localhost google.fr
dig @localhost SRVXXXXX.LUCLIS.FR
dig -t SRV @localhost _ldap._tcp.LUCLIS.FR

/!\ NOTE : samba a besoin de ntp pour marcher. Suivre la doc qui va bien :)

Mise à jour

On trouve les mises à jour directement sur le site de samba. Deux cas, soit c’est une montée de version, et il faut refaire l’ensemble, soit c’est un patch, et il faut le télécharger, make … Ici, on parlera du patch.
Note : Ce qui je le pensais initialement aller être une ou deux lignes de commande se retrouve à être un gros script … Je ne saurai que recommandait de changer

path_root=/srv/SOURCES ##Path_root ne doit pas avoir de "." ou de "-". Sinon, il faut incrémenter en dessous les cut.
ver_full=`find $path_root -maxdepth 1 -type d -name samba* | cut -d "-" -f 2`
ver_root=`echo $ver_full | cut -d "." -f 1-2`
ver_actu=`echo $ver_full | cut -d "." -f 3`
ver_while=$ver_actu
path_full="$path_root/samba-$ver_full"
z=0

cd $path_full
while [ $z -eq 0 ] ; do
    unset patch_count
    patch_count=`curl -s https://download.samba.org/pub/samba/patches/ | grep -F $ver_root.$ver_while | wc -l`
    if [ $patch_count -ge 2 ]; then
        ver_while=$((ver_while+1))
    elif  [ $patch_count -ge 2 ] && [ $ver_while -eq 0 ]; then
        z=1
        ver_maxi=0
    else
        z=1
        ver_maxi=$((ver_while-2))
    fi
done
for ((i=${ver_actu}; i<=${ver_maxi}; i++)) ; do
    curl -s https://download.samba.org/pub/samba/patches/samba-$ver_root.$i-$ver_root.$((i+1)).diffs.gz | gunzip > $path_root/samba-$ver_root.$i-$ver_root.$((i+1)).diffs
    patch -p1 < $path_root/samba-$ver_root.$i-$ver_root.$((i+1)).diffs
done

make
make install
cd /
mv $path_full $path_root/samba-$ver_root.$((ver_maxi+1))

Autoriser la connexion depuis une machine linux

N.B : A revoir, je crois que je ne fais plus comme ça. Les enums par exemple servent à rien.
Attente d’une version plus à jour sur les dépot debian avant de migrer vers un package Rajouter dans /usr/local/samba/etc/smb.conf :

template shell = /bin/bash
winbind use default domain = true
winbind offline logon = true
winbind nss info = rfc2307
winbind enum users = yes
winbind enum groups = yes

Une fois installer et que toutes les machines sont dans le domaine, penser à créer les sites AD, les subnets, les inter-site transports, les OU & vérifier les enregistrements dns si besoins. Nota : 1 site = 1 site AD = 1 OU. 1 OU de site = 3 sous ou : groups, users, computers.

Il serait bien de faire un script pour tout provisionner rapidement.

Sécurisation

Jusqu’à présent, j’ai montré principalement comment le mettre en place, mais pas comment l’exploiter. Alors je vais commencer un petit module sur la sécurisation, et pour ça, on va parler PSO d’abord.

Création et application d’une PSO pour les comptes de service

N.B : Avant de commencer, le site tranquil-it précise qu’il faut appliquer des PSO pour tous les types de comptes à cause d’un bug de samba4. Donc il va falloir faire les 3 PSO qui vont suivre !
N.B 2 : Il est à noter que les PSO s’appliquent sur des groupes.

Les comptes de services sont des comptes à privilèges normaux. Ils ont juste la particularité d’être présent sur une application, et sont donc sensible en confidentialité (ils peuvent être écrit en clair, récupérés d’ailleurs …) mais également en disponibilité (le nombre de fois que j’ai perdu mes services à cause de ça ….).
On va donc configurer une PSO particulière d’une durée de vie de 1 an. Cette perte de sécurité va être compensée par une augmentation de la taille du mot de passe minimum (50 char).

samba-tool domain passwordsettings pso create "Service_accounts" 10 --complexity=off --store-plaintext=off --history-length=24 --min-pwd-length=50 --min-pwd-age=10 --max-pwd-age=365 --account-lockout-threshold=2

samba-tool group add "Services Accounts"
for i in `samba-tool user list | grep svc_` ; do samba-tool group addmembers "Services Accounts" $i ; done
samba-tool domain passwordsettings pso apply "Service_accounts"  "domain users"

Création et application d’une PSO pour les comptes domains Admin

Pour les administrateurs du domaine, on va être plus restrictif : historique de 24, complexité, minimum 20 caractères, changement tous les mois.

samba-tool domain passwordsettings pso create "Domains_Admins" 1 --complexity=on --store-plaintext=off --history-length=24 --min-pwd-length=20 --min-pwd-age=10 --max-pwd-age=30 --account-lockout-threshold=2
samba-tool domain passwordsettings pso apply "Domains_Admins"  "Administrators"

Création et applicaiton d’une PSO pour les comptes standards

Enfin, comme il ne doit y avoir presque personne en compte standard, on va faire une politique à peu près tranquille pour les utilisateurs : 8 caractères + historique de 24 et changement tous les trois mois.

samba-tool domain passwordsettings pso create "Other_accounts" 50 --complexity=on --store-plaintext=off --history-length=24 --min-pwd-length=8 --min-pwd-age=10 --max-pwd-age=92 --account-lockout-threshold=2
samba-tool domain passwordsettings pso apply "Other_accounts"  "domain users"

On pensera évidemment à changer les mots de passes qui ne sont pas conformes à la politique.

Utilisation

Permettre la modification de mot de passe LDAP (Samba4)

Par défaut, il est impossible de changer son mot de passe samba4 depuis une autre application. Il va donc falloir modifier en profondeur Samba4 mais également Nextcloud pour que cela fonctionne. Tout d’abord, il faut modifier la configuration de Nextcloud pour lui préciser que l’on changera désormais les mots de passe dans l’AD. En ligne de commande, ça donne ça :

sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 turnOnPasswordChange 1

Sinon, en interface graphique, il faut se connecter avec un utilisateur disposant des droits d’administration => Paramètres => Intégration LDAP/AD => Avancé ==> Paramètre du dossier puis cocher la case Activer la modification du mot de passe LDAP par l’utilisateur.

Une fois cette modification faite, le reste est à changer côté samba. Pour plus de détail, regarder l’article de Kiljan.

  1. Permettre aux utilisateurs de changer leur mot de passe : Pour cela, il faut modifier le comportement de base de l’AD en changeant un paramètre du schéma.

ldbedit -e vim -H /var/lib/samba/private/sam.ldb -b 'CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=luclis,DC=fr' '(objectClass=ntDSService)'
# Rajouter n'importe où la ligne dSHeuristics: 000000001
  1. Permettre au compte de service de Nextcloud de réinitialiser les mots de passes utilisateurs. Il faut plusieurs choses :

    1. Récupérer l’OU sur laquelle on souhaite travailler.

    2. Récup le sID du compte de service

    3. Modifier l’ACL. Cette opération se fait facilement avec Windows, c’est une plait en ligne de commande.

samba-tool ou list
#OU=USERS
#OU=ADMINS
samba-tool user show svc_nextcloud | grep objectSid
#objectSid: S-1-5-21-1717557130-3947787066-4056617609-1106
#Pour les feigants : sid=`samba-tool user show svc_nextcloud | grep objectSid | cut -d " " -f 2`
samba-tool dsacl set --action=allow --objectdn='OU=USERS,DC=LUCLIS,DC=FR' --sddl="\ (OA;CIIO;CR;00299570-246d-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;\ $SID)"

Et voilà. La modification est faites, les mots de passes peuvent se changer facilement.

TroubleShooting

Autres sources