Elastic SIEM – Automatische Installation des Agents im Windows

Einleitung

Ich möchte meine Windows Server und Clients automatisch an mein Elastic SIEM anschließen. Dafür muss ich den Agent mit einem GPO-ScriptTask installieren und am Fleet-Server registrieren. Den Rest sollte dann der Fleet-Server übernehmen.

Der Artikel gehört zur Serie „Bereitstellung eines Elastic SIEM„.

Aufbau einer Gruppenrichtlinie

Das Setup habe ich über den PowerShell-Befehl auf dem ersten Windows Server heruntergeladen. Die entpackten Dateien kopiere ich in meine Netlogon-Freigabe auf einem der Domain Controller:

Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.15.3-windows-x86_64.zip -OutFile M:\Zwischenablage\Temp\elastic-agent-8.15.3-windows-x86_64.zip
Expand-Archive M:\Zwischenablage\Temp\elastic-agent-8.15.3-windows-x86_64.zip -DestinationPath C:\Windows\SYSVOL\domain\scripts\ElasticAgent
Automatische Installation des Elastic Agents im Windows

Nun benötige ich ein PowerShell-Script, welches das Setup auf dem Zielsystem ausführt. Den Code dafür habe ich bereits für meinen ersten Server genutzt:

Copy-Item -Recurse -Path '\\ws.its\NETLOGON\ElasticAgent' -Destination 'c:\windows\temp\ElasticAgent'

cd 'C:\Windows\Temp\ElasticAgent'
Start-Process -FilePath .\elastic-agent.exe -ArgumentList 'install --url=https://siem.ws.its:8220 --enrollment-token=WEerftgnlaSUJGMXYbgtTZ5Us4fV0I6MzhgererGemNUQk9wUngtydfkrfgF9hQQ=='

Remove-Item -Path 'C:\Windows\Temp\ElasticAgent' -Recurse

Das Script selber soll aber nur installieren, wenn noch kein Agent vorhanden ist. Daher benötige ich noch etwas Logik. Zudem möchte ich gerne einige Logs zum Setup generieren. Das ist mein finaler Code:

##### Scriptinfo ##################################################################################
# Scriptreihe:      ElasticAgent-installer
# Datum:            2024-11-20
# Version:          V1.00
# Programmierer:    Stephan Walther
###################################################################################################

# Variablen
    $PathAD = "\\ws.its\NETLOGON\ElasticAgent"
    $Logfile = @()

# Ermittle Aktion
    $action = "none"
    if (-not (Get-Service | Where-Object { $_.name -eq 'Elastic Agent' })) {
        $action = "installiere ElasticAgent"
        $param = "-i"
        $exit = 1
    }

# starte Aktion bei Bedarf
    New-EventLog -LogName "Application" -Source "ElasticAgentInstaller" -ErrorAction SilentlyContinue

    if ($action -ne 'none') {
        try {
            $Logfile += "Aktion: $action"
            $Logfile += "kopiere Dateien nach lokal"
            Copy-Item -Recurse -Path $PathAD -Destination 'c:\windows\temp\ElasticAgent' -ErrorAction Stop -Force

            $Logfile += "starte setup:C:\Windows\Temp\ElasticAgent\elastic-agent.exe -install --url=https://siem.ws.its:8220 --enrollment-token=xxxx=="
            Start-Process -FilePath 'C:\Windows\Temp\ElasticAgent\elastic-agent.exe' -ArgumentList 'install --force --url=https://siem.ws.its:8220 --enrollment-token=WEtKsdvsdGsdfvsvwe5U1Jon6MtgtzdbzhnbEJGemNdfgbwUnllckdwTF9hQQ==' -wait -ErrorAction Stop

            Start-Sleep -Seconds 5
            
            $Logfile += "entferne Arbeitsverzeichnis C:\windows\Temp\ElasticAgent"
            Remove-Item -Path 'C:\Windows\Temp\ElasticAgent' -Recurse

            $Logfile += "erfolgreich abgeschlossen"
            Write-EventLog -LogName "Application" -Source "ElasticAgentInstaller" -EntryType Information -EventId 2 -Message "$( $Logfile -join "`r`n" )"  
        }
        catch {
            $Logfile += "Fehler in Zeile $( $error[0].InvocationInfo.ScriptLineNumber ): $( $error[0].Exception.Message )"
            Write-EventLog -LogName "Application" -Source "ElasticAgentInstaller" -EntryType Error -EventId 3 -Message "$( $Logfile -join "`r`n" )"
        }
    } else {
        $Logfile += "keine Aktion erforderlich"
        Write-EventLog -LogName "Application" -Source "ElasticAgentInstaller" -EntryType Information -EventId 1 -Message "$( $Logfile -join "`r`n" )"
    }

Das Script speichere ich ebenfalls im SYSVOL-Verzeichnis meiner Domain Controller:

Automatische Installation des Elastic Agents im Windows

Nun erstelle ich eine geplante Aufgabe in einer Gruppenrichtlinie, welche das Script ausführen soll. Die passende GPO habe ich bereits: Meine Richtlinie, mit welcher ich ebenfalls das Audit vom Windows konfiguriere:

Automatische Installation des Elastic Agents im Windows
Automatische Installation des Elastic Agents im Windows
Automatische Installation des Elastic Agents im Windows
Automatische Installation des Elastic Agents im Windows

Testlauf

Zum Testen schränke ich die Aufgabe auf einen meiner Windows Server mit dem Feature „Item Level Targeting“ ein:

Automatische Installation des Elastic Agents im Windows

Auf diesem Server starte ich die Aufgabenverwaltungskonsole und lade mit einem gpupdate die Gruppenrichtlinien neu. Die Aufgabe wird erstellt und direkt gestartet:

Automatische Installation des Elastic Agents im Windows

Im Fleet-Server taucht der neue Server auf:

Automatische Installation des Elastic Agents im Windows

Rollout auf alle Windows Systeme

Die GPO funktioniert. Nun erstelle ich noch eine Firewall-Ausnahme, damit auch meine Clients den Fleet-Server erreichen können:

Automatische Installation des Elastic Agents im Windows

Final entferne ich den Item-Level-Target-Filter in der geplanten Aufgabe. Nun kommen meine Windows Systeme nach und nach im Elastic an:

Automatische Installation des Elastic Agents im Windows

Fazit

Diese Aufgabe wäre damit abgeschlossen. Meine GPO und das Script findet ihr hier: zip

Weitere Artikel findet ihr in meiner Serie „Bereitstellung eines Elastic SIEM„.

Stay tuned 🙂

Kommentar hinterlassen