<header style="text-align: center;"> # TP Active Directory </header> ## Déploiement d’un serveur Active Directory sous Windows Server 2019 ### Ajout du rôle Active Directory On lance `Server Manager` et on suit les étapes présentés dans le TP. ![](https://i.imgur.com/DwLrqz9.png) ### Déploiement du serveur Active Directory On selectionne `Promote this server to a domain controller`. Nom de domaine: DOMAIN.INT Mot de passe: 19N5GK#fgf4o ![](https://i.imgur.com/lPtBFY6.png) Le script powershel permettant à redeployer l'`ACTIVE DIRECTORY` à l'identique: ```powershell # # Windows PowerShell script for AD DS Deployment # Import-Module ADDSDeployment Install-ADDSForest ` -CreateDnsDelegation:$false ` -DatabasePath "C:\Windows\NTDS" ` -DomainMode "WinThreshold" ` -DomainName "DOMAIN.INT" ` -DomainNetbiosName "DOMAIN" ` -ForestMode "WinThreshold" ` -InstallDns:$true ` -LogPath "C:\Windows\NTDS" ` -NoRebootOnCompletion:$false ` -SysvolPath "C:\Windows\SYSVOL" ` -Force:$true ``` ### Mise en place d’une console d’administration graphique On éxecute la commande `regsvr32 schmmgmt.dll` pour activer le composant enfichable de gestion du schéma LDAP (sinon `Active Directory Scheme` n'apparaît pas par exemple). Puis dans `mcc.exe`, on ajoute tout les composants nécessaires: ![](https://i.imgur.com/0VwMq3r.png) ### Enregistrement d’une zone DNS inverse pour le domaine On suit les étapes présentés dans le TP: Puis on lance `cmd.exe` et on execute: ```bat ipconfig /registerdns ``` ![](https://i.imgur.com/U7Xt33y.png) Et on constate que cela fonctionne. ## Enregistrement d’un client Linux dans le serveur Active Directory ### Configuration du réseau On supprime dans `/etc/network/interfaces` tout ce qui concerne eth0. Puis on installe les paquets `apt`. ```bash $ cat nano /etc/network/interfaces # /etc/network/interfaces 👍 # ------------------------------------------------------------------- # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5) source /etc/network/interfaces.d/* # the loopback network interfaces auto lo iface lo inet loopback # The primary network interfaces #VAGRANT-BEGIN # The contents below are automatically generated by Vagrant. Do not modify. auto eth1 iface eth1 inet static address 10.0.20.150 netmask 255.255.255.0 #VAGRANT-END # ------------------------------------------------------------------- $ sudo apt install -y krb5-user samba winbind systemd-timesyncd libnss-winbind libpam-winbind ``` Pour indiquer à l’interface `eth0` qu’elle doit obtenir son adresse IP par DHCP, on écrit dans `/etc/systemd/network/eth0.network`: ```network [Match] Name=eth0 [Network] DHCP=ipv4 ``` Puis on active et on démarre `systemd-networkd`: ```bash $ sudo systemctl enable systemd-networkd $ sudo systemctl start systemd-networkd $ sudo systemctl status systemd-network # sudo systemctl status systemd-network 👍 # ------------------------------------------------------------------- ● systemd-networkd.service - Network Service Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; ven> Active: active (running) since Tue 2023-03-28 01:16:55 CEST; 4s ago TriggeredBy: ● systemd-networkd.socket Docs: man:systemd-networkd.service(8) Main PID: 3760 (systemd-network) Status: "Processing requests..." Tasks: 1 (limit: 2320) Memory: 3.9M CPU: 45ms CGroup: /system.slice/systemd-networkd.service └─3760 /lib/systemd/systemd-networkd mars 28 01:16:55 client-linux-ad systemd[1]: Starting Network Service... mars 28 01:16:55 client-linux-ad systemd-networkd[3760]: Enumeration completed mars 28 01:16:55 client-linux-ad systemd[1]: Started Network Service. mars 28 01:16:55 client-linux-ad systemd-networkd[3760]: eth0: DHCPv4 address 1> mars 28 01:16:57 client-linux-ad systemd-networkd[3760]: eth0: Gained IPv6LL # ------------------------------------------------------------------- $ ip a # ip a 👍 # ------------------------------------------------------------------- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:3c:84:61 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 valid_lft 86236sec preferred_lft 86236sec inet6 fe80::a00:27ff:fe3c:8461/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:a8:4d:00 brd ff:ff:ff:ff:ff:ff altname enp0s8 inet 10.0.20.150/24 brd 10.0.20.255 scope global eth1 valid_lft forever preferred_lft forever # ------------------------------------------------------------------- ``` ### Configuration du DNS **Supprimez le paquet resolvconf qui gère pour le moment le fichier /etc/resolv.conf.** ```bash $ sudo apt purge -y resolvconf ``` **Arrêtez et désactivez le service NetworkManager qui va vouloir gérer les interfaces réseau depuis l’interface graphique** ```bash $ sudo systemctl stop NetworkManager $ sudo systemctl disable NetworkManager $ sudo systemctl status NetworkManager # sudo systemctl status NetworkManager 👍 # ------------------------------------------------------------------- ● NetworkManager.service - Network Manager Loaded: loaded (/lib/systemd/system/NetworkManager.service; disabled; vend> Active: inactive (dead) since Tue 2023-03-28 01:23:45 CEST; 36s ago Docs: man:NetworkManager(8) Main PID: 374 (code=exited, status=0/SUCCESS) CPU: 278ms mars 27 23:42:26 client-linux-ad NetworkManager[374]: <info> [1679953346.9578]> mars 27 23:42:26 client-linux-ad NetworkManager[374]: <info> [1679953346.9895]> mars 27 23:42:27 client-linux-ad NetworkManager[374]: <info> [1679953347.0034]> mars 28 00:54:44 client-linux-ad NetworkManager[374]: <info> [1679957684.8206]> mars 28 01:19:39 client-linux-ad NetworkManager[374]: <info> [1679959179.5812]> mars 28 01:23:45 client-linux-ad systemd[1]: Stopping Network Manager... mars 28 01:23:45 client-linux-ad NetworkManager[374]: <info> [1679959425.1491]> mars 28 01:23:45 client-linux-ad NetworkManager[374]: <info> [1679959425.1589]> mars 28 01:23:45 client-linux-ad systemd[1]: NetworkManager.service: Succeeded. mars 28 01:23:45 client-linux-ad systemd[1]: Stopped Network Manager. # ------------------------------------------------------------------- ``` **Activez et démarrez le service systemd-resolved** `Systemd-resolved` est un service de gestion de la résolution de noms sous Linux. Il est utilisé pour traduire les noms de domaine en adresses IP et vice versa. Il gère également la résolution des noms de domaine locaux. Il est souvent utilisé en remplacement de resolvconf ou dnsmasq pour fournir des résolutions de noms plus rapides et plus fiables. Systemd-resolved est intégré à systemd, ce qui lui permet de profiter de toutes les fonctionnalités de gestion de processus et de services de systemd. ```bash $ sudo systemctl enable systemd-resolved $ sudo systemctl disable systemd-resolved $ sudo systemctl status systemd-resolved # sudo systemctl status systemd-resolved 👍 # ------------------------------------------------------------------- ● systemd-resolved.service - Network Name Resolution Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; ven> Active: active (running) since Tue 2023-03-28 01:38:32 CEST; 28s ago Docs: man:systemd-resolved.service(8) man:org.freedesktop.resolve1(5) https://www.freedesktop.org/wiki/Software/systemd/writing-network-> https://www.freedesktop.org/wiki/Software/systemd/writing-resolver> Main PID: 364 (systemd-resolve) Status: "Processing requests..." Tasks: 1 (limit: 2320) Memory: 5.1M CPU: 94ms CGroup: /system.slice/systemd-resolved.service └─364 /lib/systemd/systemd-resolved mars 28 01:38:32 client-linux-ad systemd[1]: Starting Network Name Resolution... mars 28 01:38:32 client-linux-ad systemd-resolved[364]: Positive Trust Anchors: mars 28 01:38:32 client-linux-ad systemd-resolved[364]: . IN DS 20326 8 2 e06d4> mars 28 01:38:32 client-linux-ad systemd-resolved[364]: Negative trust anchors:> mars 28 01:38:32 client-linux-ad systemd-resolved[364]: Using system hostname w> mars 28 01:38:32 client-linux-ad systemd[1]: Started Network Name Resolution. # ------------------------------------------------------------------- ``` **Supprimez le fichier /etc/resolv.conf puis remplacez le par un lien symbolique vers le fichier /run/systemd/resolve/stub-resolv.conf** ``` bash $ sudo rm /etc/resolv.conf $ sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf ``` **Vérifiez que vous êtes bien capables d’interroger le serveur DNS de l’Active Directory via les commandes:** 1. `resolvectl query adds.domain.int`: ```bash $ resolvectl query adds.domain.int # resolvectl query adds.domain.int ❌ #------------------------------------------------------------------- adds.domain.int: resolve call failed: All attempts to contact name servers or networks failed #------------------------------------------------------------------- ``` 2. `resolvectl query adds` ```bash $ resolvectl query adds # resolvectl query adds 👍 # ------------------------------------------------------------------- adds: 10.0.20.100 -- link: eth1 (ADDS) -- Information acquired via protocol LLMNR/IPv4 in 110.7ms. -- Data is authenticated: no # ------------------------------------------------------------------- ``` Les autres requêtes ne marchent pas aussi. On regarde `resolvectl status` et on remarque que le `Global` ne pointe pas vers l’adresse de l’AD. ```bash $ resolvectl status # resolvectl status 👍 # ------------------------------------------------------------------- Global Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: stub Current DNS Server: 4.2.2.1 DNS Servers: 4.2.2.1 4.2.2.2 208.67.220.220 DNS Domain: rez Link 2 (eth0) Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6 Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Current DNS Server: 10.0.2.3 DNS Servers: 10.0.2.3 Link 3 (eth1) Current Scopes: LLMNR/IPv4 Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported # ------------------------------------------------------------------- ``` On peut règler ce problème en ajoutant cette ligne à `/etc/systemd/resolved.conf`: ```resolved [Resolve] DNS=10.0.20.100 ``` puis on redémarre le service et on re-essaye la première commande: ```bash $ resolvectl query adds.domain.int # resolvectl query adds.domain.int 👍 #------------------------------------------------------------------- adds.domain.int: 10.0.20.100 -- link: eth1 10.0.2.15 -- link: eth1 -- Information acquired via protocol DNS in 3.0ms. -- Data is authenticated: no #------------------------------------------------------------------- ``` Les autres commandes marchent bien aussi. **Installez le paquet systemd-timesyncd** ```bash $ sudo apt install -y systemd-timesyncd # C'est déjà installé ``` **Configurez le fichier /etc/systemd/timesyncd.conf pour utiliser l’Active Directory comme serveur de temps** On ajoute la ligne suivante à `/etc/systemd/timesyncd.conf`: ```timesyncd NTP=adds ``` **Activez et démarrez le service systemd-timesyncd** ```bash $ sudo systemctl enable systemd-timesyncd $ sudo systemctl start systemd-timesyncd $ sudo systemctl status systemd-timesyncd # sudo systemctl status systemd-timesyncd 👍 #------------------------------------------------------------------- ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enab> Active: active (running) since Tue 2023-03-28 02:24:02 CEST; 4s ago Docs: man:systemd-timesyncd.service(8) Main PID: 2263 (systemd-timesyn) Status: "Idle." Tasks: 2 (limit: 2320) Memory: 1000.0K CPU: 58ms CGroup: /system.slice/systemd-timesyncd.service └─2263 /lib/systemd/systemd-timesyncd mars 28 02:24:02 client-linux-ad systemd[1]: Starting Network Time Synchronization... mars 28 02:24:02 client-linux-ad systemd[1]: Started Network Time Synchronization. mars 28 02:24:03 client-linux-ad systemd-timesyncd[2263]: Server has too large root distance #------------------------------------------------------------------- ``` **Vérifiez que vous êtes bien synchronisés sur le serveur de temps via la commande timedatectl** Avant d'essayer, on remarque que `systemctl status systemd-timesyncd` produit la ligne suivante: ```text mars 28 02:24:03 client-linux-ad systemd-timesyncd[2263]: Server has too large root distance. Disconnecting ``` En recherchant en ligne, une solution est d'augmenter `RootDistanceMaxSec` à une valeur comfortable. Ainsi on ajoute à `/etc/systemd/timesyncd.conf`: ```timesyncd RootDistanceMaxSec=30 ``` Après relancement du service `systemd-timesyncd`, on voit que le serveur `NTP` est accepté. On vérifie avec `timedatectl`: ```bash $ timedatectl status # timedatectl status 👍 #------------------------------------------------------------------- Local time: mar. 2023-03-28 02:30:54 CEST Universal time: mar. 2023-03-28 00:30:54 UTC RTC time: mar. 2023-03-28 00:31:21 Time zone: Europe/Paris (CEST, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no #------------------------------------------------------------------- ``` ### Configuration du Kerberos **Installez le paquet de support de Kerberos côté client dans son implémentation fourni par le MIT (paquet krb5-user)** ```bash $ sudo apt install -y krb5-user # C'est déjà installé, grâce à l'installation au debut du TP je pense ``` **Configurez le plus simplement possible le fichier krb5.conf** On modifie les premières lignes dans `krb5.conf`: ```krb5 [libdefaults] default_realm = DOMAIN.INT # The following krb5.conf variables are only for MIT Kerberos. kdc_timesync = 1 ccache_type = 4 forwardable = true proxiable = true ``` **Vérifiez que vous arrivez à obtenir un ticket pour l’utilisateur vagrant via la commande kinit vagrant , en affichant les tickets obtenus par la commande klist** ![](https://i.imgur.com/pohZPug.png) ### Installation et configuration de Samba **Installez le paquet samba** ```bash $ sudo apt install -y samba # Same ``` **Configurez Samba** Dans `/etc/samba/smb.conf`, on modifie de sorte à avoir les lignes suivantes: ```smb [global] workgroup = DOMAIN realm = DOMAIN.INT security = ads interfaces = eth1 bind interfaces only = yes idmap config * : range = 2000-9999 idmap config DOMAIN : range = 10000-999999 idmap config DOMAIN : backend = rid log file = /var/log/samba/%m.log max log size = 1000 [homes] comment = Home Directories browseable = no writable = yes [printers] comment = All printers path = /var/spool/samba browseable = no guest ok = no writable = no printable = yes ``` **Redémarrer le serveur smbd et vérifiez via la commande netstat qu’il n’écoute bien que sur l’interface eth1** ```bash $ sudo systemctl restart smbd $ sudo netstat -nplt | grep smbd # sudo netstat -nplt | grep smbd 👍 #------------------------------------------------------------------- tcp 0 0 10.0.20.150:445 0.0.0.0:* LISTEN 2545/smbd tcp 0 0 10.0.20.150:139 0.0.0.0:* LISTEN 2545/smbd #------------------------------------------------------------------- ``` ### Joindre le domaine Le ticket qu'on a généré précedemment se trouve sous `/tmp/krb5cc_1001`. ![](https://i.imgur.com/P2Wg0d9.png) **En cas de succès, quels sont les tickets de service qui ont été acquis lors de la jonction ?** It is not the case. **Vérifiez que la machine apparaît bien dans le serveur LDAP via la console mmc** ![](https://i.imgur.com/zTOwws5.png) **Résoudre le problème du DNS** On re-écrit dans `/etc/hosts`: ``` 127.0.0.1 localhost 10.0.20.150 client-linux-ad.domain.int client-linux-ad ``` ![](https://i.imgur.com/3LvKLhW.png) ### Projection des utilisateurs Active Directory sous Linux **Installez les paquets winbind, libnss-winbind, libpam-winbind** ```bash $ sudo apt install -y winbind libnss-winbind libpam-winbind ``` **Modifiez le fichier /etc/nsswitch.conf afin d’ajouter l’utilisation du fournisseur d’identité winbind pour les bases de données utilisateurs et groupes** On écrit dans `/etc/nsswitch.conf`: ```nsswitch group: files systemd winbind passwd: files systemd winbind #getent passwd wouldn't work without shadow: files systemd winbind # // ... ``` **Redémarrez le service winbind** ```bash $ sudo systemctl enable winbind $ sudo systemctl start winbind $ sudo systemctl status winbind # sudo systemctl status systemd-timesyncd 👍 #------------------------------------------------------------------- ● winbind.service - Samba Winbind Daemon Loaded: loaded (/lib/systemd/system/winbind.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2023-03-28 01:38:34 CEST; 2h 31min ago Docs: man:winbindd(8) man:samba(7) man:smb.conf(5) Main PID: 712 (winbindd) Status: "winbindd: ready to serve connections..." Tasks: 3 (limit: 2320) Memory: 11.2M CPU: 259ms CGroup: /system.slice/winbind.service ├─712 /usr/sbin/winbindd --foreground --no-process-group ├─727 winbindd: domain child [CLIENT-LINUX-AD] └─765 winbindd: idmap child mars 28 01:38:34 client-linux-ad systemd[1]: Starting Samba Winbind Daemon... mars 28 01:38:34 client-linux-ad systemd[1]: Started Samba Winbind Daemon. #------------------------------------------------------------------- ``` **Testez son bon fonctionnement via les commandes wbinfo -p et wbinfo -u.Vous devriez voir la liste des utilisateurs du domaine. Que constatez-vous ?** ```bash $ wbinfo -p # wbinfo -p 👍 #------------------------------------------------------------------- Ping to winbindd succeeded #------------------------------------------------------------------- ``` ```bash $ wbinfo -u # wbinfo -u ❌ #------------------------------------------------------------------- Error looking up domain users #------------------------------------------------------------------- ``` On constante qu'on peut pas voir la liste des utilisateurs. **Modifiez le fichier /etc/samba/smb.conf afin que le nom de domaine ne figure plus devant les noms d’utilisateur. Redémarrez le serveur winbind et vérifiez que cela fonctionne** On ajoute cette ligne à `/etc/samba/smb.conf`: ```smb winbind use default domain = yes ``` ```bash $ wbinfo -u # wbinfo -u 👍 #------------------------------------------------------------------- administrator guest vagrant krbtgt #------------------------------------------------------------------- ``` **En utilisant la commande getent passwd , listez l’ensemble des utilisateurs. Que constatez-vous ? Modifiez le fichier /etc/samba/smb.conf afin que l’ensemble des utilisateurs et groupes du domaine puisse être listés par la commande getent . Redémarrez le serveur winbind et vérifiez que cela fonctionne.** ```bash $ getent passwd # getent passwd 👍 #------------------------------------------------------------------- getent passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin ... #------------------------------------------------------------------- ``` Je pense ça marche grâce à la modification de `/etc/hosts` afin de résoudre l'enregistrement DNS. **Ajoutez un utilisateur dans l’Active Directory via la console mmc. Vérifiez qu’il apparaît sous Linux.** On ajoute un nouveau utilisateur `amogus` via la console `mmc.exe`: ![](https://i.imgur.com/0pv3rpL.png) Puis on éxecute `wbinfo -u` pour chercher la liste des utilisateurs: ```bash $ wbinfo -u # wbinfo -u 👍 #------------------------------------------------------------------- administrator guest vagrant krbtgt amogus #------------------------------------------------------------------- ``` **En vérifiant l’entrée (de type /etc/passwd) du nouvel utilisateur ainsi ajouté, via la commande getent passwd username , que constatez-vous concernant son shell et son répertoire personnel ?** ```bash $ getent passwd amogus # getent passwd amogus 👍 #------------------------------------------------------------------- amogus:*:11109:10513:amogus:/home/DOMAIN/amogus:/bin/false #------------------------------------------------------------------- ``` Le répertoire personel de `amogus` se trouve sous `/home/DOMAIN/amogus` (peut-être en place de `/home/amogus`) et il n'a pas de shell (`/bin/false`). **Modifiez le fichier /etc/samba/smb.conf afin que les utilisateurs du domaine puisse avoir un répertoire personnel sous le répertoire /home et que leur shell soit /bin/bash. Redémarrez le serveur winbind et vérifiez que cela fonctionne** On ajoute la ligne suivantes au `/etc/samba/smb.conf`: ```smb [global] ... template homedir = /home/%u template shell = /bin/bash ``` Pour on redémarre `smbd` et on re-essaye: ```bash $ getent passwd amogus # getent passwd amogus 👍 #------------------------------------------------------------------- amogus:*:11109:10513:amogus:/home/amogus:/bin/bash #------------------------------------------------------------------- ``` **Vérifiez que vous pouvez vous connecter sous l’utilisateur ainsi créé (via la commande su - utilisateur ) par exemple. Que donne la commande id une fois connecté ?** ![](https://i.imgur.com/6oPCVdr.png) 👍👍👍 Par contre `/home/amogus` n'est pas crée automatiquement. Pour le faire on peut utiliser une technique qu'on a appris pendant le TP de LDAP. Il faut aller dans `/etc/pam.d/common-auth` et ajouter la ligne suivante ```pam session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 ``` Puis on re-essaye: ![](https://i.imgur.com/PE0ciEH.png) 👍👍👍