Zum Inhalt springen
06 · Gruppenrichtlinien & SYSVOLTeil 1 von 4Grundlagen

Härtung von Gruppenrichtlinien und SYSVOL

GPO-Delegierung absichern, cpassword-Geheimnisse der Gruppenrichtlinieneinstellungen aus SYSVOL entfernen und stillen GPO-Missbrauch per Änderungskontrolle verhindern.

Florian Amette5 Min. Lesezeit

Gruppenrichtlinien sind eine der mächtigsten Steuerungsebenen in Active Directory — eine mit der falschen OU verknüpfte GPO oder ein an die falsche Gruppe delegiertes Bearbeitungsrecht kann eine geplante Aufgabe oder ein Startskript auf jeden Computer im Geltungsbereich verteilen. SYSVOL, die Freigabe, die GPO-Inhalte auf jeden Domänencontroller repliziert, bringt eine eigene lange Liste an Altlasten mit, allen voran das cpassword-Feld, das die Gruppenrichtlinieneinstellungen (Group Policy Preferences, GPP) hinterlassen haben. Dieser Leitfaden behandelt die Prüfung der Delegierung, die Bereinigung von cpassword, die SYSVOL-Berechtigungen und die Änderungskontrolle — jeweils mit PowerShell.

GPO-Delegierung: wer bearbeiten und verknüpfen darf

Zwei getrennte Berechtigungen sind entscheidend und werden oft verwechselt: Bearbeitungsrechte auf dem GPO-Objekt selbst (wer ändern darf, was die Richtlinie bewirkt) und Verknüpfungsrechte auf dem OU- oder Domänenobjekt (wer entscheiden darf, wo sie gilt). Ein Benutzer, der nur Bearbeitungsrechte auf einer GPO hat, die nirgends mit sensiblen Zielen verknüpft ist, stellt ein geringes Risiko dar; ein Benutzer mit Verknüpfungsrechten auf der OU Domain Controllers oder dem Domänenstamm ist ein hohes Risiko — unabhängig davon, welche GPOs er bearbeiten kann, denn er kann eine vorhandene, harmlos wirkende GPO verknüpfen, auf die jemand anderes Schreibzugriff hat.

Aktuelle GPO-Berechtigungen prüfen

PowerShell
Import-Module GroupPolicy

Get-GPO -All | ForEach-Object {
    $gpo = $_
    Get-GPPermission -Guid $gpo.Id -All |
        Where-Object { $_.Permission -in 'GpoEditDeleteModifySecurity','GpoEdit' } |
        Select-Object @{n='GPOName';e={$gpo.DisplayName}}, Trustee, Permission
} | Format-Table -AutoSize

Verknüpfungsrechte liegen in der ACL des OU-/Domänenobjekts, nicht der GPO. Prüfen Sie gezielt die OU Domain Controllers und den Domänenstamm, da dies die Verknüpfungsziele mit der größten Auswirkung sind:

PowerShell
$dcOU = (Get-ADDomain).DomainControllersContainer
$domainRoot = (Get-ADDomain).DistinguishedName

foreach ($target in @($dcOU, $domainRoot)) {
    Write-Host "== $target ==" -ForegroundColor Cyan
    (Get-Acl -Path "AD:\$target").Access |
        Where-Object { $_.ObjectType -eq 'f30e3bbe-9ff0-11d1-b603-0000f80367c1' -or $_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite' } |
        Select-Object IdentityReference, ActiveDirectoryRights, AccessControlType
}

Die GUID f30e3bbe-9ff0-11d1-b603-0000f80367c1 ist die Schema-GUID des Attributs gPLink; der Filter erfasst also gezielt Schreibzugriff auf das Verknüpfungsattribut sowie alle weit gefassten Berechtigungen, die es mit abdecken. Entfernen Sie hier jeden Berechtigten, der nicht Domänen-Admins oder eine eigens dafür beauftragte Gruppe für die Gruppenrichtlinienverwaltung ist — Verknüpfungsrechte auf der OU Domain Controllers dürfen nicht breit delegiert werden.

Das cpassword-Problem der Gruppenrichtlinieneinstellungen

Vor MS14-025 (KB2962486, veröffentlicht am 13. Mai 2014) konnten Administratoren über Gruppenrichtlinieneinstellungen Kennwörter lokaler Konten, Laufwerkszuordnungen mit Anmeldeinformationen, geplante Aufgaben und Dienste mit gespeicherten Kennwörtern per GPO verteilen. Das Kennwort wurde dabei mit einem statischen AES-Schlüssel verschlüsselt, den Microsoft als Teil der GPP-Dokumentation veröffentlicht hatte. Jeder authentifizierte Domänenbenutzer kann SYSVOL lesen, daher lässt sich jeder zurückgelassene cpassword-Wert von jedem mit Lesezugriff auf die Freigabe trivial entschlüsseln — die Verschlüsselung bietet keinen echten Schutz.

Der Patch verhinderte, dass der GPP-Editor neue cpassword-Werte schreibt, entfernte aber keine früher angelegten. Das ist der mit Abstand häufigste Befund in AD-Umgebungen, die älter sind als der Patch.

cpassword-Werte in SYSVOL finden

PowerShell
$sysvolPath = "\\$((Get-ADDomain).DNSRoot)\SYSVOL\$((Get-ADDomain).DNSRoot)\Policies"

Get-ChildItem -Path $sysvolPath -Recurse -Include *.xml -ErrorAction SilentlyContinue |
    Select-String -Pattern 'cpassword="[^"]+"' |
    Select-Object Path, LineNumber, @{n='Match';e={$_.Matches.Value}}

GPP speichert diese je nach Einstellungstyp in bestimmten XML-Dateien — Groups.xml (lokale Konten), Services.xml, ScheduledTasks.xml, DataSources.xml und Drives.xml sind die üblichen. Die obige Suche erfasst sie alle, da sie jede XML-Datei im Policies-Baum durchsucht.

Beheben

  1. Öffnen Sie für jeden Treffer die zugehörige GPO in der Gruppenrichtlinien-Verwaltungskonsole und entfernen Sie das betroffene Einstellungselement (Lokale Benutzer und Gruppen, Geplante Aufgaben, Laufwerkszuordnungen oder Dienste, je nach Fall), statt die XML-Datei von Hand zu bearbeiten.
  2. Ändern Sie die Anmeldeinformationen überall, wo sie verwendet wurden. Das Entfernen von cpassword aus der GPO ändert nicht das tatsächliche Kennwort auf den Zielsystemen — behandeln Sie jeden gefundenen Wert als kompromittierte Anmeldeinformation und wechseln Sie sie.
  3. Bestätigen Sie die Entfernung:
PowerShell
Get-ChildItem -Path $sysvolPath -Recurse -Include *.xml -ErrorAction SilentlyContinue |
    Select-String -Pattern 'cpassword="[^"]+"' | Measure-Object

Ein leeres Ergebnis bestätigt, dass keine cpassword-Einträge mehr vorhanden sind. Wiederholen Sie diese Prüfung regelmäßig — eine wiederhergestellte Sicherung oder eine erneut importierte Legacy-GPO kann unbemerkt wieder einen einführen.

SYSVOL-Berechtigungen und Skriptprüfung

SYSVOL enthält außerdem die von GPOs referenzierten Start-, Herunterfahr-, Anmelde- und Abmeldeskripte. Wer Schreibzugriff auf den betreffenden Skriptordner hat, kann Code ändern, der auf jedem Zielcomputer mit SYSTEM-Rechten ausgeführt wird (Start-/Herunterfahrskripte).

PowerShell
$scriptsPath = "\\$((Get-ADDomain).DNSRoot)\SYSVOL\$((Get-ADDomain).DNSRoot)\scripts"

(Get-Acl -Path $scriptsPath).Access |
    Select-Object IdentityReference, FileSystemRights, AccessControlType

Die erwartete Ausgangsbasis lautet: Administratoren (enthält Domänen-Admins und Organisations-Admins), SYSTEM und ERSTELLER-BESITZER mit Vollzugriff sowie Authentifizierte Benutzer und Server-Operatoren nur mit Lesen, Ausführen. Alles, was bei Schreibberechtigungen darüber hinausgeht, ist ein Befund. Vergleichen Sie außerdem regelmäßig die Hashes der Skriptdateien mit einer bekannt guten Ausgangsbasis, um unautorisierte Änderungen außerhalb regulärer Änderungsfenster zu erkennen.

GPO-Sicherung und Änderungskontrolle

Behandeln Sie GPOs wie Infrastructure as Code: Sichern Sie sie vor Änderungen und vergleichen Sie Änderungen im Zeitverlauf, statt sie erst im Nachhinein zu entdecken.

PowerShell
# Alle GPOs in einen datierten Ordner sichern
$backupPath = "D:\GPOBackups\$(Get-Date -Format yyyy-MM-dd)"
New-Item -Path $backupPath -ItemType Directory -Force | Out-Null
Backup-GPO -All -Path $backupPath

# Vollständigen Bericht zum Vergleich mit der vorherigen Ausgangsbasis erzeugen
Get-GPO -All | ForEach-Object {
    Get-GPOReport -Guid $_.Id -ReportType Xml -Path "$backupPath\$($_.DisplayName -replace '[\\/:*?"<>|]','_').xml"
}

Legen Sie die Berichtsexporte in einer Versionsverwaltung ab, damit Änderungen an GPO-Einstellungen — nicht nur an Verknüpfungen — als prüfbare Diffs sichtbar werden. Muss eine Änderung zurückgenommen werden, stellen Sie mit Restore-GPO -Guid <id> -Path <backupPath> aus einer bestimmten Sicherung wieder her.

Was dabei ausfallen kann

  • Einschränken der GPO-Bearbeitungs-/Verknüpfungsdelegierung: Jede Helpdesk- oder Standortadministratorengruppe, die GPO-Änderungen für ihre OU derzeit selbst vornimmt, verliert diese Möglichkeit und benötigt einen formalen Antragsweg oder eine eng gefasste Delegierung, die auf die eigene OU beschränkt ist (niemals auf die OU Domain Controllers oder den Domänenstamm).
  • Entfernen cpassword-basierter GPP-Elemente: Lokale Konten, geplante Aufgaben oder Laufwerkszuordnungen, die von diesem GPP-Element abhingen, werden nicht mehr zentral konfiguriert; Sie müssen den Mechanismus ersetzen (LAPS für Kennwörter lokaler Administratoren, eine ordnungsgemäß abgesicherte Verteilung geplanter Aufgaben oder Laufwerkszuordnungen per Gruppenrichtlinie ohne eingebettete Anmeldeinformationen), bevor Sie die alte Einstellung entfernen, nicht danach.
  • Verschärfen der Berechtigungen für SYSVOL-Skriptordner: Legt jeden Arbeitsablauf lahm, bei dem Mitarbeiter ohne Administratorrechte Anmelde-/Startskripte derzeit direkt auf der Freigabe ablegen oder bearbeiten, statt die Änderungskontrolle zu durchlaufen.
  • gPLink-Rechte ausschließlich für Domänen-Admins: Delegierte regionale oder abteilungsbezogene GPO-Administratoren, die ihre eigenen GPOs derzeit selbst verknüpfen, benötigen für Verknüpfungen künftig die Mitwirkung eines Domänen-Admins, auch wenn sie die Bearbeitungsrechte für ihre eigenen GPOs behalten.

Für angrenzende Tier-0-Maßnahmen siehe Härtung der Domänencontroller und Kerberos-Härtung.

Häufige Fragen

Ist die cpassword-Schwachstelle der Gruppenrichtlinieneinstellungen noch relevant?

Ja. MS14-025 hat 2014 verhindert, dass der GPP-Editor neue cpassword-Einträge anlegt, aber bereits in SYSVOL vorhandene nicht rückwirkend entfernt. In Domänen, die schon vor 2014 in Betrieb waren, liegen sie häufig noch in alten GPOs, die sich niemand mehr angesehen hat.

Wer sollte GPOs mit der OU Domain Controllers verknüpfen dürfen?

In den meisten Umgebungen nur Domänen-Admins. Eine GPO mit der OU Domain Controllers zu verknüpfen, kommt Codeausführung auf jedem DC gleich; Schreibzugriff auf gPLink sollte dort daher genauso eng begrenzt sein wie die Mitgliedschaft in Domänen-Admins selbst.

Wie finde ich delegierte GPO-Berechtigungen, ohne jede GPO einzeln durchzugehen?

Verwenden Sie Get-GPO in Kombination mit Get-GPPermission in einer Schleife oder Get-GPOReport für einen XML/HTML-Export, den Sie im Zeitverlauf vergleichen können. Beides ist im PowerShell-Modul GroupPolicy enthalten und erfordert keine zusätzlichen Werkzeuge.

Härtung von Gruppenrichtlinien und SYSVOL

Verwandte Leitfäden

Gruppenrichtlinien & SYSVOL

GPO-Berechtigungen und gPLink-Rechte auditieren

Ermitteln, wer in AD GPOs bearbeiten, erstellen und verknüpfen darf: GPO-ACLs, gPLink-Rechte auf OUs und Standorten, Group Policy Creator Owners und WMI-Filter.

Fortgeschritten
Gruppenrichtlinien & SYSVOL

GPP-Kennwörter (cpassword) finden und entfernen

Jedes GPP-cpassword in SYSVOL, Sicherungen und Client-Caches finden, dem offengelegten Konto zuordnen, das Kennwort wechseln und die Rückkehr dauerhaft verhindern.

Grundlagen
Gruppenrichtlinien & SYSVOL

Microsoft-Sicherheitsbaselines per GPO bereitstellen

Microsoft-Sicherheitsbaselines per GPO bereitstellen: SCT, Lückenanalyse mit Policy Analyzer, LGPO-Tests, Rollout in Ringen, Ausnahmen und Abweichungsprüfung.

Fortgeschritten