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:
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.
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.
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.
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.
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.
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.
./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:
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.
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:
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.
sudo make install
Cette dernière étape prendre également quelques dizaines de secondes et devrait donner le résultat suivant:
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.
samba --version
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
.
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.
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:
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.
sudo samba-tool domain provision --use-rfc2307 --interactive
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é:
# 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.
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:
[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.
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.
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
.
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
.
kinit -V Administrator
En cas de succès vous devriez obtenir un résultat comme ci-dessous:
Vérifier le fonctionnement du DNS
Nous pouvons aussi vérifier que la résolution DNS est fonctionnelle
host -t SRV _ldap._tcp.rocky.lan
Ce qui devrait nous donner le nom de domaine du serveur samba:
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:
sudo ps -A | grep samba
Nous pouvons maintenant utiliser le PID de samba, ici 44752
, pour terminer le processus.
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
.
[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.
sudo systemclt daemon-reload
Nous pouvons vérifier que le service existe bel et bien.
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:
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.
# 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
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.
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.
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:
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
.
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 ».
sudo firewall-cmd --permanent --zone=public --add-service=samba-dc
Il ne nous reste plus qu’à recharger le service.
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
Vous devez vous connecter pour publier un commentaire.