PRTG – Zertifikate mittels ADM überwachen

image_pdfimage_print

Im einem der letzten Beiträge habe ich ein Powershell Modul vorgestellt, mit welchem man Daten vom Citrix ADM abgreifen kann.

Basierend auf diesem Modul habe ich bei uns einen PRTG Custom Sensor erstellt, welcher die Ablaufdaten aus der SSL Zertifikatsübersicht ausliest:

Dazu müssen erst einmal die Parameter von PRTG sowie das Modul selbst eingelesen und eine Verbindung zur Appliance hergestellt werden:

# Get parameter from PRTG
param (
[string]$server,
[string]$domain,
[string]$username,
[string]$password
)

# Import ADM PS module
$CustomSensors="C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\"
Import-Module $CustomSensors\PRTGCustomCitrixADM.psm1

# Create the ADM session
$ADMHost = "https://"+$server
$ADMSession = Connect-ADM -ADMHost $ADMHost -CredUser $username -CredPW $password

Damit dies funktioniert, muss der entsprechende Benutzer von PRTG auf dem ADM Leserechte haben. Weiter gehe ich nicht auf jede Zeile ein, dies kann im Script selbst nachgelesen werden. Hier beschreibe ich vor allem die wichtigsten Punkte, wie das auslesen der Zertifikate:

# Get the certificates from the ADM
Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType ns_ssl_certkey
$ActiveCerts = Invoke-ADMNitro -ADMSession $ADMSession -OperationMethod GET -ResourceType ns_ssl_certkey

Das Ablaufdatum konnte nicht einfach so verwendet werden, daher musste ich mittels einer Funktion dieses erst in einen String umwandeln und dann entsprechend sortiert wieder zurück geben:

# Function ConvertTo-DateTime
# Converts the dates from the certificates to a standardized format
Function ConvertTo-DateTime([string] $datetime) {
    # Removes double spaces
    $datetime2 = $datetime -replace '\s+',' '
    # Create an array and use the space as separator
    $arr = $datetime2 -split ' '
    # Reorder and create a readable date
    $validdate = $arr[3] +"-"+ $arr[0] +"-"+ $arr[1] +" "+ $arr[2]
    # Return the value
    return $validdate
}

Nun konnte ich jedes Zertifikat einzeln in ein Array schreiben mit den entsprechenden Common Names und Ablaufdaten:

# Create array with all the certification information
ForEach ($Cert in $ActiveCerts2.ns_ssl_certkey){
    
    $CertSubject = ($Cert.subject -split "," | ConvertFrom-StringData).CN
    $CertIssuer = ($Cert.issuer -split "," | ConvertFrom-StringData).CN
    $CertValidTo = ConvertTo-DateTime $Cert.valid_to
    # For troubleshooting
    #Write-Host $CertValidTo
    $Certs += [PSCustomObject]@{Host=$Cert.hostname;Subject=$CertSubject;Status=$Cert.status;Expiredate=$CertValidTo;IssuerCA=$CertIssuer}

}

Im restlichen Skript wurden die einzelnen Daten mit einem vorgegebenen Wert gegen geprüft und die entsprechenden PRTG Ausgaben definiert.

Das Script muss nun in den Custom Sensors Ordner von PRTG gelegt werden und der Sensor kann entsprechend eingerichtet werden:

Parameter gem. Script-Beschreibung, Securitykontext vom Gerät
Als primären Channel die bald ablaufenden Zertifikate, Intervall 12h und sofortiger DOWN Status auswählen

Das Resultat sieht dann wie folgt aus:

Viel Spass beim Nachbauen :-)