lcer00
Goto Top

Zertifikatsperrlisten Ablaufdatum mit PRTG und Powershell abfragen

article-picture
Hallo zusammen,

wir benutzen PRTG zum Netzwerkmonitoring. Dort fehlte ein Sensor, um das Ablaufdatum der Zertifikatsperrlisten zu überprüfen. Nach einiger Recherche bin ich auf folgende Seite gestoßen: http://powershellcoder.com/index.php/2016/10/08/get-crltimevalidity-par ... Das Skript bezieht die CRL allerdings aus einer Datei, so dass noch der Download vorangestellt werden musste. Zum Schluss fehlte dann noch die passende Ausgabe um das in PRTG als Sensor nutzen zu können. Zurückgeliefert werden die Tage bis zum Ablauf der CRL.

param ($CRLURL)

$webCRL = invoke-webrequest -Uri $CRLURL -UseBasicParsing
$CRLBytes = $webCRL.Content                                                                                                                     
                                                                                                                                                                
#set match strings                                                                                                                                      
$OIDCommonName = " 06 03 55 04 03 "                                                                                                                       
$UTCTime = " 17 0D "                                                                                                                                      
                                                                                                                                                                
#convert crl bytes to hex string                                                                                                                        
$CRLHexString = ($CRLBytes | % {"{0:X2}" -f $_}) -join " "                                                                                                
                                                                                                                                                                
#get the relevent bytes using the match strings                                                                                                         
$ThisUpdateBytes = ($CRLHexString -split $UTCTime )[1] -split " "  | % {[Convert]::ToByte("$_",16)}                                                       
$NextUpdateBytes = (($CRLHexString -split $UTCTime )[2] -split " ")[0..12] | % {[Convert]::ToByte("$_",16)}                                               
                                                                                                                                                                
#convert data to readable values                                                                                                                        
[DateTime]$ThisUpdate = [Management.ManagementDateTimeConverter]::ToDateTime(("20" + $(($ThisUpdateBytes | %{[char]$_}) -join ""  -replace "z")) + ".000000+000")   
[DateTime]$NextUpdate = [Management.ManagementDateTimeConverter]::ToDateTime(("20" + $(($NextUpdateBytes | %{[char]$_}) -join ""  -replace "z")) + ".000000+000")   

$FromDate  = Get-Date
$days =[math]::truncate( ($NextUpdate - $FromDate).TotalDays)
write-output "$($days):OK"  

Hinweis:
invoke-webrequest -Uri $CRLURL -UseBasicParsing
ohne UseBasicParsing funktionierte das Skript nicht auf dem Server. Das lag vermutlich an IE und dessen abgesichertem Modus.

Der Sensor wird als Custom Skript in PRTG eingebunden. Als Parameter gibt man die URL des Sperrliste an.
https://kb.paessler.com/en/topic/71356-guide-for-powershell-based-custom ... In den Kanaleinstellungen kann man dann passende Grenzwerte einstellen.

Vielleicht kanns jemand gebrauchen

Grüße

lcer

Content-ID: 1622590038

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

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

Dani
Dani 15.12.2021 um 15:47:33 Uhr
Goto Top
Moin,
sehr quick.... face-wink

Zeile 21 und 22 würde ich zusammenfassen:
$days =[math]::truncate( ($NextUpdate - (Get-Date) ).TotalDays)

Für welchen Zweck wird Zeile 14 und 18 benötigt?

Gruß,
Dani
lcer00
lcer00 15.12.2021 aktualisiert um 17:15:46 Uhr
Goto Top
Zitat von @Dani:

Moin,
sehr quick.... face-wink

Zeile 21 und 22 würde ich zusammenfassen:
$days =[math]::truncate( ($NextUpdate - (Get-Date) ).TotalDays)
gerne. Ich bin halt nicht so der Einzeilertyp ... Beim Versuch das zu tun waren mir ein paar Klammern um die Ohren geflogen. face-smile
Für welchen Zweck wird Zeile 14 und 18 benötigt?
war drin geblieben wegen Abwärtskompatibilität face-sad

param ($CRLURL)

$webCRL = invoke-webrequest -Uri $CRLURL -UseBasicParsing
$CRLBytes = $webCRL.Content                                                                                                                     
                                                                                                                                                                
#set match strings                                                                                                                                                                                                                                                 
$UTCTime = " 17 0D "                                                                                                                                      
                                                                                                                                                                
#convert crl bytes to hex string                                                                                                                        
$CRLHexString = ($CRLBytes | % {"{0:X2}" -f $_}) -join " "                                                                                                
                                                                                                                                                                
#get the relevent bytes using the match strings                                                                                                         
$NextUpdateBytes = (($CRLHexString -split $UTCTime )[2] -split " ")[0..12] | % {[Convert]::ToByte("$_",16)}                                               
                                                                                                                                                                
#convert data to readable values                                                                                                                        
[DateTime]$NextUpdate = [Management.ManagementDateTimeConverter]::ToDateTime(("20" + $(($NextUpdateBytes | %{[char]$_}) -join ""  -replace "z")) + ".000000+000")   
$days =[math]::truncate( ($NextUpdate - (Get-Date) ).TotalDays)
write-output "$($days):OK"  

Grüße

lcer
Niko86
Niko86 20.01.2022 um 11:09:07 Uhr
Goto Top
Moin,

vielen Dank für das Script.
Gibt es auch eine Möglichkeit das Datum von "Next CRL Publish" statt "Next update" auszugeben?

Beste Grüße
Niko
Dani
Dani 20.01.2022 um 18:42:24 Uhr
Goto Top
Moin,
Gibt es auch eine Möglichkeit das Datum von "Next CRL Publish" statt "Next update" auszugeben?
Ja.


Grüße,
Dani
lcer00
lcer00 20.01.2022 um 21:40:18 Uhr
Goto Top
Hallo,
Zitat von @Dani:

Moin,
Gibt es auch eine Möglichkeit das Datum von "Next CRL Publish" statt "Next update" auszugeben?
Ja.


Grüße,
Dani

Das ist mehr ein PRTG-Problem als ein Powershell-Problem. https://www.paessler.com/manuals/prtg/custom_sensors#exe_script

Wie soll denn PRTG das Datum anzeigen? Widerspricht etwas dem Konzept eines Monitoring-Programms.

Du kannst aber einen XML-Sensor mit mehreren Kanälen basteln.

Grüße

lcer
Dani
Dani 20.01.2022 um 22:46:12 Uhr
Goto Top
Moin,
Du kannst aber einen XML-Sensor mit mehreren Kanälen basteln.
richtig. face-smile

Wie soll denn PRTG das Datum anzeigen? Widerspricht etwas dem Konzept eines Monitoring-Programms.
Jeweils einen Channel und in Tagen rechnen. Somit kannst du mit Fehlerwerte Grenzen ziehen und Alarme erzeugen. Machen wir genau so und das funktioniert 1a.

Gruß,
Dani
Niko86
Niko86 21.01.2022 um 09:36:49 Uhr
Goto Top
Moin,

es geht darum, dass wir unsere Sperrliste anhand des "Next CRL Publish"-Datum erneuern und nicht anhand des "Next Update"-Datum.

Beispiel
Next CRL Publish:: 23.11.23
Next Update:: 21.01.24

Und ich möchte gerne 30 Tage vor dem "Next CRL Publish"-Datum von PRTG gewarnt werden.

Dein ps-Script gibt immer die Tage zwischen heute und dem "Next Update"-Datum aus und ich raff einfach nicht wie ich das ändern kann.

Beste Grüße
Niko
Dani
Dani 31.01.2022 um 10:36:31 Uhr
Goto Top
Moin Niko,
du berechnest die Differenz von den Daten (Plural von Datum) und hast somit die Anzahl der Tage. Im Sensor bzw. Channel kannst du somit anschließend an Hand dessen Alarmwerte definieren.


Gruß,
Dani
Doskias
Doskias 28.02.2023 aktualisiert um 15:38:50 Uhr
Goto Top
Zitat von @Dani:
Moin Niko,
du berechnest die Differenz von den Daten (Plural von Datum) und hast somit die Anzahl der Tage. Im Sensor bzw. Channel kannst du somit anschließend an Hand dessen Alarmwerte definieren.

Allgemein kannst du bei einem Custom-Skript auch die Textausgabe ganz oben so anpassen, dass dort immer das nächste Datum genannt wird. Wenn es länger als 60 Tage hin ist grün, 30 bis 60 Tage gelb, weniger als 30 Tage rot.

Ich habe das zum Beispiel mit den aktuellen Office-Versionen bei uns so gemacht:
prtg-custom

Den Text kannst du per Hand schreiben und mit If-Bedingungen sogar flexible halten face-wink

Gruß
Doskias