Le compte à rebours est lancé pour Keyfactor Tech Days - réservez votre place dès aujourd'hui !

  • Accueil
  • Blog
  • L'appartenance à un groupe et l'évolution des sources d'autorité - Keyfactor

L'appartenance à un groupe et l'évolution des sources d'autorité - Keyfactor

Dans le cadre d'un projet récent, il fallait que les utilisateurs et les groupes soient transférés du domaine B vers le domaine A. C'était assez simple, mais il y avait un problème : lorsque les applications étaient transférées vers le domaine A, leurs groupes étaient "détenus" par le domaine A, qui faisait désormais autorité pour tous les attributs des groupes (dans ce cas, la source faisant autorité est déterminée par l'OU dans laquelle se trouve le groupe dans le domaine B. Le nom de cette OU est stocké dans le fichier de configuration de l'extension des règles).

Une extension de règles personnalisées est utilisée pour déterminer l'agent de gestion qui fait autorité et pour s'assurer que les objets utilisateur ajoutés à l'attribut membre appartiennent au domaine approprié.

La définition d'un flux d'attributs avancés d'un membre à l'autre donne ce message :

"Defining a rules extension import attribute flow to a metaverse reference attribute is not allowed".

Mais il existe un moyen de contourner ce problème.

Voici comment procéder :

- Domaine A : Il s'agit du domaine de l'organisation mère.

- Domaine B : Il s'agit du domaine de l'organisation fusionnée avec l'organisation mère.

- Les groupes de sécurité commencent tous leur vie dans le domaine B. Au fur et à mesure de la fusion, leur source d'autorité passera au domaine A, groupe par groupe.

Ceci est indiqué lorsque le groupe est déplacé manuellement vers l'OU appelée "Domain A Managed" dans le Domain B.

Voici la solution. Le code de chaque étape suivra ce résumé :

  1. Créer un nouvel attribut multivalué de type chaîne indexée dans le métavers appelé memberString.
  2. Créez un nouvel attribut appelé SourceCSEntryDN pour contenir la valeur DN du groupe de sécurité dans le domaine B. (Cette valeur est utilisée pour rechercher l'OU à laquelle appartient le groupe dans le domaine B lorsque l'AM du domaine A synchronise le groupe). (Cette valeur est utilisée pour rechercher l'OU auquel le groupe appartient sur le domaine B lorsque l'autorité de gestion du domaine A synchronise le groupe).
  3. Écrire une fonction dans le code d'extension des règles pour déterminer dans quelle OU se trouve le groupe.
  4. Créer un flux d'attributs d'importation avancé sur les deux agents de gestion pour diriger les membres vers le nouvel attribut memberString si cet agent de gestion fait autorité. Cette valeur contiendra le DN des utilisateurs qui sont membres du groupe.
  5. Rédigez une règle de flux d'attribut d'exportation sur les deux agents de gestion pour transférer les membres de l'attribut memberString vers l'attribut member si cet agent de gestion fait autorité. Une partie de cette fonction consiste à trouver le connecteur pour le domaine approprié sur le mventry pour le CN de l'utilisateur qui se trouve dans l'attribut memberString.

Pour les étapes 4 et 5, la vérification de l'étape 3 est effectuée pour s'assurer que les bonnes valeurs d'attribut sont traitées comme faisant autorité.

Pour le code partagé, une dll Utils générale appelée "UtilsForFIM" a été créée. Du code a également été ajouté aux règles d'importation et d'exportation des flux d'attributs dans les extensions de règles respectives.

Pour l'étape 2, le flux d'attributs sur l'agent de gestion du domaine B est le suivant :

<dn>, cn ->SourceCSEntryDN

Ce code place l'intégralité du DN de l'objet utilisateur dans l'attribut SourceCSEntryDN.

Voici le code de l'étape 2 :

Case “cd.group:<dn>,cn->mv.group:SourceCSEntryDN”

Dim sDNPath As String

Dim dn As ReferenceValue = csentry.DN

sDNPath = (dn.Subcomponents(0, dn.Depth).ToString())

mventry("SourceCSEntryDN").Value = sDNPath

Pour l'étape 3, le code est un peu différent pour les agents de gestion des domaines A et B. L'agent de gestion du domaine A s'appuie sur le SourceCSEntryDN alors que l'agent de gestion du domaine B peut accéder directement au dn de la csentry.

Les deux ont un flux d'attributs comme suit sur l'agent de gestion :

<dn>,member -> memberString

Ce code vérifie si le DN du groupe contient l'OU qui indique que le groupe doit être géré par le domaine A. Les fonctions sont différentes pour chaque domaine. Le domaine A doit s'appuyer sur la valeur qui a été placée dans l'attribut SourceCSEntryDN, tandis que le domaine B peut lire le DN directement à partir de l'objet csentry.

Voici le code de l'étape 3 pour le domaine A :

Public Shared Function IsGroupManagedByDomAByDN(ByVal sDNPath As String) As Boolean

Dim bIsGroupManagedByDomA As Boolean

Dim sDomAManagedGroupOU As String

bIsGroupManagedByDomA = False

sDomAManagedGroupOU = UtilsForFIM.CommonUtils.ReadAppSetting("FIMConfig/General", "DomAManagedGroupOU").ToString()

If (InStr(sDNPath.ToLower(), sDomAManagedGroupOU.ToLower())) < 1 Then

Le groupe est toujours géré par le domaine d'acquisition.

bIsGroupManagedByDomA = False

Autre

Le groupe est désormais géré par DomA.

bIsGroupManagedByDomA = True

Fin Si

Retour bIsGroupManagedByDomA

Fin de la fonction

Voici le code de l'étape 3 pour le domaine B :

Public Shared Function IsGroupManagedByDomA(ByVal csentry As CSEntry) As Boolean

Dim bIsGroupManagedByDomA As Boolean

Dim dn As ReferenceValue = csentry.DN

Dim sDomAManagedGroupOU As String

bIsGroupManagedByDomA = False

sDomAManagedGroupOU = UtilsForFIM.CommonUtils.ReadAppSetting("FIMConfig/General", "DomAManagedGroupOU").ToString()

Dim sDNPath As String

sDNPath = (dn.Subcomponents(0, dn.Depth).ToString())

If (InStr(sDNPath.ToLower(), sDomAManagedGroupOU.ToLower())) < 1 Then

Le groupe est toujours géré par le domaine d'acquisition.

bIsGroupManagedByDomA = False

Autre

Le groupe est désormais géré par DomA.

bIsGroupManagedByDomA = True

Fin Si

Retour bIsGroupManagedByDomA

Fin de la fonction

Pour les deux domaines, le code lit les membres du groupe et écrit la valeur dn des utilisateurs dans un attribut multivalué appelé memberString. Voici le flux d'attributs pour l'étape 4 et le code :

<dn>,member -> memberString

Le code de cette transformation pour l'agent de gestion du domaine A est le suivant :

Case “cd.group:<dn>,member->mv.group:memberString”

Si (mventry("SourceCSEntryDN").IsPresent) Alors

Dim bIsGroupManagedByDomA As Boolean = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)

Si (bIsGroupManagedByDomA = True) Alors

mventry("memberString").Values.Clear()

Dim i As Integer

For i = 0 To (csentry("member").Values.Count - 1)

Dim sMember As String = csentry("member").Values.Item(i).ToString()

mventry("memberString").Values.Add(sMember)

Suivant

Fin Si

Fin Si

Le code de cette transformation lorsque l'agent de gestion est le domaine B est le suivant :

Case "cd.group:member->mv.group:memberString"

Dim bIsGroupManagedByDomA As Boolean

bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)

Si (bIsGroupManagedByDomA = False) Alors

mventry("memberString").Values.Clear()

Dim i As Integer

For i = 0 To (csentry("member").Values.Count - 1)

Dim sMember As String = csentry("member").Values.Item(i).ToString()

mventry("memberString").Values.Add(sMember)

Suivant

Fin Si

Pour l'étape 5, les deux agents de gestion ont la règle de flux d'attributs suivante :

member <- memberString

Voici la règle de flux des attributs d'exportation pour le domaine A :

Case “cd.group:member<-mv.group:memberString”

Dim bIsGroupManagedByDomA As Boolean

Si (mventry("SourceCSEntryDN").IsPresent) Alors

bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)

Si (bIsGroupManagedByDomA = False) Alors

csentry("membre").Values.Clear()

UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)

Fin Si

Autre

Source csentry dn is missing

Fin Si

Et pour le domaine B :

Case “cd.group:member<-mv.group:memberString”

Dim bIsGroupManagedByDomA As Boolean

bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)

Si (bIsGroupManagedByDomA = True) Alors

csentry("membre").Values.Clear()

UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)

Fin Si

Voici la fonction memberStringToMembers qui traduit l'appartenance à partir de la valeur de la chaîne vers l'entrée de données appropriée pour le domaine vers lequel le groupe est exporté. Notez que cette fonction prend le connecteur sur l'événement du membre pour l'autorité de gestion qui traite l'exécution actuelle afin que nous ayons l'objet de l'utilisateur dans le domaine approprié.

Public Shared Sub memberStringToMembers(ByVal mventry As MVEntry, ByVal csentry As CSEntry, ByVal sMAName As String)

Dim i As Integer

For i = 0 To (mventry("memberString").Values.Count - 1)

Dim sMember As String = mventry("memberString").Values.Item(i).ToString()

Il faut trouver l'événement pour ce connecteur et ensuite déterminer l'entrée DomA.

Dim mvEntryMember() As MVEntry

Dim arrMVEntryCN As Array

Dim sMemberCN As String

arrMVEntryCN = sMember.Split(",")

sMemberCN = arrMVEntryCN(0).Replace("CN=", "").Replace("cn=", "")

mvEntryMember = Utils.FindMVEntries("cn", sMemberCN, 1)

Si (mvEntryMember.Length > 0) Alors

Dim ManagementAgent As ConnectedMA

Dim Connecteurs As Integer

ManagementAgent = mvEntryMember(0).ConnectedMAs(sMAName)

Connecteurs = ManagementAgent.Connectors.Count

Si (Connecteurs > 0) Alors

Dim csentryFound As CSEntry

csentryFound = ManagementAgent.Connectors.ByIndex(0)

csentry("membre").Values.Add(mvEntryMember(0).ConnectedMAs.Item(sMAName).Connectors.ByIndex(0).DN.ToString().ToLower()))

Fin Si

Fin Si

Suivant

End Sub