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 $HOSTNAMEmodifier 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 1Dans le cas d’une partition en ext4 :
UUID=9abb590f-8a5e-496f-ad2a-2c877415bdc5 / ext4 defaults,errors=remount-ro,user_xattr,acl 0 1ou 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.
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
Permettre au compte de service de Nextcloud de réinitialiser les mots de passes utilisateurs. Il faut plusieurs choses :
Récupérer l’OU sur laquelle on souhaite travailler.
Récup le sID du compte de service
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.