Exchange : gérer les autorisation des boites partagées avec des groupes de sécurité

Exchange 2016Exchange 2019

Dans cet article, je vais vous expliquer comment gérer la délégation de boites aux lettres : Accès total avec un groupe de sécurité sur Exchange.

Ce qui va suivre peut s’applique aussi bien pour les boites aux lettres Utilisateurs que pour les boites aux lettres partagées.

Si vous avez déjà gérer des environnements Exchange, l’audit des Accès total aux boites aux lettres peut vite devenir un calvaire, car on peut pas voir facilement les accès aux boites aux lettres partagés par exemple d’un utilisateur.

Pour palier ce problème, on peut se dire que l’on va utiliser des groupes de sécurité, comme cela en regardant les groupes de sécurité d’un utilisateur on peut savoir à quelles boites aux lettres il peut accèder.

A partir de là, on peut être confronter à deux problèmes :

  • Si le groupe est créé directement dans l’Active Directory, on ne voit pas le groupe pour l’affecter à la boite aux lettres, car le groupe droit Universel et avoir une adresse email.
  • Si vous avez créé le groupe par l’ECP, vous arrivez à l’affecter, mais les boites aux lettres ne remonte pas automatiquement dans le client Outlook, on va voir pas la suite pourquoi.

Fonctionnement de l’accès total sur une boite aux lettre

Avant de rentrer dans le vif du sujet, je vais vous montrer comme Exchange fait pour appliquer les droits et le mappage dans le client Outlook.

Pour illustrer ce tutoriel, j’ai créé une boite aux lettres partagée : Test

Pour le moment, il y a seulement les droits par défaut au niveau de l’Accès total.

Au niveau de l’Active Directory, si on regarde l’attribut msExchDelegateListLink celui-ci est vide.

C’est grâce à l’attribut msExchDelegateListLink que l’auto mapping se fait dans le client Outlook.

Comme le montre la capture ci-dessous, je me suis mis l’Accès total à la boite aux lettres :

Une fois les droits appliqués, on peut voir que l’attribut DN de mon utilisateur est ajouté à l’attribut msExchDelegateListLink de la boite partagée.

Maintenant que l’on a étudié le fonctionnement, on va passer à la pratique avec l’utilisation d’un groupe de sécurité.

Création du groupe de sécurité pour la délégation de droits

Afin que le groupe de sécurité soit créé correctement, on va utiliser l’ECP d’Exchange pour le créer, depuis la gestion créer un nouveau Groupe de sécurité.

A minima, saisir le Nom d’affichage et l’Alias du groupe.

Le groupe de sécurité est créé :

A la suite de la création, je me suis membre du groupe.

En regardant le groupe depuis la console Utilisateurs et ordinateurs Active Directory, on peut voir l’étendu du groupe est Universelle et qu’une adresse de messagerie a été ajoutée, au passage si on regarde le Nom du groupe, on peut voir qu’une série de chiffre a été ajouté à la fin.

Au passage, on peut voir que je suis bien membre du groupe.

Configuration de la délégation : Accès total

De retour dans l’ECP d’Exchange, j’ajoute le groupe pour déléguer l’accès total.

Après enregistrement, si on retrouve dans l’Active Directory, on peut voir que le champ msExchDelegateListLink est vide.

Exchange ajoute seulement le DN des objets utilisateurs et non des groupes de sécurités, de ce fait l’auto-mapping du client Outlook ne fonctionne pas.

On peut ajouter manuellement la boite aux lettres dans Outlook ou passer par l’interface web OWA pour consulter la boite aux lettres partagés. Ce qui n’est pas forcément pratique pour les utilisateurs.

Pour avoir l’auto-mapping, il faut ajouter les DN des utilisateurs qui sont membre du groupe dans l’attribut msExchDelegateListLink  de la boites aux lettres.

Pour se faire, j’ai écris un script qui permet de le faire, lors de son exécution, il va demander le SamAccoutName ou l’adresse email de la boite aux lettres et il va mettre à jour automatiquement (ajout/suppression) l’attribut msExchDelegateListLink .

Pour fonctionner correctement, il faut appliquer seulement les autorisations par des groupes et le script devra être utiliser à chaque mise à jour de groupe.

Voici le script :

<#

    Versions : 
      - 20240214 : Possibilite de recuperer une BAL avec UPN
      - 20240226 : Ajout de la recherche de la BAL avec l'attribut mail
#>
param(
    $Mailbox = ""
)

Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$DebugPreference = 'Continue'

#
# START FUNCTIONS
#
function UpdateAutoMapping {
    
    param(
        $MailBoxDN='',
        $GroupForMailBox=''
    )

    $UserMembers = @()
   
    # Debug
    Write-Debug $MailBoxDN
    Write-Debug $GroupForMailBox

    $GroupMemberShip = (Get-ADGroupMember -Identity $GroupForMailBox | Where-Object 'ObjectClass' -EQ 'user' | Where-Object 'DistinguishedName' -NE $MailBoxDN).DistinguishedName
    $GroupMemberShip | ForEach-Object {$Usermembers += $_}
    Write-Host "List of user in group : $GroupForMailBox" -ForegroundColor Yellow
    $GroupMemberShip
    Write-Host "=================================="

    # Get Delegation In Box
    $MailboxDelegateList = (Get-ADUser -Identity $MailBoxDN -Properties msExchDelegateListLink).msExchDelegateListLink

    # Update Delegartion
    ## Remove
    ForEach ($MailboxDelegateListEntry in $MailboxDelegateList) {
        If ($UserMembers -notcontains $MailboxDelegateListEntry) {
            Set-ADUser -Identity $MailBoxDN -Remove @{msExchDelegateListLink="$MailboxDelegateListEntry"}
            Write-Host "Remove user : $MailboxDelegateListEntry" -ForegroundColor Red
        }
    }
    ## ADD
    ForEach ($UserMember in $UserMembers) {
        If ($MailboxDelegateList -notcontains $UserMember) {
            Set-ADUser -Identity $MailBoxDN -Add @{msExchDelegateListLink="$UserMember"}
            Write-Host "Add user : $UserMember" -ForegroundColor Green
        }
    }
}

function IsValidEmail{
    param([string]$EmailAddress)

    try {
        $null = [mailaddress]$EmailAddress
        return $true
    }
    catch {
        return $false
    }
}

#
# END FUNCTIONS
#

#
# MAIN
#

if( $Mailbox -eq "" ){
    $Mailbox = Read-Host "Entre le SamAccountName ou UPN la boite aux lettres"
}

if( IsValidEmail -EmailAddress $Mailbox ){
    # Get User objet of mailbox by UPN
    try{
        $UserInfos = Get-ADUser -Filter {UserPrincipalName -eq $Mailbox} -Properties *
        
        if( $UserInfos -eq $null ){
            Write-Host "Boite aux lettres non trouvee par UPN, essaie par email" -ForegroundColor Yellow
            $UserInfos = Get-ADUser -Filter {mail -eq $Mailbox} -Properties *
        }        

        if( $UserInfos -eq $null ){
            Write-Host "Utilisateur non trouver par UPN et par Email" -ForegroundColor Red
            exit
        }

        $Mailbox = $UserInfos.SamAccountName
        Write-Host "Boite aux lettres trouvee, le  SamAccountName est : " $Mailbox
        Write-Host "Le DN de l'utilisateur de la boite au lettre est : " $UserInfos.DistinguishedName -ForegroundColor Green
    }
    catch{
        Write-Warning "La boite n a pas ete trouvee"
        exit 99
    }
}else{
    # Get User objet of mailbox
    try{
        $UserInfos = Get-ADUser -Identity $Mailbox
        Write-Host "Utilisateur de la boite au lettre valide : " $UserInfos.DistinguishedName -ForegroundColor Green
    }
    catch{
        Write-Warning "L utilisateur de la boite n a pas ete trouve"
        exit 99
    }
}

Write-Host "Recuperation des permissions de la boite aux lettres" -ForegroundColor Yellow

$Permissions = Get-MailboxPermission -Identity "$Mailbox" | Where-Object{($_.IsInherited -eq $false) -and ($_.User -ne "NT AUTHORITY\SELF") -and ($_.AccessRights -like "FullAccess")}

if( $Permissions.count -eq 0 ){
    Write-Warning "Pas de droits trouves a appliquer sur la boite aux lettres"
    exit 99
}  

foreach( $Permission in $Permissions){
    $GroupGrandRight = ""
    Write-Host "Permission pour l objet AD : " $Permission.user -ForegroundColor Yellow

    try{
        $GroupGrandRight = Get-AdGroup -Identity $Permission.user.SecurityIdentifier.value -ErrorAction SilentlyContinue
    }catch{
        Write-Warning "L Objet n est pas un groupe AD"
    }  
  
    if( $GroupGrandRight ){
        Write-Host "Group SamAccountName : " $GroupGrandRight.SamAccountName -ForegroundColor Yellow
        UpdateAutoMapping -MailBoxDN $UserInfos.DistinguishedName -GroupForMailBox $GroupGrandRight.SamAccountName
    }
}

Vous l’aurez donc compris, pour utiliser des groupes de sécurité pour appliquer l’Accès total au boites aux lettres (partagées), vous devez également créer un groupe qui lui est associé, ajouter les membres et passer le script.

Bonus : Script de création de boites partagées et du groupe

En bonus, voici un script PowerShell que vous pouvez utiliser lors de la création de la boites aux lettres partagées, qui va en même temps vous proposer de créer un groupe et l’attribuer à la boites aux lettres dans les options de délégation. Après, il faut ajouter les utilisateurs dans le groupe et ensuite passer le script ci-dessus.

#
# Script de creation de boite mail
#
param(
    $OU = "OU=SharedMailbox,DC=domain,DC=lan",
    $GroupOU = "OU=Goups,DC=domain,DC=lan",
    #$Password = ""
    $MXDB = "Default Dabatase",
    $EmailAdr = "",
)

Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

function IsValidEmail{
    param([string]$EmailAddress)

    try {
        $null = [mailaddress]$EmailAddress
        return $true
    }
    catch {
        return $false
    }
}

function GetAliasFromEmail{
    param([string]$EmailAddress)

    $CharArray = $EmailAddress.Split("@")

    return $CharArray[0]
}

$MBType = Read-Host "Quelle type de boites aux lettre [U]tilisateur / [P]artagee / [R]essource ?"


$EmailAdr = Read-Host "Saisir l'adresse Email (UPN) de la boite partagee "

# Check if $EmailAdr is correct
if( !(IsValidEmail -EmailAddress $EmailAdr) ){
	Write-Host "Adresse email incorrecte ($EmailAdr) ! Arret du script, relancer le pour faire la creation du compte." -ForegroundColor Red
	exit
}

# Get alias for create Mailbox
$Alias = GetAliasFromEmail -EmailAddress $EmailAdr

# Create Mailbox
try{
	New-Mailbox -Shared -Name $EmailAdr -DisplayName $EmailAdr -PrimarySmtpAddress $EmailAdr -Database $MXDB -OrganizationalUnit $OU -Alias $Alias
}
catch{
	Write-Host "Une erreur est survenu pendant la creation de la boite aux lettres ! "
	exit 99
}

# Process group for set Right
$CreateGroup = Read-Host "Voulez vous creer un groupe pour gerer les autorisations [O/n]"

if( $CreateGroup -eq "n" ){
	exit
}

# Prompt for group name
$GroupName = Read-Host "Saisir le nom du groupe sous le format GU_BAL_ALIAS"

# Set group to Upper
$GroupName = $GroupName.ToUpper()

# Create Group
New-DistributionGroup -Name $GroupName -Type "Security" -OrganizationalUnit $GroupOU

# Pause 5 sec
Write-Host "Wait 5 secondes ..." -ForegroundColor Gray
Start-Sleep -Seconds 5

# Hidde Group from Address book
Set-DistributionGroup -Identity $GroupName -HiddenFromAddressListsEnabled $true

# Add permissions
Add-MailboxPermission $EmailAdr -User $GroupName -AccessRights FullAccess -InheritanceType All
Start-Sleep -Seconds 2
Add-RecipientPermission $EmailAdr -AccessRights SendAs -Trustee $GroupName

Write-Host "Boite aux lettres partagee creee" -ForegroundColor Green

exit
Romain Drouche
Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire