jeudi 17 juillet 2014

Comment déléguer : la gestion des rôles FSMO


Bonjour à tous.

J'avais commencé à évoquer le sujet dans mon article précédent sur la Délégation d'administration Active Directory et Powershell .

Je commence donc une nouvelle série d'articles sur le sujet de la délégation d'administration qui est un sujet essentiel lorsque l'on parle de sécurité et d'Active Directory. Je me suis rendu compte au travers de mes différentes missions que ce sujet n'est pas toujours bien maîtrisé et qu'il peut en résulter de gros risques si son implémentation n'a pas été correctement effectuée.

L'objectif de cette série est d'être en mesure d'effectuer une délégation d'administration très granulaire pour limiter les droits au strict nécessaire (principe du moindre privilège) et essayer de tendre vers le "Zéro Admin" membre des groupes à privilèges pré-définis.


Aujourd'hui nous allons voir comment déléguer la gestion des rôles FSMO.

Il y a 2 parties dans cette délégation, le transfert et le transfert forcé (seize).
Le transfert utilise des droits étendus (Extended Rights).



Le second nécessite d'avoir les droits d'écriture sur l'attribut FSMORoleOwner.



Bien sûr, on peut faire cette délégation via l'interface, mais maintenant que l'on sait le faire en Powershell, on ne va pas se priver.

J'utilise ici 2 morceaux de code de Joe Corey qu'il a publié dans l'article suivant Active Directory Delegation via PowerShell.
Ils vont nous permettre de récupérer le GUID des droits étendus et de l'attribut FSMORoleOwner.

Je commence donc par importer le module ActiveDirectory, je récupère l'objet RootDSE et mon groupe de délégation nommé "Manage FSMO" et je construit les 2 hashtables avec le code de Joe.



Le principe est toujours le même :
Je créé les ACE à ajouter, je récupère les ACL de l'objet, j'ajoute les ACE dans les DACL et je réapplique les ACL sur l'objet.

Voici pour le rôle Schema Master :


On peut vérifier que les droits ont bien été positionnés:



Nos droits ont bien été positionnés, il ne reste plus qu'à faire pareil pour les 4 autres rôles FSMO.
Je vais m'arrêter ici, le principe reste le même.

Voici le code complet :

Import-Module ActiveDirectory

$RootDSE = Get-ADRootDSE
$ManageFSMO = Get-ADGroup "Manage FSMO"

### Getting Class And Attribute GUID
$GuidMap = @{}
Get-ADObject -SearchBase ($RootDSE.SchemaNamingContext) -LDAPFilter "(schemaidguid=*)" -Properties lDAPDisplayName,schemaIDGUID |% {
    $GuidMap[$_.lDAPDisplayName]=[System.GUID]$_.schemaIDGUID
    }

### Getting Extended Rights GUID
$ExtendedRightsMap = @{}
Get-ADObject -SearchBase ($RootDSE.ConfigurationNamingContext) -LDAPFilter "(&(objectclass=controlAccessRight)(rightsguid=*))" -Properties displayName,rightsGuid | % {
    $ExtendedRightsMap[$_.displayName]=[System.GUID]$_.rightsGuid
    }


### Schema Master
$ObjectDN = $RootDSE.schemaNamingContext
### Change-Schema-Master
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "ExtendedRight"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID =  $ExtendedRightsMap["Change Schema Master"]
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Write Permission FSMORoleOwner Attribute
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "WriteProperty"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID = $GuidMap["FSMORoleOwner"]
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Setting ACE
$ACL = Get-Acl AD:\$ObjectDN
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL|Set-ACL


### Naming Master
$ObjectDN = "CN=Partitions," + $RootDSE.configurationNamingContext
### Change-Domain-Master
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "ExtendedRight"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID =  $ExtendedRightsMap["Change Domain Master"]
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Write Permission FSMORoleOwner Attribute
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "WriteProperty"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID = $GuidMap["FSMORoleOwner"]
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Setting ACE
$ACL = Get-Acl AD:\$ObjectDN
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL|Set-ACL


### Infrastructure Master
$ObjectDN = "CN=Infrastructure," + $RootDSE.defaultNamingContext
### Change-Infrastructure-Master
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "ExtendedRight"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID =  $ExtendedRightsMap["Change Infrastructure Master"]
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Write Permission FSMORoleOwner Attribute
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "WriteProperty"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID = $GuidMap["FSMORoleOwner"]
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Setting ACE
$ACL = Get-Acl AD:\$ObjectDN
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL|Set-ACL


### PDC Emulator
$ObjectDN = $RootDSE.defaultNamingContext
### Change-PDC
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "ExtendedRight"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID =  $ExtendedRightsMap["Change PDC"]
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Write Permission FSMORoleOwner Attribute
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "WriteProperty"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID = $GuidMap["FSMORoleOwner"]
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Setting ACE
$ACL = Get-Acl AD:\$ObjectDN
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL|Set-ACL


### RID Master
$ObjectDN = "CN=RID Manager$,CN=System," + $RootDSE.defaultNamingContext
### Change-Rid-Master
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "ExtendedRight"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID =  $ExtendedRightsMap["Change Rid Master"]
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Write Permission FSMORoleOwner Attribute
[System.Security.Principal.SecurityIdentifier] $ManageFSMOSecId = $ManageFSMO.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "WriteProperty"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.GUID] $GUID = $GuidMap["FSMORoleOwner"]
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $ManageFSMOSecId,$ADRights,$AccCtrlType,$GUID
### Setting ACE
$ACL = Get-Acl AD:\$ObjectDN
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL|Set-ACL



Si vous regardez bien, le code est quasiment identique pour chacun des rôles, seul le droit étendu et le Distinguished Name changent.
J'aurai pu aussi simplifier le code au niveau des ACE car il y a beaucoup de redondance mais je trouve plus lisible d'avoir tous les paramètres du constructeur.

J'espère que cet article vous aura intéressé.
A bientôt.

Aucun commentaire:

Enregistrer un commentaire