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-Key: 1622590038

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

Printed on: April 18, 2024 at 22:04 o'clock

Member: Dani
Dani Dec 15, 2021 at 14:47:33 (UTC)
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
Member: lcer00
lcer00 Dec 15, 2021 updated at 16:15:46 (UTC)
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
Member: Niko86
Niko86 Jan 20, 2022 at 10:09:07 (UTC)
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
Member: Dani
Dani Jan 20, 2022 at 17:42:24 (UTC)
Goto Top
Moin,
Gibt es auch eine Möglichkeit das Datum von "Next CRL Publish" statt "Next update" auszugeben?
Ja.


Grüße,
Dani
Member: lcer00
lcer00 Jan 20, 2022 at 20:40:18 (UTC)
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
Member: Dani
Dani Jan 20, 2022 at 21:46:12 (UTC)
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
Member: Niko86
Niko86 Jan 21, 2022 at 08:36:49 (UTC)
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
Member: Dani
Dani Jan 31, 2022 at 09:36:31 (UTC)
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
Member: Doskias
Doskias Feb 28, 2023 updated at 14:38:50 (UTC)
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