bitboy
Goto Top

Icinga2 und Windows Eventlog

Hallo zusammen,

ich mache ja gerade meine ersten Gehversuche Richtung Monitoring und tu mich noch recht schwer mit Icinga.

Ich möchte gerne die Eventlogs überwachen und eine Meldung bei bestimmten ereignissen ausgeben.

Leider finde ich kein Command Template im Icinga Director.

Was ich bis jetzt rausgefunden hab ist, das der Standard Icinga2 Agent das anscheint nicht kann sondern, dass man den NSCP dazu installieren muss.
Lokal kann ich mit diesem auch Events abfragen, aber wie man das nun ins Icinga bekommt weiß ich nicht.

Am Liebsten wäre mir ein Befehl bei dem man Quelle und ID als Variable angeben kann so dass ich nur den einen Befehl brauche.
Im Internet hab ich auch nur die Parameterliste des NSCP Clients gefunden, aber keine Anleitung wie mans ins Icinga integriert.

Danke sehr

Content-ID: 468894

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

Ausgedruckt am: 21.11.2024 um 23:11 Uhr

em-pie
Lösung em-pie 04.07.2019 um 10:49:36 Uhr
Goto Top
Moin,

schaue dich hier einmal um:
https://docs.nsclient.org/howto/external_scripts/
https://docs.nsclient.org/tutorial/

Was du per se machen musst:
  • Unter Windows ein Script schreiben, welches dir dein Eventlog nach deinen Kriterien abfragt und das, was du haben möchtest zurück gibt. Dabei könntest du noch mit OK, WARNING und CRTICIAL arbeiten.
  • in der Ini am NSCClient das Ausführen von remotescripten zulassen. Ich habe zusätzlich noch eingestellt, dass der Client nur ANfragen vom NAGIOS/ Icinga2 entgegen nehmen darf. Kann man sicherlich alles noch weiter absichern/ einschräöken
  • Unter ICINGA/ NAGIOS dann einen Command anlegen, der das starten des Script am Client initiieren wird, und dabei kannst du dann Parameter (EventID und Source) angeben.
  • in den Services des zu monitorenden Hosts setzt du dann die Werte für die Parameter ein

Ich frage auf diese Weise z.B. die Windows Clients, ob diev. Dienste laufen oder wie die Auslastung einzelner LVMs aussieht.

Gruß
em-pie
Bitboy
Bitboy 04.07.2019 um 11:00:45 Uhr
Goto Top
Hey.
danke für die schnelle Antwort. Das bedeutet, dass eingebaute check_eventlog vom NSCP Client kann man gar nicht nutzen?

Ich schau mir mal deine Links an und wenn ich nciht weiter komm frag ich nochmal.
em-pie
em-pie 04.07.2019 um 11:11:14 Uhr
Goto Top
Doch, das geht doch auch....
Den Befehl hatte ich nicht auf dem Schirm.

Schaue einfach mal hier:
https://docs.nsclient.org/reference/windows/CheckEventLog/

Das ist doch alles beschrieben.
Wenn du also ID und Quelle übergeben willst, setzt du da einfach Argumente ($ARG1$ und $ARG2$) ein und füllst die Argumente dann in der Servicedefinition.
lcer00
lcer00 04.07.2019 um 12:00:24 Uhr
Goto Top
Hallo,

wenn Du noch mehr probieren willst:

Winlogbeat auf dem Windows installieren https://www.elastic.co/de/downloads/beats/winlogbeat

Das nach Logstash schicken und dann nach Icinga2 ausgeben.

https://icinga.com/2017/05/15/releasing-the-icinga-output-plugin-for-log ...

Grüße

lcer
Bitboy
Bitboy 04.07.2019 um 18:01:31 Uhr
Goto Top
Danke sehr, schau ich mir vllt auch noch an.

So nach einigem hin und her hab ichs schonmal so weit, dass er versucht das Powershellscript auszuführen, allerdings scheint die Parameterübergabe noch nicht zu passen. Das schau ich mir dann nächste Woche an, war wahrscheinlich auch keine gute Idee noch eine Batch dazwischen zu hängen...


Was auch Geduld kostet ist das Abfragen der Events mit Powershell.
Get-Eventlog scheint da bischen wählerisch zu sein:
Wenn man den After-Parameter verwendet funktioniert die Filterung nach Source nicht mehr...
Liefert keine Ausgabe:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-10) | Where {($_.Source -eq "Winlogon") -and ($_.EventID -eq 6000)}  

Liefert eine Ausgabe:
Get-EventLog -LogName Application | Where {($_.Source -eq "Winlogon") -and ($_.EventID -eq 6000)}  
Bitboy
Bitboy 10.07.2019 um 09:58:37 Uhr
Goto Top
Hallo zusammen

ich möchte dann noch gern meine Lösung posten falls es noch jemand braucht.
Die Parameterübergabe aus Icinga heraus hat überhaupt nicht gut funktioniert wegen Leerzeichen und ähnlichem.
Mit dem NSC Client hab ich es nicht geschafft das Kommando so zu bauen, dass es schön variable ist weil nsc++ so einen Filter Parameter verwendet, der mehrer Werte enthält. Außerdem hätte ich bevorzugt, dass nur ein Agent installiert werden muss.

Also los gehts. Der Icinga Agent kann auch externe Programme ausführen und da mir der Aufruf einer .exe deutlich einfacher schien als powershell mit Parametern hab ich zunächst einen simplen Wrapper in Autoit geschrieben, der mir den Aufruf von Powershellscripten vereinfacht:
Dim $Scriptfile
Dim $i
Dim $Params, $CMDParams
Dim $ReturnCode
Dim $Output

If $CmdLine = 0 Then
   ConsoleWrite( "No script file specified." )  
   Exit 4
EndIf

$Scriptfile = $CmdLine[2]
For $i = 3 To $CmdLine Step 1
    $CMDParams = $CMDParams & " " & $CmdLine[$i]  
Next
$Params = "-NoProfile -Noninteractive -File " & '"' & $ScriptFile & ' ' & $CMDParams  
$ReturnCode = ShellExecuteWait("powershell", $Params, "", "open", @SW_HIDE)  
$Output = ClipGet() ; Crappy but working \_(*-*)_/
ConsoleWrite($Output)
Exit $ReturnCode
die daraus resultierende exe hab ich dann ins PluginDir von Icinga auf dem zu überwachenden Rechnerkopiert.

Als nächstes das Powershellscript. Das nimmt die Variablen zu Source und ID etc an und prüft ob in den letzten 10 Minuten das Event aufgetreten ist. (Die Zeitspanne könnte man auch noch variable machen). Das befindet sich ebenfalls im PluginDir des zu überwachenden Systems, könnte aber im Prinzip überall sein.
param(
        [Parameter(Position=0,mandatory=$true)]
        [string] $Logname,
        [Parameter(Position=1,mandatory=$true)]
        [string] $Source,
        [Parameter(Position=2,mandatory=$true)]
        [int]    $ID,

        [Parameter(Position=3)]
        [int]    $CritCount=2,
        [Parameter(Position=4)]
        [int]    $WarnCount=1
       )


$args = @{}
$args.Add("StartTime", ((Get-Date).AddMinutes(-10)))  
$args.Add("EndTime", (Get-Date))  
$args.Add("LogName", $Logname)  
$args.Add("ID", $ID)  
$args.Add("ProviderName", $Source)  

try {
    $Events = Get-Winevent -FilterHashtable $args
    #$Events = Get-Eventlog -LogName $Logname -After (Get-Date).AddMinutes(-10) | Where {($_.Source -match $Source) -and ($_.InstanceId -eq $ID)} #This is broken
    $EventCount = ($Events | Measure-Object).Count
	"EventID $ID from $Source occured $EventCount times.The cake is a lie." | clip #This is crappy but working \_(ツ)_/  
    if ($EventCount -ge $CritCount){
        exit 2}

    if ($EventCount -ge $WarnCount){
        exit 1}

    exit 0
}
catch{
    exit 3
}

Exit Code und Consolen Text werden vom Powershell an den Wrapper zurückgegeben und von dort an Icinga.
Damit hab man eine, wie ich finde, sehr variable Lösung die alle möglichen Powershellscripte und damit Prüfungen ausführen kann, ohne groß was anpassen zu müssen.

Zuletzt das Kommando, das über den Icinga Director zusammengebaut wird. Wichtig ist nur, dass als erster Parameter an den Wrapper der Pfad zum Script übergeben wird. Die anderen Parameter werden 1zu1 durchgereicht.

object CheckCommand "Check_EventID" {  
    import "plugin-check-command"  
    command = [ PluginDir + "/check_powershell.exe" ]  
    arguments += {
        "-ID" = {  
            order = 4
            value = "$ID$"  
        }
        "-Logname" = {  
            order = 2
            value = "$Logname$"  
        }
        "-Source" = {  
            order = 3
            value = "$Source$"  
        }
        ScriptPath = {
            order = 1
            required = true
            value = "\"\"C:\\Program Files\\ICINGA2\\sbin\\Check_EventID.ps1\"\""  
        }
    }
}

PS: Merke gerade, dass die optionalen Parameter für Warnung und Kritisch noch fehlen. Na egal. Die Idee soweit sollte klar sein.
Funktioniert auch fein. Noch ein Hinweis: Da der Parameter Scriptpath ein Leerzeichen enthält müssen im Icinga 2 Anführungszeichen am Anfang und Ende verwendet werden, das escapen übernimmt dann die Software.

PPS: Das Auslesen von Powershellausgaben ist in Autoit scheinbar nicht so einfach, daher wird der Text einfach in die Zwischenablage kopiert und von dort ausgelesen. Kann man vllt schöner machen, aber funktioniert ganz gut so.