Ntdsutil peut générer des snapshots, mais ce terme snapshot peut prêter à confusion dans un environnement Active Directory. Il mérite une clarification pour une utilisation à bon escient et une bonne compréhension de tous.
Les infrastructures étant de plus en plus virtualisées de nos jours, nous ne devons surtout pas confondre snapshot et snapshot, c’est à dire celui réalisé au niveau de l’annuaire Active Directory en tant que service d’infrastructure et celui fait au niveau de l’hyperviseur en tant que socle système Windows (toute technologie de virtualisation confondue).
Gardez à l’esprit que le snapshot système (cliché instantané de l’état du système et des applications associées) est totalement déconseillé et carrément inutile quant à la protection de l’annuaire Active Directory.
La réplication étant adossée à une base transactionnelle, les dernières données écraseront toujours les précédentes. L’horodatage des objets et des données a son importance, il vous faut garder à l’esprit que celui d’un snapshot restera toujours plus vieux par définition par rapport à celui fournit par les contrôleurs de domaines restés en ligne.
Tout ceci pour dire que l’utilisation d’un snapshot système pour restaurer Active Directory oblige a minima le nettoyage des métadonnées et de redéployer l’ensemble des contrôleurs de domaine ; autant dire que c’est très lourd.
Nous pouvons en revanche tirer profit autrement du snapshot fait directement au niveau d’Active Directory dans l’optique de protéger efficacement les données afférentes aux objets (la valeur des attributs) ; cela sans avoir recours à une restauration complexe selon la procédure DSRM (Directory Services Restore Mode) par exemple ou encore parier sur la lourdeur de l’opération précédemment décrite (repartir d’un seul contrôleur de domaine).
De notre fenêtre, il n’est pas concevable qu’une opération de manipulation répétitive et successive à grande échelle des objets utilisateurs et groupes Active Directory engendre une restauration authoritative.
Nous sommes très surpris d’apprendre cela, puisque certaines équipes IAM/IGA et N3 Active Directory ont été contraintes de faire ce choix dans le passé, i.e. restaurer Active Directory selon une procédure de PRA si notre compréhension est bonne.
La maitrise et la posture nominale à adopter lors de ce style de manipulation d’une grande quantité d’objets commandent une autre méthode beaucoup plus souple selon nous. Si la précision n’est pas au rendez-vous, il va falloir miser sérieusement sur l’agilité.
Dans cette optique de bien protéger les objets et données, notre recommandation est que les entités techniques activent la corbeille Active Directory et génèrent autant de snapshots que nécessaire durant les modifications massives. Les exports au format LDF (ldifde) et CSV (script PowerShell ou l’utilitaire csvde) peuvent être réalisés en parallèle pour partager la vision avec les entités fonctionnelles.
L’éventuelle industrialisation d’un retour arrière devra être basée coûte que coûte sur le snapshot pour des raisons de rapidité du traitement.
Voici comment protéger vos données au sein de votre service d’infrastructure Active Directory à l’aide de l’utilitaire natif Windows nommé ntdsutil, cela en créant un snapshot (sous-entendu, vos objets sont protégés par la corbeille, les données quant à elles sont protégées par le cliché instantané) :
ntdsutil snapshot “activate instance ntds” create q q
Retenez ou copiez l’instance ou la valeur du GUID du snapshot
Vérifiez si un snapshot est déjà monté. L’objectif est que vous puissiez baser votre opération de restauration sur le snapshot ad hoc. Un snapshot inadapté doit être simplement démonté si la situation l’impose.
La vérification peut se faire comme suit : ntdsutil snapshot « list mounted » q q
Le démontage peut se faire comme suit : ntdsutil snapshot « mount %guid% » q q
Une fois le snapshot ad hoc monté, un dossier nommé $_SNAP_*_VOLUME?$ apparaitra.
L’utilitaire DASMAIN vous permettra de lire le contenu de ce snapshot en spécifiant un port d’aaccès à cet annuaire basé sur le cliché instantané. Le style de ligne de commandes est ci-après :
dsamain /dbpath C:\$SNAP_202211121158_VOLUMEC$\windows\NTDS\ntds.dit /ldapport 10000
Ouvrez maintenant la console DSA en ajoutant le contrôleur de domaine suivi du port spécifique défini lors du montage du snapshot (port 10000 dans notre exemple).
Visuellement vous allez retrouver l’ensemble des données précédemment altérées ou supprimées.
Ce cliché instantané monté (en lecture seule) doit nous être profitable maintenant pour restaurer l’état précis d’un ou plusieurs objets Active Directory.
Le principe est de lire les données sur le cliché instantané choisi et injecter par la suite ces mêmes données dans l’annuaire en ligne. Voici comment restaurer les données de cette façon à partir d’un snapshot :
- Pour les groupes d’appartenance :
Get-ADUser -Identity john.doe -Properties memberof -server knw001:10000 | select -ExpandProperty memberof | ForEach-Object {Add-ADGroupMember -Identity $_ -Members (Get-ADUser -Identity john.doe)}
- Pour les autres attributs :
$previousemailvalue = (Get-ADUser -Identity john.doe -server knw001:10000 -Properties emailaddress).emailaddress
Set-ADUser -Identity john.doe -emailaddress $previousemailvalue
De cette façon, sur la base d’un snapshot cohérent, le retour arrière est industrialisable.
L’idée serait de traiter les groupes d’appartenance en priorité (c’est ce qui donne accès aux ressources dans un environnement bien fait), puis de traiter les autres données (les autres attributs).
Le traitement des attributs peut se faire par boucle, quelques exemples de scripts ci-dessous :
- Traitement unitaire par attribut :
$userrestore = Get-ADUser -Identity john.doe -Properties description -Server knw001 :10000
Set-ADUser -Identity john.doe -description $userrestore.description -Server knw001:389
- Traitement par boucle, par OU et par attribut :
$userrbs = Get-ADUser -Filter * -SearchBase « OU=_T2,DC=mtech,DC=lab » -Properties emailaddress
foreach ($userrb in $userrbs)
{
$previousValue = Get-ADUser -Identity $userrb -Properties emailaddress -server knw001:10000
$currentvalue = Get-ADUser -Identity $userrb -Properties emailaddress -server knw001:389
if ($previousValue.EmailAddress -ne $currentvalue.EmailAddress)
{
Set-ADUser -Identity john.doe -emailaddress $PreviousValue.emailaddress -Server knw001:389
}
}
Comme d’habitude, n’hésitez pas à partager l’article si vous le trouvez intéressant ou de le commenter en cas d’erreur ou d’omission de notre part (tout est perfectible).