<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.

### 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

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:

### 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
```

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**

### 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`.

**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**

**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
```

### 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`:

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é ?**

👍👍👍
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:

👍👍👍