Impossible de supprimer un Sid-History pour raison de sécurité
Dans un projet de migration Active Directory, il est nécessaire d’établir un lien entre le compte utilisateur du domaine “source” avec un compte utilisateur dans le domaine “cible” de migration.
Pour établir le lien entre les deux, on dispose de l’attribut “Sid-History. Lorsque l’utilisateur du domaine “cible” accède à une ressource dans le domaine “source” de la migration, celui-ci se présente sous son identité du domaine “source”. C’est de cette manière qu’on peut préserver l’accès aux ressources pendant la migration.
Maintenant si on associe un mauvais utilisateur dans le Sid-History, on pourrait croire qu’il suffit simplement de supprimer l”information à l’aide de la console ADSIEDIT.MSC. Depuis Windows 2003, la réponse sera invariablement :
Accès refusé, même si on utilise un compte administrateur. Pourtant, pour ceux qui comme moi ont réalisé des migration NT4 vers Windows 2000 se souviennent que cela ne posait pas de problème. Pourquoi?
La première raison, c’est que depuis Windows 2003, la manipulation de l’attribut Sid-History passe nécessairement par une nouvelle API : DsAddSidHistory. La seconde raison, c’est que la console d’administration ne réalise pas la bonne opération.
L’API : DsAddSidHistory a été introduite pour parer à une problématique d’élévation de privilèges lors de la migration. Prenons un utilisateur d’un domaine “cible” de migration” capable de modifier son propre attribut Sid-History (je l’avoue c’est assez rare). Il peut s’associer le SID d’un utilisateur dans le domaine “source” (tant que celui-ci n’est pas encore associé à un autre utilisateur du domaine “cible”). Donc, un simple utilisateur peut se faire passer pour un administrateur du domaine “source”. Voila donc le pourquoi de l’API.
Maintenant, question comment corriger l’association d’un mauvais SID à un utilisateur. La console ne réalisant qu’une opération LDAP UPDATE et non LDAP DELETE, c’est donc vers le scripting qu’il faut se tourner. La réponse se trouve dans la KB295758 qui propose une solution en Vbscript qui réalise une opération “DELETE” :
vArray = oDirObject.GetEx("sIDHistory")
For Each vSid in vArray
oDirObject.PutEx ADS_PROPERTY_DELETE, "sIDHistory", array(vSid)
oDirObject.SetInfo
Next
Avec un peu de développement, il est possible de rechercher à quel utilisateur correspond le SID dans le domaine source. Encore faut-il être capable de manipuler les SID en VbScript, ce qui n’est pas une sinécure.
Benoîts – Simple and Secure by Design