Eventlogarchivierung mit Powershell DSC
Inhaltsverzeichnis
Ziel des Tutorials ist es, einen praktischen Einstieg in die Desired State Configuration mittels Powershell DSC zu geben. Die Eventlog-Archivierung ist dabei eher Nebensache. Deshalb habe ich hier auch keine Best-Practice-Überlegungen zur Eventlogarchivierung angestellt.
Szenario, Aufgabenstellung und Eingrenzung
Man stelle sich also folgendes Szenario vor:
- Die Eventlogs der Domänencontroller sollen archiviert werden. Die nennen wir dann mal standort1-dc4.meine.domaene.de, standort1-dc3.meine.domaene.de, 'standort2-dc3.meine.domaene.de', 'standort3-dc3.meine.domaene.de'
- Die archivierten eventlogs sollen automatisiert von einem "Archivserver" eingesammelt werden (Pull-Verfahren). Natürlich kann man auch per Push arbeiten, das ist hier aber nicht Thema.
- Wir verwenden das DSC Push-Verfahren. Man kann euch einen Pull-Server bereitstellen, das ist aber auch ein anderes Thema.
Folgende Sicherheitsgruppen wurden zuvor angelegt:
- G-T0Administratoren - die Administratoren der Domänencontroller
- G-T0aAdministratoren - die Eventlog-Leseberechtigen Administratoren
- G-T0LogCollectorServer - die Server, auf die die archivierten Eventlogs kopiert werden sollen
DSC-Configurationsaufgaben
In diesem Beispiel wird mit Hilfe von DSC-Resoucen sichergestellt, dass
- eine Rolle auf dem Server installiert ist
- bestimmte Verzeichnsse vorhanden sind
- deren NTFS-Berechtigungen stimmen
- bestimmte Freigaben mit den korrekten Berechtigungen exisiteren
- ein bestimmter Scheduled Task existiert.
Bereitgestellte Ressourcen der DSC Community
Ohne die geht es nicht oft nicht sinnvoll. Die eingebauten Microsoft Powershell DSC Ressourcen erlauben grundlegende Dinge - etwa das Installieren von Serverrollen. Es fehlen jedoch Funktionen z.B. zu Freigaben, NTFS-Berechtigungen etc. Hier stellt die DSC Community ( https://dsccommunity.org/ ) gepflegte Redouten in einem Guthub-Repository zur Verfügung.
Wenn man eine Funktion sucht, die man bei Microsoft nicht findet, wird man hier meist fündig.
Wichtige Links zum Thema
- https://docs.microsoft.com/de-de/powershell/scripting/dsc/overview/overv ... Microsoft Powershell DSC Übersicht
- https://docs.microsoft.com/de-de/powershell/module/psdesiredstateconfigu ... Microsoft Powershell DSC Moduldokumentation
- https://docs.microsoft.com/de-de/powershell/scripting/dsc/resources/reso ... Microsoft Powershell DSC Ressourcen
- https://github.com/dsccommunity Bereitgestellte Module und Ressourcen der DSC Community
Sonstiges
Nicht eingehen werde ich auf
- wie man Powershell und den Paketmanager aktualisiert
- Sicherheitsüberlegungen im Active-Directory, insbesondere den DCs, den verwendeten Verzeichnissen, Sicherheitseinstellungen und Verfahren
- wie man GPOs erstellt und zuordnet
- allgemeiner Powershell-Syntax
- wie man WSMAN und Remote-Powershell richtig und sicher konfiguriert - (Für Fortgeschrittene und Interessierte sei hier aber auf das dsccommunity-Modul WSManDsc verwiesen: https://github.com/dsccommunity/WSManDsc/wiki )
Vorbereitungen
Eventlog-Archivierung aktivieren
Zunächst benötigt man eine GPO zum Aktivieren der Eventlog-Archivierung. Für jedes zu archivierende Eventlog müssen zwei Einträge aktiviert werden. Achtung: die deutschen Beschreibungen der GPOs sind etwas verwirrend.
Windows-Komponenten/Ereignisprotokolldienst/AnwendungAusblenden
Verhalten des Ereignisprotokolls steuern, wenn die Protokolldatei ihre Maximalgröße erreicht - Aktiviert
Volles Protokoll automatisch sichern - Aktiviert
Windows-Komponenten/Ereignisprotokolldienst/SetupAusblenden
Verhalten des Ereignisprotokolls steuern, wenn die Protokolldatei ihre Maximalgröße erreicht - Aktiviert
Volles Protokoll automatisch sichern - Aktiviert
Windows-Komponenten/Ereignisprotokolldienst/SicherheitAusblenden
Verhalten des Ereignisprotokolls steuern, wenn die Protokolldatei ihre Maximalgröße erreicht - Aktiviert
Volles Protokoll automatisch sichern - Aktiviert
Windows-Komponenten/Ereignisprotokolldienst/SystemAusblenden
Verhalten des Ereignisprotokolls steuern, wenn die Protokolldatei ihre Maximalgröße erreicht - Aktiviert
Volles Protokoll automatisch sichern - Aktiviert
Durch diese Einstellung wird das Protokoll, wenn es voll ist eine Protokolldatei im dem Präfix "Archive-" kopiert. man findet sie dann unter C:\Windows\System32\winevt\Logs\
Erforderliche Module installieren
Auf den beteiligten Rechnern (die Zielrechner und der Rechner, von dem aus die DSC gepusht wird) müssen dann die passenden Powershell-Module installiert werden:
# Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
Install-Module -Name PSDSCResources
Install-Module -Name ComputerManagementDsc
Install-Module -Name cNtfsAccessControl
Wenn man will, kann man zuvor das Repository PSGallery als Vertrauenswürdig einstufen (Set-PSRepository). Dann gibt es keine Nachfragen beim Aufruf von Install-Module.
Das DSC-Script
Das eigentliche Skript enthält zwei Bereiche. Zunächst wird die eigentliche DSC-Konfiguration (Configuration) beschrieben. Dann wird diese Konfiguration auf die Zielrechner angewendet. Kurz zusammengefasst passiert folgendes:
- ein Konfigurations-Objekt wird erstellt
- die Zielrechner (Nodes) werden definiert
- DomainControllerConfig erstellt eine.mof Datei für jeden node
- Start-DscConfiguration führt (remote per CIM-Session auf dem Ziel-node) die eigentliche DCS Konfiguration aus.
Configuration DomainControllerConfig
{
param
(
[string]$TargetNode
)
Import-DscResource -ModuleName PsDesiredStateCOnfiguration
Import-DscResource -ModuleName ComputerManagementDsc
Import-DscResource -ModuleName cNtfsAccessControl
Node $TargetNode
{
WindowsFeature RoleADDS
{
Ensure = "Present"
Name = "AD-Domain-Services"
}
WindowsFeature RoleDNS
{
Ensure = "Present"
Name = "DNS"
}
File DirectoryDNSLog
{
Ensure = "Present"
Type = "Directory"
DestinationPath = "C:\Windows\System32\LogFiles\dns"
}
SmbShare ShareDNSLog
{
Name = "dnsaudit"
Path = "C:\Windows\System32\LogFiles\dns"
FullAccess = @()
ChangeAccess = @()
ReadAccess = @('G-T0Administratoren')
NoAccess = @()
Force = $true
}
File DirectoryEventlogArchive
{
Ensure = "Present"
Type = "Directory"
DestinationPath = 'C:\Windows\System32\LogFiles\EventlogArchive'
}
cNtfsPermissionEntry NtfsPermissionEventlogArchive1
{
Ensure = 'Present'
Path = 'C:\Windows\System32\LogFiles\EventlogArchive'
Principal = 'G-T0LogCollectorServer'
AccessControlInformation = @(
cNtfsAccessControlInformation
{
AccessControlType = 'Allow'
FileSystemrights = 'FullControl'
Inheritance = 'SubfoldersAndFilesOnly'
NoPropagateInherit = $false
}
)
DependsOn = '[File]DirectoryEventlogArchive'
}
cNtfsPermissionEntry NtfsPermissionEventlogArchive2
{
Ensure = 'Present'
Path = 'C:\Windows\System32\LogFiles\EventlogArchive'
Principal = 'G-T0aAdministratoren'
AccessControlInformation = @(
cNtfsAccessControlInformation
{
AccessControlType = 'Allow'
FileSystemrights = 'ReadAndExecute'
Inheritance = 'SubfoldersAndFilesOnly'
NoPropagateInherit = $false
}
)
DependsOn = '[File]DirectoryEventlogArchive'
}
SmbShare ShareEventlogArchive
{
Name = 'EventlogArchive'
Path = 'C:\Windows\System32\LogFiles\EventlogArchive'
FullAccess = @('G-T0LogCollectorServer')
ChangeAccess = @()
ReadAccess = @('G-T0Administratoren','G-T0aAdministratoren')
NoAccess = @()
Force = $true
}
ScheduledTask MoveArchivedEventlogs
{
Ensure = 'Present'
Enable = $true
ScheduleType = 'Daily'
TaskName = 'MoveArchivedEventlogs'
ActionExecutable = 'Powershell.exe'
ActionArguments = '-NoProfile -WindowStyle Hidden -command "& Move-Item -Path C:\Windows\System32\winevt\Logs\Archive-*.evtx -Destination C:\Windows\System32\LogFiles\EventlogArchive"'
StartTime = '8pm'
Description = 'Verschiebt archivierte Eventlogs in die Freigabe.'
BuiltInAccount = 'SYSTEM'
RunLevel = 'Highest'
}
}
}
$nodes = @(
'standort1-dc4.meine.domaene.de'
'standort1-dc3.meine.domaene.de'
'standort2-dc3.meine.domaene.de'
'standort3-dc3.meine.domaene.de'
)
foreach ($node in $nodes)
{
DomainControllerConfig -TargetNode $node -OutputPath "C:\Skripts"
$session = New-CimSession -Computername $node
Start-DscConfiguration -Wait -Force -Verbose -Path "C:\Skripts" -CimSession $session
}
Wenn man versucht, die DSC-Configuration mit sinnvollen Bezeichnern zu erstellen, bekommt man nebenbei einen schön lesbaren Code. Einige Bemerkungen zur Konfiguration:
NTFS-Rechte
https://github.com/dsccommunity/cNtfsAccessControl
Hier muss man die Namen der FileSystemRights Enum verwenden (https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontro ..) Es empfiehlt sich, das Ergebnis im Explorer im Reiter Sicherheit zu kontrollieren! Für Lese&Schreibzugriff beispielweise genügt "Write" natürlich nicht.
ScheduledTask
siehe https://github.com/dsccommunity/ComputerManagementDsc/wiki/ScheduledTask
Gibt man keine Credentials (ExecuteAsCredential) an, wird das Lokale System verwendet.
Was macht Start-DscConfiguration?
nun, es startet einen DSC-"Konfigurationlauf" Dazu sucht es im angegebenen Pfad (-Path) eine passende Konfigurationsdatei (computername.mof) aus. Über -CimSession wird das Ganze auf dem Remote-Rechner ausgeführt. Im -Path liegen die Konfigraionsdateien für alle Nodes. Es wird aber immer nur die passende Datei verwendet. Auch wenn die hostnamen in den meisten Situationen Genüge würde ich der Vollständigkeit und Sicherheit halber immer den FQDN des Nodes verwenden (also DomainControllerConfig -TargetNode full.qualified.domain.name.tld). Dann werden die mof-Dateien auch so benannt.
Zum Schluss: Eventlogs einsammeln
Zum Schluss braucht man noch ein Skript, um die Eventlogs einzusammeln. Das hat jetzt nichts mit DSC zu tun, fehlt aber noch, damit das Ganze rund ist. Das Skript lässt man dann per geplantem Task regelmäßig laufen.
$nodes = @(
'standort1-dc4.meine.domaene.de'
'standort1-dc3.meine.domaene.de'
'standort2-dc3.meine.domaene.de'
'standort3-dc3.meine.domaene.de'
)
$EventlogArchiveDirectory = 'E:\eventlog'
$EventlogPullShare = 'EventlogArchive'
foreach ($node in $nodes)
{
$nodeEventlogArchiveDirectory = Join-Path $EventlogArchiveDirectory $node
if (-not (test-path $nodeEventlogArchiveDirectory))
{
New-Item -Path $nodeEventlogArchiveDirectory -ItemType "directory"
}
$nodeEventlogPullShare = Join-Path -Path "\\$node" -Childpath $EventlogPullShare
Move-Item -Path "$nodeEventlogPullShare\*.evtx" -Destination $nodeEventlogArchiveDirectory -Force
}
Schlussbemerkung
Viel Spaß beim basteln. So wie hier beschrieben wird man das kaum 1:1 umsetzen aber man hat per DSC die Mittel zur Hand, auch komplexe Konfigurationsaufgabe umzusetzen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1464094977
Url: https://administrator.de/tutorial/eventlogarchivierung-mit-powershell-dsc-1464094977.html
Ausgedruckt am: 23.12.2024 um 16:12 Uhr