Joindre une machine Arch Linux à un domaine Active Directory

Joindre une machine Arch Linux à un domaine Active Directory

Plan de mise en place

1-Présentation

2-Prérequis

3-Configuration du réseau

4-Mise à jour du système et installation des paquets nécessaires

5-Paramétrage du fichier "ntp.conf"

6-Paramétrage du fichier "krb5.conf"

7-Paramétrage du fichier "smb.conf"

8-joindre le serveur Active Directory

9-Démarrage des services

10-Paramétrage du fichier "nssswitch.conf"

11-Paramétrage du fichier"pam_winbind.conf"

12-Paramétrage des fichiers "system-auth" et "su"

13-Connexion d'un utilisateur Active Directory en mode Shell

14-Connexion d'un utilisateur Active Directory en mode graphique

15-Recommandations

1-Présentation

💡
Active Directory est une implémentation de Windows Server, système d'exploitation de Microsoft pour gérer un serveur. Cette fonction permet de centraliser et d’administrer les accès et permissions d’une structure d’un parc informatique comprenant des objets tels : Les machines du réseau, serveur, poste de travail, périphériques, Les utilisateurs, Les groupes et les ressources.

Il y a d'autres systèmes qui utilise le même principe qu'Active Directory.
Sous Linux, par exemple vous avez Samba AD mais ce n'est pas le but de cette note, on ne va pas développer plus en avant le sujet. Arch Linux est aussi une ancienne distribution Linux "Open source"[1], elle date de l'année 2002. Contrairement à Debian qui livre une mise à jour majeur très ponctuellement, Arch Linux fonctionne sur le principe du "Rolling release", c'est à dire qu'elle maintient son système en continu sur les dernières évolutions. Elle est très stable et vraiment facile d'accès. La communauté autour de cet OS insiste sur le principe "Kiss" "Restons simple" car le but, c'est que chaque utilisateur doit comprendre le système sur lequel il évolue.


  1. L'Open Source, on en parle ici ↩︎

2-Prérequis

Conditions d'installation "Machine Virtuelle"

L’installation est réalisée selon les critères suivants:

La machine virtuelle s'appuie entièrement sur son Hôte en l’occurrence Proxmox, elle permet d'affiner les réglages , elle peut aussi utiliser le matériel directement par le "passtrough", Elle est plus gourmande en ressource qu'un conteneur.

  • Proxmox PVE 8.3
  • Machine Virtuelle
  • Utilisateur non root avec privilège
  • Arch Linux
  • Windows "Serveur" 2019

Il existe deux méthodes pour joindre un système Linux à Active Directory :
Celle qui consiste à utiliser le duo "Samba et Winbind" et la méthode d'authentification qui utilise "SSSD" (System Security Services Daemon).

Pour intégrer Arch Linux, on va utiliser le duo "Samba-Winbind", d'une part pour appréhender l'autre méthode que celle utilisée avec Linux Debian et d'autre part, je n'ai pas obtenu à ce jour une méthode simple intégrant "SSSD".

Pour info :
"Windows Server version 2019" : est le serveur de domaine "Active Directory" ainsi que le serveur "DNS".
10.0.0.150 : est L'IP de notre serveur.
"ad-win1" : est le nom du serveur (hostname).
"rzt.lan": est le nom de domaine.
"rzt": sera le nom de domaine "netbios"(cela n'est pas exact mais cà facilite la compréhension.
Version de Arch Linux : le test est réalisé sur Linux "Endeavours" Gnome

💡
La composition d'un nom de domaine "complet" on dit "FQDN" (Fully Qualified Domain Name). Pour exemple "ad-win1.rzo.lan": ad-win1 est le "hostname"(sous domaine), rzt est le domaine, lan est le TLD (domaine de premier niveau)

3-Configuration du réseau

On va démarrer cette installation en ouvrant le fichier « hostname » afin de modifier le nom de la machine s’il a lieu de le faire :

# sudo nano /etc/hostname

Le contenu:

sta-arco

Le nom de notre station de travail est "sta-arco", c'est assez explicite, on le garde.

On va ouvrir le fichier "resolv.conf" pour vérifier si notre Arch linux est déjà connecté au bon serveur DNS, c'est à dire notre serveur Windows server :

# sudo nano /etc/resolv.conf

Le contenu :

GNU nano 7.2                                                  /etc/resolv.conf
 1 # Generated by NetworkManager
 2 search rzt.lan
 3 nameserver 10.0.0.154
 4 nameserver 2a01:e0a:4e8:ffa1:ffff:ffff:ffff:ffff
 5 nameserver 2606:4700:4700::1111
 6

Ce n'est pas le cas, pour cet exemple, nous allons modifier le serveur DNS de cette instance. Cela ne sert à rien d'agir sur ce fichier car il dynamique, il est généré automatiquement à chaque démarrage

On va rester sur le Shell de commande pour réaliser cette modification et utiliser l'outil "nmtui":

# sudo nmtui

NMTUI1.png

---> Modifier une connexion.

NMTUI2.png

---> Modifier sur le nom de la connexion.

NMTUI3.png

--->Afficher la connexion IPv4.

NMTUI4ARCO.png

  1. ---> Ajouter un serveur DNS "10.0.0.150".
  2. ---> Ajouter le nom de domaine du serveur DNS.
  3. ---> Cocher "ignorer les paramètres DNS obtenus automatiquement".
  4. ---> Désactivez l'IPv6, cela n'est pas nécessaire pour l'instant.
  5. ---> Valider.

On va vérifier maintenant le fichier "hosts" de la machine :

# sudo nano /etc/hosts

Le contenu :

# Standard host addresses
127.0.0.1  localhost
::1        localhost ip6-localhost ip6-loopback
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
# --->INSCRIVEZ dessous : le nom de la machine dans le domaine
127.0.1.1  sta-arco.rzt.lan  sta-arco
# --->INSCRIVEZ dessous : l'adresse du serveur DNS, ça aide !
10.0.0.150 ad-win1.rzt.lan   ad-win1

Inscrivez les deux lignes comme indiqué, cela permet d'être correctement identifié sur le réseau et de joindre le DNS sans problème.

On va effectuer un ping sur notre nom de domaine pour vérifier qu'il est bien joignable :

# ping rzt.lan

Le résultat :

--- statistiques ping rzt.lan ---
7 paquets transmis, 7 reçus, 0% packet loss, time 6124ms
rtt min/avg/max/mdev = 0.130/0.261/0.336/0.062 ms

On va vérifier si le serveur DNS est bien résolu par son IP (recherche inversée) avec "nslookup" :

# nslookup 10.0.0.150

Le résultat :

150.0.0.10.in-addr.arpa name = ad-win1.rzt.lan.
150.0.0.10.in-addr.arpa name = rzt.lan.

On va vérifier si le serveur DNS est bien résolu par son nom de domaine avec "nslookup" :

# nslookup ad-win1.rzo.lan

Le résultat :

Server:         10.0.0.150
Address:        10.0.0.150#53

Name:   ad-win1.rzt.lan
Address: 10.0.0.150
Name:   ad-win1.rzt.lan
Address: 2a01:e0a:4e8:ffa1::24
Name:   ad-win1.rzt.lan
Address: fde9:238a:e3d2:5347:3e26:ce74:5f9f:f6e5

Tout répond parfaitement, nous allons pouvoir continuer.

4-Mise à jour du système et installation des paquets nécessaires

Nous allons installer tout le nécessaire pour joindre le domaine :

On met à jour le système :

# sudo pacman -Syu

On installe :

# sudo pacman -S samba smbclient ntp krb5

Il est possible que certains soient déjà installés, le Shell vous l'indique si c'est le cas.
Les programmes en question :

  • "Samba" : le serveur Samba permet d'interagir avec Windows pour le partage réseau. Dans sa suite, il comprend "winbind" qui va faire le lien entre les deux systèmes Linux et Windows : indispensable.
  • "Smbclient": l'utilitaire qui permet d'accéder à un répertoire partagé.
  • "Ntp": permet de synchroniser l'heure entre le serveur et les stations de travail.
  • "Krb5": est la configuration du système Kerberos permettant d'authentifier les utilisateurs réseau.

5-Paramétrage du fichier "ntp.conf"

On va rapidement modifier le fichier "ntp.conf" afin d'indiquer à notre station Arch linux de synchroniser l'heure avec notre serveur :

# sudo nano /etc/ntp.conf

Le contenu :

 GNU nano 7.2                                                       /etc/ntp.conf
 1 # Use your domain's NTP servers
 2 server ad-win1.rzt.lan            #----> indiquer ici votre serveur
 3 #server server2.internal.domain.tld
 4
 5 # Restrictions
 6 restrict default kod limited nomodify nopeer noquery notrap
 7 restrict 127.0.0.1
 8 restrict ::1
 9
10 # Location of drift file
11 driftfile /var/lib/ntp/ntpd.drift

On valide et on active le service Ntp

# sudo systemctl enable ntpd

On vérifie son status

# sudo systemctl status ntpd

Le résultat :

● ntpd.service - Network Time Service
     Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; preset: disabled)
     Active: active (running) since Fri 2024-04-19 14:07:37 CEST; 1h 25min ago
   Main PID: 367 (ntpd)
      Tasks: 2 (limit: 4683)
     Memory: 2.9M (peak: 3.8M)
        CPU: 277ms
     CGroup: /system.slice/ntpd.service
             └─367 /usr/bin/ntpd -g -u ntp:ntp

Ah oui, je ne vous ai pas prévenu mais c'est un peu long alors patience...😁

6-Paramétrage du fichier "krb5.conf"

On va s'attaquer maintenant au fichier de configuration Kerberos "krb5.conf", il existe par défaut, le mieux, c'est de partir de zéro :

# sudo nano /etc/krb5.conf

Le contenu :

[libdefaults]

   default_realm = RZT.LAN     

   dns_lookup_realm = false

   dns_lookup_kdc = true


[realms]

   RZT.LAN = {            

      kdc = AD-WIN1.RZT.LAN   

      default_domain = RZT.LAN   

      admin_server = AD-WIN1.RZT.LAN  

   }

    RZT = {     

      kdc = AD-WIN1.RZT.LAN  

      default_domain = RZT.LAN     

      admin_server = AD-WIN1.RZT.LAN     

   }

[domain_realm]

    .rzt.lan = RZT.LAN    

[appdefaults]

    pam = {

        ticket_lifetime = 1d

        renew_lifetime = 1d

        forwardable = true

        proxiable = false

        minimum_uid = 1

    }

Pour ce fichier, vous devez modifier uniquement ce qui est en MAJUSCULE (et y rester !) en incluant la ligne de "domain_realm", Il s'agit de vos propres données. Attention aux parenthèses et leurs emplacements.

Je ne vais pas détailler l'ensemble du fichier, mais c'est l'endroit où on indique tout ce qui correspond au serveur Active Directory pour permettre la liaison entre les deux systèmes et la délivrance des tickets(autorisation) Kerberos à notre instance linux. C'est le module "pam" qui sera utilisé pour l’authentification.

7-Paramétrage du fichier "smb.conf"

Passons à la partie Samba, avec le fichier "smb.conf", il existe parfois par défaut, cependant, il est préférable de partir d'un fichier vierge.

# sudo nano /etc/samba/smb.conf

Le contenu :

[global]
  # votre domaine netbios en MAJUSCULES¹
   workgroup = RZT
  # Aunthentification sur un serveur AD
    security = ADS
   # votre nom de domaine en MAJUSCULES²
   realm = RZT.LAN
 
   winbind refresh tickets = Yes

  vfs objects = acl_xattr

  map acl inherit = Yes

  store dos attributes = Yes

  # fichier unique de stockage des mots de passe

  dedicated keytab file = /etc/krb5.keytab

  kerberos method = secrets and keytab

  # indique que l'identifant ne requiert pas l'extention domaine pour se connecter

 winbind use default domain = yes

 # UID/GID mapping for local users # concerne le mappage des identifiants locaux

  idmap config * : backend = tdb

  idmap config * : range = 3000-7999

  # UID/GID mapping for domain users  # idem sur le réseau³

  idmap config RZT : backend = ad

  idmap config RZT : schema_mode = rfc2307

  idmap config RZT : range = 10000-999999

  idmap config RZT : unix_nss_info = yes

  # modèle de repertoire et delogin sur le shell pour les utilisateurs extérieurs

  template shell = /bin/bash

  template homedir = /home/%D/%U

  # un utilisateur peut se connecter meme si le système est hors ligne

  winbind offline logon = yes


 

Modifier les lignes indice 1, 2 et 3. Le "3" comprend quatre lignes (nom de domaine NetBIOS) !

  • Attention, le fichier smb.conf est un fichier sensible, s'il est mal écrit, il ne fonctionne pas ! Heureusement, il existe un outil de test "testparm"

# testparm

Le résultat :

Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback)

Server role: ROLE_DOMAIN_MEMBER

Press enter to see a dump of your service definitions

# Global parameters
[global]
      dedicated keytab file = /etc/krb5.keytab
      kerberos method = secrets and keytab
      realm = RZT.LAN
      security = ADS
      template shell = /bin/bash
      winbind offline logon = Yes
      winbind refresh tickets = Yes
      winbind use default domain = Yes
      workgroup = RZT
      idmap config internal : unix_nss_info = yes
      idmap config internal : range = 10000-999999
      idmap config internal : schema_mode = rfc2307
      idmap config internal : backend = ad
      idmap config * : range = 3000-7999
      idmap config * : backend = tdb
      map acl inherit = Yes
      vfs objects = acl_xattr

Pour résumer cette configuration, le service "winbind" de samba est chargé de résoudre les noms et les groupes d'un environnement linux et Windows Active directory.

8-Joindre le serveur Active Directory

On va pouvoir joindre le domaine avec un compte "admin" Active Directory:

# sudo net ads join -U administrateur

Le résultat :

Password for [RZT\administrateur]:
Using short domain name -- RZT
Joined 'STA-ARCO' to dns domain 'rzt.lan'

C'est déjà un bonne nouvelle😅

Mais on est loin d'avoir fini ohhhhhhhhnoooooonnnn!!!!!😁🙏

9-Démarrage des services

On démarre tous les services:

#sudo systemctl enable smb

#sudo systemctl enable nmb

#sudo systemctl enable winbind

#sudo systemctl start smb

#sudo systemctl start nmb

#sudo systemctl start winbind

  • "enable" Activer le service au démarrage.
  • "start" Démarrer tout de suite.
  • "status" Vérifier son fonctionnement.

On fait un petit "status" pour si voir tout est au vert !!! Je vous fais confiance !🙏

10-Paramétrage du fichier "nssswitch.conf"

Rapidement, on se rend dans le fichier "nsswitch.conf" qui se charge de basculer entre chaque système d'identification de nom et de groupe. On y incorpore notre "winbind":

# sudo nano /etc/nsswitch.conf

Le contenu :

 # Name Service Switch configuration file.
 # See nsswitch.conf(5) for details.
 # we changed nsswitch.conf to have access to nas servers
 # This config file comes from the ArcoLinux github
 
 passwd: files systemd
 group: files [SUCCESS=merge] systemd
 shadow: files systemd
 gshadow: files systemd
 
#--->ces deux lignes dessous sont à ajouter dans ce fichier¹
 passwd: files winbind mymachines systemd
 group: files winbind mymachines systemd
 
 publickey: files

hosts: mymachines resolve [!UNAVAIL=return] files dns mdns wins myhostname
networks: files

protocols: files
services: files
ethers: files
rpc: files

netgroup: files

¹ Ajoutez les lignes suivantes dans ce fichier :

  • passwd: files winbind mymachines systemd
  • group: files winbind mymachines systemd

On va vérifier qu'il a compris, par les commandes suivantes :

# wbinfo -u

Le résultat :

administrateur
invité
krbtgt
tom

# wbinfo -g

Le résultat :

ordinateurs du domaine
contrôleurs de domaine
administrateurs du schéma
administrateurs de l’entreprise
éditeurs de certificats
admins du domaine
utilisateurs du domaine
invités du domaine
propriétaires créateurs de la stratégie de groupe
serveurs ras et ias
groupe de réplication dont le mot de passe rodc est autorisé
groupe de réplication dont le mot de passe rodc est refusé
contrôleurs de domaine en lecture seule
contrôleurs de domaine d’entreprise en lecture seule
contrôleurs de domaine clonables
protected users
administrateurs clés
administrateurs clés enterprise
dnsadmins
dnsupdateproxy

C'est top, on a les utilisateurs et les groupes "Active directory".

11-Paramétrage du fichier "pam_winbind.conf"

Ce qu'il nous reste à faire c'est de paramétrer les authentifications "pam" pour les utilisateurs Active Directory

D'abord un fichier Pam pour "winbind", celui-ci est à créer:

# nano /etc/security/pam_winbind.conf

Le contenu :

[Global]

 debug = no

 debug_state = no

 try_first_pass = yes

 krb5_auth = yes

 krb5_ccache_type = FILE:/run/user/%u/krb5cc

 cached_login = yes

 silent = no

 mkhomedir = yes
 

En gros, on indique l'utilisation de Kerberos pour l'authentification, le fichier ou seront stocké Les tickets(autorisation) et la création du répertoire de l'utilisateur.

12-Paramétrage du fichier "system-auth" et "su"

On poursuit par la modification des deux fichiers "pam" majeures. Je vous conseille de faire une sauvegarde du système. Soyez très vigilant, une erreur et plus aucun utilisateur sera en mesure de se connecter !!!

Vous pouvez, soit faire un copier-coller de l'ensemble et remplacer l'existant ou soit incorporer les lignes suivantes dans le même ordre :

Fichier "system-auth"

  • auth [success=2 default=ignore] pam_winbind.so

  • account [success=1 default=ignore] pam_winbind.so

  • password [success=1 default=ignore] pam_winbind.so

  • session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

  • session required pam_winbind.so

Fichier "su"

  • auth sufficient pam_winbind.so

  • account sufficient pam_winbind.so

  • session sufficient pam_winbind.so

# nano /etc/pam.d/system-auth

Le contenu :

#%PAM-1.0

auth       required                    pam_faillock.so      preauth
# Optionally use requisite above if you do not want to prompt for the password
# on locked accounts.
-auth      [success=3 default=ignore]  pam_systemd_home.so
auth       [success=2 default=ignore]  pam_winbind.so
auth       [success=1 default=bad]     pam_unix.so          try_first_pass nullok
auth       [default=die]               pam_faillock.so      authfail
auth       optional                    pam_permit.so
auth       required                    pam_env.so
auth       required                    pam_faillock.so      authsucc
# If you drop the above call to pam_faillock.so the lock will be done also
# on non-consecutive authentication failures.

-account   [success=2 default=ignore]  pam_systemd_home.so
account    [success=1 default=ignore]  pam_winbind.so
account    required                    pam_unix.so
account    optional                    pam_permit.so
account    required                    pam_time.so

-password  [success=2 default=ignore]  pam_systemd_home.so
password   [success=1 default=ignore]  pam_winbind.so
password   required                    pam_unix.so    try_first_pass nullok shadow sha512
password   optional                    pam_permit.so

-session   optional                    pam_systemd_home.so
session    required                    pam_mkhomedir.so skel=/etc/skel/ umask=0022
session    required                    pam_limits.so
session    required                    pam_winbind.so
session    required                    pam_unix.so
session    optional                    pam_permit.so

# nano /etc/pam.d/su

Le contenu :

#%PAM-1.0

auth      sufficient  pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth     required    pam_wheeel.so   trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth     required    pam_wheel.so    use_uid
auth      sufficient  pam_winbind.so
auth      required    pam_unix.so
account   sufficient  pam_winbind.so
account   required    pam_unix.so
session   sufficient  pam_winbind.so
session   required    pam_unix.so

On vient d'inclure l'authentification pour "winbind" dans le module "pam" des utilisateurs et aussi celui des utilisateurs appartenant au groupe "wheel" (qui donne des privilèges).

13-Connexion d'un utilisateur Active Directory en mode Shell

Si rien n’est cassé😁😅😃, on va tenter une connexion d'utilisateur Active Directory sur la console :

Vous vous souvenez, dans le fichier "smb.conf", on a indiqué que l'on pouvait se connecter sans l'extension "domaine": On écrit juste "kinit administrateur".

# kinit administrateur
Password for administrateur@RZT.LAN:

Si la commande répond, il vous demande votre mot de passe, vous voyez qu'il affiche automatiquement qu'il s'agit d'un utilisateur réseau !

On vérifie qu'il a bien obtenu un ticket d'entrée si je puis dire😁

# klist

Le résultat:

Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrateur@RZT.LAN

Valid starting       Expires              Service principal
20/04/2024 07:34:00  20/04/2024 17:34:00  krbtgt/RZT.LAN@RZT.LAN
        renew until 21/04/2024 07:33:52

😎

14-Connexion d'un utilisateur Active Directory en mode graphique

On est bon en ce qui concerne la connexion sur le Shell, passons maintenant à l'interface graphique humm...

"Sélectionnez "absent de la liste ?"
Entrez simplement le nom de l'utilisateur réseau et son mot de passe :

IDARCO1.png

IDARCO2.png

IDARCO3.png

IDARCO4.png

🤗😎

On jette un oeil du côté de notre serveur Windows AD :

IDAD.png

C'est parfait tout ça !!!🤗

15- Recommandations

Juste quelques mots encore : j’utilise Gnome et son interface de connexion "GDM" car l'utilisateur réseau est bien géré.
Il affiche par défaut "absent de la liste ?" ce n'est pas forcément le cas des autres gestionnaires de session qui accompagnent les bureaux Xfce, Cinnamon, Kde Plasma...etc. Je parle de "Lightdm" et "Sddm"

GDM conserve aussi le nom de connexion dans son système, pas besoin de le ressaisir comme vous pouvez le voir plus-haut.

Je vous joint un lien sur "LightDM et sa configuration, vous trouverez un paragraphe sur la saisie manuel de l’identifiant :

lightdm [Wiki ubuntu-fr]

Pour SdDM, selon le thème utilisé, vous aurez la possibilité d'enregistrer un nouvel utilisateur. Voici un lien sur la configuration de ce gestionnaire :

SDDM (Français) - ArchWiki

C'est terminé!

Archlinux.fr

Le site de la communauté Arch Linux

Documentation Windows Server
Windows Server est une plateforme permettant de créer une infrastructure d’applications, de réseaux et de services web connectés, du groupe de travail au centre de données.