Installer un contrôleur de domaine Active Directory avec Samba 4 sur Rocky Linux 8

Installer un contrôleur de domaine Active Directory avec Samba 4 sur Rocky Linux 8

Depuis sa version 4, Samba permet de créer un contrôleur de domaine Active Directory et donc de se passer d’une infrastructure Microsoft et des licences qui vont avec tout en permettant l’intégration de machines client Windows. Dans cet article nous verrons comment installer Samba 4 et le configurer comme AD DC principal sous Rocky Linux 8.

Prérequis

  • Disposer d’une machine sous Rocky Linux 8
  • Savoir gérer l’installation de packages avec dnf.
  • Avoir des notions de base d’un environnement Active Directory.

Contexte de l’article

Pour la suite de l’article nous assumerons les éléments suivants:

  • Nom d’hôte du serveur samba: sambadc
  • Interface réseau: enp0s3
  • Adresse IPv4 du serveur samba: 172.16.0.10/24
  • Domaine Active Directory: rocky.lan

Installation de Samba 4

Bien que Samba 4 soit disponible depuis les packages officiels dans les dépôts de Rocky Linux 8, ceux-ci ne sont pas compilés (en tout cas à l’heure ou j’écris cet article) pour prendre en charge la création d’un contrôleur de domaine Active Directory. Il va donc nous falloir prendre les choses en main et le compiler nous même depuis les sources.

Installation des dépendances

Activation des dépôts supplémentaires

Il nous faut commencer par activer des dépôts additionnels: EPEL et Powertools:

Bash
sudo dnf install epel-release
sudo dnf config-manager --set-enabled powertools

Installation des packages RPM nécessaires à la compilation

Afin de pouvoir procéder à la compilation des sources, nous devons nous assurer de disposer de tous les outils et dépendances nécessaires.

Bash
sudo dnf install docbook-style-xsl gcc gdb gnutls-devel gpgme-devel jansson-devel \
      keyutils-libs-devel krb5-workstation libacl-devel libaio-devel \
      libarchive-devel libattr-devel libblkid-devel libtasn1 libtasn1-tools \
      libxml2-devel libxslt lmdb-devel openldap-devel pam-devel perl \
      perl-ExtUtils-MakeMaker perl-Parse-Yapp popt-devel python3-cryptography \
      python3-dns python3-gpg python36-devel readline-devel rpcgen systemd-devel \
      tar zlib-devel flex flex-devel bison bison-devel python3-markdown dbus-devel

Installation d’un module PERL via CPAN

A ce stade il nous manque encore un module Perl que nous devons installer avec CPAN: le module JSON.

Bash
sudo cpan JSON

Téléchargement des sources

Maintenant que nous avons tous les outils et dépendances nécessaires, nous pouvons télécharger les sources depuis le site officiel de Samba: https://download.samba.org/pub/samba/.

Nous utiliserons ici Samba 4.18.6, la dernière version stable au moment décrire cet article.

Bash
mkdir ~/sources
cd sources
wget https://download.samba.org/pub/samba/samba-4.18.6.tar.gz

Extraction des fichiers de l’archive

Nous pouvons maintenant utiliser tar pour extraire l’archive.

Bash
tar xvf ./samba-4.18.6.tar.gz

Nous avons maintenant un dossier ~/sources/samba-4.18.6/ qui contient les sources de Samba 4.

Compilation de Samba 4

La compilation d’un logiciel se décompose en trois étape:

  • La configuration et la vérification des dépendances
  • La compilation du code source
  • L’installation des fichiers dans notre système

Configuration et vérification des dépendances

Nous devons ici utiliser le script configure et lui passer un ensemble d’options qui définirons les options de compilation tels que les chemins où seront installé les fichiers mais aussi les options de compilation de Samba (comme le support ou non de la fonction de contrôleur de domaine). Cette étape est cruciale et indispensable.

Bash
cd samba-4.18.6
./configure --prefix=/usr \
	--enable-fhs \
	--sysconfdir=/etc \
	--localstatedir=/var \
	--with-privatedir=/var/lib/samba/private \
	--with-smbpasswd-file=/etc/samba/smbpasswd \
	--with-piddir=/var/run/samba \
	--with-pammodulesdir=/lib/x86_64-linux-gnu/security \
	--libdir=/usr/lib/x86_64-linux-gnu \
	--with-modulesdir=/usr/lib/x86_64-linux-gnu/samba \
	--datadir=/usr/share \
	--with-lockdir=/var/run/samba \
	--with-statedir=/var/lib/samba \
	--with-cachedir=/var/cache/samba \
	--with-socketpath=/var/run/ctdb/ctdbd.socket \
	--with-logdir=/var/log/ctdb

Nous pourrions aussi écrire le tout sur une seule ligne, c’est au choix.

Bash
./configure --prefix=/usr --enable-fhs --sysconfdir=/etc --localstatedir=/var --with-privatedir=/var/lib/samba/private --with-smbpasswd-file=/etc/samba/smbpasswd --with-piddir=/var/run/samba --with-pammodulesdir=/lib/x86_64-linux-gnu/security --libdir=/usr/lib/x86_64-linux-gnu --with-modulesdir=/usr/lib/x86_64-linux-gnu/samba --datadir=/usr/share --with-lockdir=/var/run/samba --with-statedir=/var/lib/samba --with-cachedir=/var/cache/samba --with-socketpath=/var/run/ctdb/ctdbd.socket --with-logdir=/var/log/ctdb

Notez que nous n’utilisons ici pas l’option qui permet d’installer le service samba pour systemd. Nous devrons le créer manuellement plus tard. L’unité systemd crée lors de la compilation n’est pas adaptée à l’utilisation de Samba 4 comme contrôleur de domaine.

Après quelques dizaines de secondes, si tout s’est bien déroulé nous devrions obtenir le résultat suivant:

Succès de la configuration de Samba 4

Compilation des sources de Samba 4

Maintenant que la configuration est terminée nous pouvons passer à la compilation des sources à l’aide de make. Petite astuce intéressante, nous pouvons gagner un peu de temps on indiquant combien de processus de compilation doivent tourner en parallèle. Ici nous le lancerons avec 4 processus en parallèle.

Bash
make -j 4

Suivant les performances de votre système la compilation peut dure quelques minutes voire une bonne dizaine de minutes. Si tout se passe bien nous devrions obtenir le résultat suivant:

Succès de la compilation de Samba 4

Installation de Samba 4

La dernière étape consiste à installer les exécutables, fichiers de configuration et tout ce qui est nécessaire dans les bons répertoires et de créer les liaisons nécessaires.

Bash
sudo make install

Cette dernière étape prendre également quelques dizaines de secondes et devrait donner le résultat suivant:

Succès de l'installation de samba 4

Vérification

Une fois installé Samba 4 devrait nous donner accès à une multitude d’exécutables, dont le principal samba. Pour vérifier si i lest bien installé, nous pouvons demander d’afficher la version.

Bash
samba --version
Afficher la version de samba

Configuration de Samba 4 en contrôleur de domaine Active Directory

Nous allons maintenant passer à la configuration de Samba 4 à proprement parler. Notez que cette partie n’est pas spécifique à Rocky Linux 8 et est applicable peu importe le système sur lequel vous auriez installé Samba 4.

Préparatifs

Nous devons nous assurer que notre système puisse résoudre son nom de domaine, dans notre cas sambadc.rocky.lan doit être résolu en 172.16.0.10. Pour ce faire nous devons éditer le fichier /etc/hosts.

/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.0.10 sambadc.rocky.lan sambadc

Ensuite nous devons supprimer le fichier de configuration par défaut de Samba 4. Un nouveau fichier sera généré lors de la création du domaine Active Directory.

Bash
sudo rm /etc/samba/smb.conf

Enfin si vous vous aviez déjà tenté une configuration de Samba, vous devez supprimer (ou déplacer) les fichiers de base de données précédemment créés. Vous pouvez les retrouver via la commande suivante:

Bash
sudo find /var/lib/samba -name *.ldp

Provisionner le domaine

Nous pouvons maintenant provisionner le domaine, c’est à dire créer la structure du domaine Active Directory. La commande suivante lance le provisionnement en mode interactif et vous demandera de répondre à quelques questions.

Bash
sudo samba-tool domain provision --use-rfc2307 --interactive
Plaintext
Realm [ROCKY.LAN]:  ROCKY.LAN
Domain [ROCKY]:  ROCKY
Server Role (dc, member, standalone) [dc]:  dc
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:  SAMBA_INTERNAL
DNS forwarder IP address (write 'none' to disable forwarding) [8.8.8.8]:  8.8.8.8
Administrator password:
Retype password:

Les informations à donner sont les suivantes:

  • Realm: le nom de domaine complet, ici: ROCKY.LAN
  • Domain: le nom de domaine Netbios, ici ROCKY
  • Server Role: le rôle du serveur, ici dc pour « Domain controller »
  • DNS backend: Le système DNS qui prendra en charge le domaine, ici SAMBA_INTERNAL (Samba dispose de base de son propre serveur DNS).
  • DNS forwarder IP Address: un serveur DNS pour rediriger les requêtes DNS en dehors du domaine, ici 8.8.8.8.
  • Administrator password: le mot de passe du compte Administrator@rocky.lan
  • Retype password: la confirmation du mot de passe.

Mise en place des fichiers de configuration

Le fichier de configuration deSamba, /etc/samba/smb.conf a été régénéré:

/etc/samba/smb.conf
# Global parameters
[global]
        dns forwarder = 8.8.8.8
        netbios name = SAMBADC
        realm = ROCKY.LAN
        server role = active directory domain controller
        workgroup = ROCKY
        idmap_ldb:use rfc2307 = yes

[sysvol]
        path = /var/lib/samba/sysvol
        read only = No

[netlogon]
        path = /var/lib/samba/sysvol/rocky.lan/scripts
        read only = No

Par contre nous devons remplacer le fichier de configuration de Kerberos /etc/krb5.conf par celui créé par le provisionnement.

Bash
sudo cp /var/lib/samba/pribate/krb5.conf /etc/krb5.conf

A titre d’information, voici le contenu du fichier généré lors du provisionnement:

/var/lib/samba/private/krb5.conf
[libdefaults]
        default_realm = ROCKY.LAN
        dns_lookup_realm = false
        dns_lookup_kdc = true

[realms]
ROCKY.LAN = {
        default_domain = rocky.lan
}

[domain_realm]
        sambadc = ROCKY.LAN

Paramétrage DNS

Nous devons maintenant faire en sorte que notre serveur, sambadc, utilise les services DNS de Samba pour la résolution des noms de domaines. Donc attribuer le serveur dns 172.16.0.10 à notre interface enp0s3. En principe c’est NetworkManager qui gère les connexions réseau.

Bash
sudo nmcli connection modify enp0s3 ipv4.dns 172.16.0.10
sudo systemctl restart NetworkManager

Premier démarrage de Samba en contrôleur de domaine.

Avant d’aller plus loin dans la configuration, nous allons tester le bon fonctionnement de notre domaine. Nous allons donc commencer par lancer Samba manuellement.

Bash
sudo samba

Par défaut samba est lancé en arrière plan. Nous pouvons vérifier qu’il est bien actif avec la commande ps.

Bash
sudo ps -aux | grep samba

Si vous voyez une série de ligne référençant samba, c’est qu’il tourne bel et bien en arrière plan.

Tests de fonctionnement

Vérifier l’authentification

Nous pouvons maintenant tester l’identification avec le compte Administrator.

Bash
kinit -V Administrator

En cas de succès vous devriez obtenir un résultat comme ci-dessous:

Succès del'obtention d'un token

Vérifier le fonctionnement du DNS

Nous pouvons aussi vérifier que la résolution DNS est fonctionnelle

Bash
host -t SRV _ldap._tcp.rocky.lan

Ce qui devrait nous donner le nom de domaine du serveur samba:

test résolution dns

Arrêter le processus samba

Avant de passer à la suite nous devons arrêter samba, puisque nous allons créer le service juste après. Nous devons dans un premier temps connaître le PID de samba:

Bash
sudo ps -A | grep samba
samba pid

Nous pouvons maintenant utiliser le PID de samba, ici 44752, pour terminer le processus.

Bash
sudo kill 44752

Création du service pour systemd

Comme dit au début de l’article, nous n’avons pas utilisé l’option permettant d’installer un service dans systemd parce qu’il n’est pas adapté à un rôle de contrôleur de domaine. Nous devons donc créer une unité de service, et l’installer.

Voici le fichier de description de service que nous devons enregistré dans /etc/systemd/system/samba-ad-dc.service.

/etc/systemd/system/samba-ad-dc.service
[Unit]
Description=Samba ADDC Daemon
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/samba/samba.pid
ExecStart=/usr/sbin/samba -D
ExecReload=/bin/kill -HUP $MAINPID


[Install]
WantedBy=multi-user.target

Une fois ce fichier créé, il faut recharger le gestionnaire de service pour prendre les modifications en compte.

Bash
sudo systemclt daemon-reload

Nous pouvons vérifier que le service existe bel et bien.

Bash
sudo systemctl status samba-ad-dc.service

Pour l’instant le service n’est pas lancé ni activé automatiquement au démarrage. Nous corrigerons ça plus tard.

Samba et SELinux

Si vous essayez de démarrer le service dans l’état actuel du système, vous devriez obtenir une erreur.

De base sur Rocky Linux, comme sur la plupart des distribution basée sur Red Hat, SELinux est en mode « Enforcing », ce qui signifie que si un service n’est correctement étiqueté, SELinux le bloquera.

Un moyen simple de vérifier est d’intéroger les logs d’audit:

Bash
sudo ausearch -c samba | grep denied

Si SELinux a bloqué l’exécution du service vous devriez avoir un résultat qui s’affiche.

Pour résoudre le problème, il y a deux approches possibles:

  • Passer SELinux en mode « Permissive » (ne surtout jamais le désactiver)
  • Corriger l’étiquetage du service

Passer SELinux en mode « Permissive »

En mode « Permissive » SELinux génère des alertes mais ne bloque rien. Surtout ne désactivez pas SELinux, c’est une extension du kernel qui permet d’ajouter une couche de sécurité extrêmement efficace à condition de bin vouloir comprendre son fonctionnement.

Pour changer son mode de fonctionnement de manière permanente il faut modifier le fichier /etc/selinux/config et définir SELINUX=permissive et ensuite redémarrer la machine.

/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
Bash
sudo reboot

Corriger l’étiquetage des fichiers et services

Le problème rencontré provient du fait que l’étiquetage SELinux des fichiers et services installés ne correspond pas aux polices de sécurité. Nous pouvons corriger ça de manière simple mais un peu lourde en demandant à SELinux de refaire l’étiquetage du système complet.

Pour ce faire, nous devons simplement créer un fichier vide .aurorelabel à la racine du système et redémarrer la machine.

Bash
sudo touch /.autorelabel
sudo reboot

Le redémarrage prendra un peu de temps, mais cette solution a le mérite de laisser SELinux en mode « enforcing » et donc de maintenait la sécurité du système.

Activer le service samba-ad-dc

Nous pouvons maintenant activer le service samba-ad-dc et le faire charger automatiquement au démarrage de la machine.

Bash
sudo systemctl enable --now samba-ad-dc.service

Notez que l’option --now provoque le démarrage immédiat du service en plus de son installation au démarrage de lamachine.

Nous pouvons vérifier que le service est bien fonctionnel:

Bash
sudo systemctl is-active samba-ad-dc.service

Samba et le firewall

Dans l’état actuel des choses, Samba est fonctionnel mais normalement, si vous êtes sous Rocky Linux, vous avez de base un firewall actif qui n’autorise aucun trafic entrant: firewalld .

Nous devons donc paramétrer firewalld pour autoriser le trafic entrant relatif aux différents services proposés par samba.

Identifier la zone à laquelle appartient l’interface du serveur

Comme nous devons autoriser des services au niveau d’une zone du firewall, nous devons connaître la zone à laquelle appartient l’interface de notre serveur, dans notre cas il s’agit de enp0s3.

Bash
sudo firewall-cmd --get-active-zone

L’interface enp0s3 est donc par défaut dans la zone « public ». Etant donné que nous n’avons ici d’une interface, nous allons simplement autoriser les services adéquats dans la zone « public ».

Autoriser les services samba-ad-dc

Par chance firewalld vient avec une description de service complète pour un serveur Samba contrôleur de domaine Active Directory: samba-dc. Nous pouvons donc ajouter cet ensemble de service de manière permanente à la zone « public ».

Bash
sudo firewall-cmd --permanent --zone=public --add-service=samba-dc

Il ne nous reste plus qu’à recharger le service.

Bash
sudo firewall-cmd --reload

Le mot de la fin

Nous avons maintenant un serveur Samba contrôleur de domaine Active Directory opérationnel qui utilise son système de DNS interne. Pour qu’une machine client puisse joindre le domaine, il suffit de lui renseigner ce serveur Samba comme serveur DNS et lancer la procédure pour joindre le domaine.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.