{"id":1272,"date":"2025-09-12T16:29:33","date_gmt":"2025-09-12T14:29:33","guid":{"rendered":"https:\/\/dyb.fr\/?p=1272"},"modified":"2025-09-12T16:29:33","modified_gmt":"2025-09-12T14:29:33","slug":"automatiser-la-gestion-des-droits-avec-agdlp","status":"publish","type":"post","link":"https:\/\/dyb.eu\/blog\/automatiser-la-gestion-des-droits-avec-agdlp\/","title":{"rendered":"Automatiser la gestion des droits avec AGDLP"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Imaginez : votre collaborateur le plus ancien, 20 ans de maison, part en retraite.<br>Son compte Active Directory a accumul\u00e9 des droits au fil des ann\u00e9es : acc\u00e8s \u00e0 la Comptabilit\u00e9, \u00e0 des dossiers Juridiques sensibles, voire \u00e0 des projets anciens.<br>Probl\u00e8me : ni lui, ni vous ne savez pr\u00e9cis\u00e9ment <strong>\u00e0 quoi il a acc\u00e8s<\/strong>. R\u00e9sultat ? Vous \u00eates bloqu\u00e9s : impossible de fermer son compte proprement, et vous laissez tourner un identifiant inactif, qui reste une <strong>faille de s\u00e9curit\u00e9<\/strong> potentielle.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Chez <strong>DYB<\/strong>, nous voyons ce sc\u00e9nario tous les mois : h\u00e9ritage de droits mal g\u00e9r\u00e9s, dossiers partag\u00e9s en vrac, comptes laiss\u00e9s ouverts par peur de casser une application ou bloquer l\u2019acc\u00e8s \u00e0 des documents.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">La r\u00e9ponse : l\u2019AGDLP automatis\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La bonne pratique en s\u00e9curit\u00e9 Windows Server et Active Directory est le mod\u00e8le <strong>AGDLP<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Accounts (comptes utilisateurs)<\/li>\n\n\n\n<li>Global groups (par \u00e9quipe ou m\u00e9tier)<\/li>\n\n\n\n<li>Domain Local (porteurs des droits NTFS)<\/li>\n\n\n\n<li>Permissions (appliqu\u00e9es sur les dossiers)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ce mod\u00e8le permet de garder une structure claire et facilement maintenable.<br>\ud83d\udc49 Mais mis en place \u00e0 la main, c\u2019est long, fastidieux, et donc souvent b\u00e2cl\u00e9.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">L\u2019automatisation par DYB<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons con\u00e7u un script PowerShell qui applique automatiquement cette logique :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cr\u00e9ation des groupes GDL pour chaque projet ou dossier, en lecture (RO) et \u00e9criture (RW).<\/li>\n\n\n\n<li>Imbrication automatique des groupes existants dans le bon niveau de droits.<\/li>\n\n\n\n<li>Attribution simplifi\u00e9e des permissions NTFS.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;#\n.SYNOPSIS\n Script DYB : cr\u00e9ation et imbrication automatique de groupes AGDLP pour s\u00e9curisation des acc\u00e8s projets.\n\n.DESCRIPTION\n - Parcourt deux OUs source (groupes existants de projets Clients et Internes).\n - Cr\u00e9e automatiquement pour chaque groupe trouv\u00e9 deux groupes Domain Local (GDL_{Nom}_RO et GDL_{Nom}_RW).\n - Ajoute le groupe source comme membre du GDL_{Nom}_RW (pattern AGDLP).\n - Permet une gestion claire et \u00e9volutive des droits NTFS.\n\n Version : DYB 2025\n#>\n\nImport-Module ActiveDirectory\n\n# ================== VARIABLES \u00c0 ADAPTER ==================\n# OUs SOURCE : l\u00e0 o\u00f9 se trouvent tes groupes \"projets\" existants\n$OU_Source_Clients  = \"OU=Projets-Clients,OU=Groups,DC=dyb,DC=lan\"\n$OU_Source_Internes = \"OU=Projets-Internes,OU=Groups,DC=dyb,DC=lan\"\n\n# OUs CIBLES : o\u00f9 cr\u00e9er les GDL_*_RO\/RW correspondants\n$OU_Target_Clients  = \"OU=ACL-Clients,OU=Security,DC=dyb,DC=lan\"\n$OU_Target_Internes = \"OU=ACL-Internes,OU=Security,DC=dyb,DC=lan\"\n# =========================================================\n\n# Sanitize sAMAccountName (&lt;=20, obligatoire en AD)\nfunction New-SafeSam {\n    param(&#91;Parameter(Mandatory)]&#91;string]$Name)\n    $base = ($Name -replace \"&#91;^0-9A-Za-z_-]\", \"_\")\n    if ($base.Length -le 20) { return $base }\n\n    # hash court stable si trop long\n    $hash = &#91;System.BitConverter]::ToString(\n        (New-Object System.Security.Cryptography.SHA1Managed).ComputeHash(\n            &#91;System.Text.Encoding]::UTF8.GetBytes($base)\n        )\n    ).Replace(\"-\",\"\").Substring(0,4).ToLower()\n\n    $keep = 20 - 5\n    return ($base.Substring(0,$keep) + \"_\" + $hash)\n}\n\n# Cr\u00e9ation des groupes GDL_{Nom}_RO et GDL_{Nom}_RW\nfunction Ensure-GDLGroups {\n    param(\n        &#91;Parameter(Mandatory)]&#91;string]$SourceOU,\n        &#91;Parameter(Mandatory)]&#91;string]$TargetOU\n    )\n\n    $srcGroups = Get-ADGroup -SearchBase $SourceOU -LDAPFilter \"(objectClass=group)\" -SearchScope OneLevel `\n                 -Properties name | Sort-Object Name\n\n    foreach ($g in $srcGroups) {\n        $projName = $g.Name\n        foreach ($right in @(\"RO\",\"RW\")) {\n            $cnName  = \"GDL_{0}_{1}\" -f $projName, $right\n            $samName = New-SafeSam $cnName\n\n            $existing = Get-ADGroup -LDAPFilter \"(cn=$cnName)\" -SearchBase $TargetOU -ErrorAction SilentlyContinue\n            if ($existing) {\n                Write-Host \"&#91;SKIP] $cnName existe d\u00e9j\u00e0 dans $TargetOU\"\n                continue\n            }\n\n            New-ADGroup -Name $cnName `\n                        -SamAccountName $samName `\n                        -GroupScope DomainLocal -GroupCategory Security `\n                        -Path $TargetOU `\n                        -Description (\"ACL {0} ({1})\" -f $projName,$right)\n\n            Write-Host \"&#91;OK] Cr\u00e9\u00e9 : $cnName (SAM:$samName)\"\n        }\n    }\n}\n\n# Ajout du groupe source dans GDL_{Nom}_RW\nfunction Add-Sources-To-RW {\n    param(\n        &#91;Parameter(Mandatory)]&#91;string]$SourceOU,\n        &#91;Parameter(Mandatory)]&#91;string]$TargetOU\n    )\n\n    $srcGroups = Get-ADGroup -SearchBase $SourceOU -LDAPFilter \"(objectClass=group)\" -SearchScope OneLevel `\n                 -Properties name,distinguishedName | Sort-Object Name\n\n    foreach ($g in $srcGroups) {\n        $projName = $g.Name\n        $targetRW = \"GDL_{0}_RW\" -f $projName\n\n        $safe = $targetRW.Replace(\"'\", \"''\")\n        $rwGroup = Get-ADGroup -Filter \"Name -eq '$safe'\" -SearchBase $TargetOU -ErrorAction SilentlyContinue\n        if (-not $rwGroup) {\n            Write-Warning \"Cible introuvable: $targetRW (skip).\"\n            continue\n        }\n\n        try {\n            Add-ADGroupMember -Identity $rwGroup.DistinguishedName -Members $g.DistinguishedName -ErrorAction Stop\n            Write-Host \"&#91;OK] $($g.Name) -> membre de $($rwGroup.Name)\"\n        } catch {\n            if ($_.Exception.Message -match \"already a member\") {\n                Write-Host \"&#91;SKIP] $($g.Name) d\u00e9j\u00e0 membre de $($rwGroup.Name)\"\n            } else {\n                Write-Warning \"\u00c9chec ajout membre: $($g.Name) -> $($rwGroup.Name) : $($_.Exception.Message)\"\n            }\n        }\n    }\n}\n\n# ==== LANCEMENT ====\nEnsure-GDLGroups -SourceOU $OU_Source_Clients  -TargetOU $OU_Target_Clients\nEnsure-GDLGroups -SourceOU $OU_Source_Internes -TargetOU $OU_Target_Internes\n\nAdd-Sources-To-RW -SourceOU $OU_Source_Clients  -TargetOU $OU_Target_Clients\nAdd-Sources-To-RW -SourceOU $OU_Source_Internes -TargetOU $OU_Target_Internes\n\nWrite-Host \"=== Termin\u00e9 : Groupes GDL cr\u00e9\u00e9s + imbrication RW r\u00e9alis\u00e9e ===\"\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Exemple concret : vos dossiers clients<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque client dispose de son dossier d\u00e9di\u00e9 avec des donn\u00e9es sensibles : contrats, factures, documents internes.<br>Notre script g\u00e9n\u00e8re automatiquement deux groupes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GDL_NomDuClient_RO<\/code> pour la consultation<\/li>\n\n\n\n<li><code>GDL_NomDuClient_RW<\/code> pour l\u2019\u00e9dition<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat : une gestion granulaire et s\u00e9curis\u00e9e des acc\u00e8s, sans pertes de temps ni erreurs humaines.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avec l\u2019AGDLP automatis\u00e9, vous gardez le contr\u00f4le sur vos partages de fichiers :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Droits clairs et audit\u00e9s<\/li>\n\n\n\n<li>Acc\u00e8s facilement r\u00e9voqu\u00e9s<\/li>\n\n\n\n<li>Risques r\u00e9duits en cas de d\u00e9part ou de mobilit\u00e9 interne<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Chez <strong>DYB<\/strong>, nous accompagnons les entreprises dans la mise en place de ces bonnes pratiques, avec un objectif simple : s\u00e9curiser vos donn\u00e9es tout en vous simplifiant l\u2019administration.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imaginez : votre collaborateur le plus ancien, 20 ans de maison, part en retraite.Son compte Active Directory a accumul\u00e9 des droits au fil des ann\u00e9es : acc\u00e8s \u00e0 la Comptabilit\u00e9, \u00e0 des dossiers Juridiques sensibles, voire \u00e0 des projets anciens.Probl\u00e8me : ni lui, ni vous ne savez pr\u00e9cis\u00e9ment \u00e0 quoi il a acc\u00e8s. R\u00e9sultat ? [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,22],"tags":[39,21,40,28],"class_list":["post-1272","post","type-post","status-publish","format-standard","hentry","category-adminsys","category-cybersecurite","tag-agdlp","tag-cybersecurite","tag-powershell","tag-windows"],"_links":{"self":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts\/1272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/comments?post=1272"}],"version-history":[{"count":0,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts\/1272\/revisions"}],"wp:attachment":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/media?parent=1272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/categories?post=1272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/tags?post=1272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}