lcer00
Goto Top

Eventlogarchivierung mit Powershell DSC

article-picture

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.

back-to-topSzenario, 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

back-to-topDSC-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.

back-to-topBereitgestellte 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.

back-to-topWichtige Links zum Thema


back-to-topSonstiges

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 )

back-to-topVorbereitungen


back-to-topEventlog-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\

back-to-topErforderliche 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.

back-to-topDas 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:
  1. ein Konfigurations-Objekt wird erstellt
  2. die Zielrechner (Nodes) werden definiert
  3. DomainControllerConfig erstellt eine.mof Datei für jeden node
  4. 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:

back-to-topNTFS-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.

back-to-topScheduledTask

siehe https://github.com/dsccommunity/ComputerManagementDsc/wiki/ScheduledTask
Gibt man keine Credentials (ExecuteAsCredential) an, wird das Lokale System verwendet.

back-to-topWas macht Start-DscConfiguration?

nun, es startet einen DSC-"Konfigurationlauf" face-smile 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.

back-to-topZum 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  
}

back-to-topSchlussbemerkung


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.

Content-Key: 1464094977

Url: https://administrator.de/contentid/1464094977

Printed on: April 24, 2024 at 04:04 o'clock