dimanche 3 août 2014

Comment déléguer : Sécuriser l'implémentation de votre modèle de délégation

Bonjour à tous,

Je vous propose aujourd'hui un article sur la sécurisation de votre modèle de délégation.

En effet, il m'arrive souvent de voir des environnements où de la délégation d'administration a été mise en place  mais n'a pas été sécurisée.
Les cas les plus fréquents étant les comptes d'administration présents dans la même OU que les utilisateurs standards et même chose pour les groupes du modèle de délégation.

Le risque est relativement simple à comprendre. Si vous avez par exemple délégué ne serai-ce que la réinitialisation de mot de passe à une population type Service Desk sur l'OU des utilisateurs. Rien ne les empêche de réinitialiser le mot de passe d'un compte d'administration qui est présent dans la même OU puis d'utiliser ce compte.
Pareil pour les groupes, si vous déléguez la gestion du membership sur une OU contenant des groupes et que vos groupes de délégation sont dans cette OU, un utilisateur ayant cette délégation peut s'ajouter dans un groupe de délégation pour faire une élévation de privilège.

On peut aller plus loin. Le simple fait de pouvoir savoir quels sont les comptes d'administration et quels sont les groupes et leurs membres présente un risque puisque avec ces informations une attaque sera plus ciblée.

Le constat est simple, les comptes, groupes et postes à privilèges doivent être isolés.

Microsoft propose l'exemple suivant dans le guide de sécurité inclus avec Security Compliance Manager :



Nous allons voir comment automatiser la création de cette structure d'OU en suivant ce modèle (qui peut-être discutable et pas adapté à votre infrastructure).

On commence d'abord par récupérer les informations sur le domaine Active Directory qui nous seront utiles pour la suite du script :


On créé ensuite notre structure d'OU :


On peut vérifier la création :



Ensuite on créé nos groupes du modèle de délégation (dans le cas où ils n'existent pas).
Je créé ici uniquement un groupe qui me permettra d'administrer cette  arborescence d'OU et les objets qu'elle contient. Normalement je devrais créer tous les groupes de mon modèle de délégation.



Maintenant je vais supprimer les ACL existantes sur mes OU et je vais désactiver l'héritage :


On peut vérifier dans la console ADUC :


L'OU Service Admins n'est plus "visible" (Un article sur la visibilité des objets AD est prévu).
Si on vérifie les droits sur l'OU, on voit bien qu'il n'y a plus d'ACL et que l'héritage est désactivé.

  
Etant le propriétaire de l'objet, je peux toujours modifier les permissions.

Je crée ensuite les ACE correspondantes au modèle :


J'utilise les SID et non les noms des groupes dans mes ACE. Avec le SID on est sûr de positionner le bon groupe et non un groupe qui aurait pu être renommé.

On peut maintenant appliquer les ACE que l'on vient de créer :


Ce n'est pas prévu dans le modèle de Microsoft mais on peut reconfigurer la protection contre la suppression accidentelle sur les OU:


Et on peut finir par déplacer dans la structure les groupes à privilèges :


Je ne l'ai pas fait ici mais on pourrait aussi configurer les SACL sur cette structure d'OU.

Il ne reste plus qu'à déplacer les comptes d'administration et les postes d'administration dans les OU.

Voici le code que j'ai utilisé pour faire cette implémentation, il faudra bien évidemment l'adapter au contexte et aux besoins :


Import-Module ActiveDirectory

### Getting Domain Informations
$Domain = Get-ADDomain
$DomainBaseDN = ($Domain).DistinguishedName
$DomainSID = $Domain.DomainSID.Value
$RootDSE = Get-ADRootDSE

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

### Create OU Structure
$ServiceAdminsOU = New-ADOrganizationalUnit -Name "Service Admins" -Path $DomainBaseDN -PassThru
$UsersAndGroupsOU = New-ADOrganizationalUnit -Name "Users And Groups" -Path $ServiceAdminsOU.DistinguishedName -PassThru
$AdminWorkstationsOU = New-ADOrganizationalUnit -Name "Admin Workstations" -Path $ServiceAdminsOU.DistinguishedName -PassThru

### Create Delegation Groups
$GroupADServiceAdmins = New-ADGroup -GroupCategory Security -GroupScope DomainLocal -Name ("AD Service Admins") -Path $UsersAndGroupsOU.DistinguishedName -PassThru

### Removing Access Rule on Service Admins OU
Get-ADOrganizationalUnit -Filter * -SearchBase $ServiceAdminsOU.DistinguishedName|%{
    $ACLOU = Get-Acl ("AD:\" + $_)
    $ACLOU.Access|%{$ACLOU.RemoveAccessRule($_)|out-null}
    $ACLOU|Set-Acl -Path ("AD:\" + $_)
    }

### Removing inheritance on Service Admins OU
$ACLAdmOU = Get-Acl ("AD:\" + $ServiceAdminsOU.DistinguishedName)
$ACLAdmOU.SetAccessRuleProtection($true,$false)
$ACLAdmOU | Set-Acl -Path ("AD:\" + $ServiceAdminsOU.DistinguishedName)

### Creating Access Rule for Administrators
[System.Security.Principal.SecurityIdentifier] $SID = "S-1-5-32-544"
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit

### Creating Access Rule for Domain Admins
[System.Security.Principal.SecurityIdentifier] $SID = ($DomainSID + "-512")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit

### Creating Access Rule for Enterprise Admins
[System.Security.Principal.SecurityIdentifier] $SID =  ($DomainSID + "-519")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE03 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit

### Creating Access Rule for Pre-Windows 2000 Compatible Access
[System.Security.Principal.SecurityIdentifier] $SID = ("S-1-5-32-554")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericRead,ListObject"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "Descendents"
[system.guid]$GUID = $GuidMap["User"]
$ACE04 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit,$GUID

### Creating Access Rule for AD Service Admins
[System.Security.Principal.SecurityIdentifier] $SID = $GroupADServiceAdmins.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE05 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit

### Setting Access Rules
$ObjectDN = $ServiceAdminsOU.DistinguishedName

### Applying new Access Rules
$ACL = Get-Acl ("AD:\" + $ObjectDN)
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL.AddAccessRule($ACE03)
$ACL.AddAccessRule($ACE04)
$ACL.AddAccessRule($ACE05)
$ACL|Set-ACL -Path ("AD:\" + $ObjectDN)


### Protect OU from Accidental Deletion
Set-ADOrganizationalUnit $ServiceAdminsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
Set-ADOrganizationalUnit $UsersAndGroupsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
Set-ADOrganizationalUnit $AdminWorkstationsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true

### Move Highly Privileged Groups
### Move Enterprise Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-519")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName

### Move Domain Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-512")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName

### Move Schema Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-518")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName

### Move Administrator Account (RID 500)
Move-ADObject -Identity ((Get-ADUser -Identity ($DomainSID + "-500")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName



A très bientôt.

Aucun commentaire:

Enregistrer un commentaire