Övervaka certifikatets utgångsdatum i Windows på NetXMS

Nyligen stod vi inför uppgiften att övervaka giltighetstiden för certifikat på Windows-servrar. Nåväl, hur jag reste mig efter att certifikaten förvandlats till en pumpa flera gånger, just då den skäggige kollegan som ansvarade för deras förnyelse var på semester. Efter det misstänkte han och jag något och bestämde oss för att tänka på det. Eftersom vi långsamt implementerar NetXMS-övervakningssystemet har det blivit den främsta och i princip enda kandidaten för denna uppgift.

Resultatet erhölls slutligen i följande form:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Och själva processen fortsätter.

Gå. Det finns ingen inbyggd räknare för utgående certifikat i NetXMS, så du måste skapa dina egna och använda skript för att förse den med data. Naturligtvis, på Powershell är detta Windows. Skriptet bör läsa alla certifikat i operativsystemet, ta deras utgångsdatum i dagar därifrån och skicka detta nummer till NetXMS. Genom sin agent. Det är där vi börjar.

Alternativ ett, enklast. Få helt enkelt antalet dagar fram till certifikatets utgångsdatum med närmaste datum.

För att NetXMS-servern ska veta om existensen av vår anpassade parameter måste den ta emot den från agenten. Annars kan denna parameter inte läggas till på grund av sin frånvaro. Därför i agentens konfigurationsfil nxagentd.conf vi lägger till en extern parametersträng som kallas HTTPS.CertificateExpireDateSimple, där vi registrerar lanseringen av skriptet:

ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"

Med tanke på att skriptet lanseras över nätverket måste du komma ihåg om Utförandepolicy, och glöm inte heller den andra "-NoLogo -NoProfile -NonInteractive", som jag utelämnade för bättre kodläsbarhet.

Som ett resultat ser agentkonfigurationen ut ungefär så här:

#
# NetXMS agent configuration file
# Created by agent installer at Thu Jun 13 11:24:43 2019
#
 
MasterServers = netxms.corp.testcompany.ru
ConfigIncludeDir = C:NetXMSetcnxagentd.conf.d
LogFile = {syslog}
FileStore = C:NetXMSvar
SubAgent = ecs.nsm
SubAgent = filemgr.nsm
SubAgent = ping.nsm
SubAgent = logwatch.nsm
SubAgent = portcheck.nsm
SubAgent = winperf.nsm
SubAgent = wmi.nsm
 
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"

Efter detta måste du spara konfigurationen och starta om agenten. Du kan göra detta från NetXMS-konsolen: öppna konfigurationen (Redigera agentens konfigurationsfil), redigera den, kör Save&Apply, vilket resulterar i att samma sak kommer att hända. Läs sedan om konfigurationen (omröstning > konfiguration), om du inte orkar vänta alls. Efter dessa steg bör du kunna lägga till vår anpassade parameter.

Gå till i NetXMS-konsolen Datainsamlingskonfiguration experimentell server på vilken vi ska övervaka certifikat och skapa en ny parameter där (i framtiden, efter konfiguration, är det vettigt att överföra den till mallar). Välj HTTPS.CertificateExpireDateSimple från listan, ange en beskrivning med ett tydligt namn, ställ in typen på Integer och konfigurera pollingintervallet. För felsökningsändamål är det vettigt att göra det kortare, till exempel 30 sekunder. Allt är klart, det räcker för nu.

Du kan kolla... nej, det är för tidigt. Nu får vi såklart inget. Helt enkelt för att manuset ännu inte är skrivet. Låt oss rätta till detta utelämnande. Skriptet kommer helt enkelt att visa ett nummer, antalet dagar som återstår tills certifikatet går ut. Den minsta av alla tillgängliga. Exempel på skript:

try {
    # Получаем все сертификаты из хранилища сертификатов
    $lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
     
    # Если сертификатов нет, вернуть "10 лет"
    if ($lmCertificates.Count -eq 0) { return 3650 }
 
    # Получаем Expiration Date всех сертификатов
    $expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
 
    # Получаем наиболее близкий Expiration Date из всех
    $minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
 
    # Конвертируем наиболее близкий Expiration Date в количество оставшихся дней с округлением в меньшую сторону
    $daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
 
    # Возвращаем значение
    return $daysLeft
}
catch {
    return -1
}

Det blir så här:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

723 dagar, nästan två år kvar tills certifikatet går ut. Det är logiskt, eftersom jag nyligen utfärdade certifikat för Exchange-testbänken.

Det var ett enkelt alternativ. Förmodligen kommer någon att vara nöjd med detta, men vi ville ha mer. Vi satte oss i uppgift att skaffa en lista över alla certifikat på servern, efter namn, och för var och en att se antalet dagar som återstår tills certifikatet löper ut.

Det andra alternativet, något mer komplicerat.

Återigen redigerar vi agentkonfigurationen och där, istället för raden med ExternalParameter, skriver vi två andra:

ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"

В Externlista vi får bara en lista med strängar. I vårt fall en lista med strängar med certifikatnamn. Vi kommer att få en lista över dessa rader med hjälp av skriptet. Namnlista - HTTPS.CertificateNames.

Skript NetXMS_CertNames.ps1:

#Список возможных имен сертификатов
$nameTypeList = @(
        [System.Security.Cryptography.X509Certificates.X509NameType]::SimpleName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::DnsName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::DnsFromAlternativeName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::UrlName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::EmailName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::UpnName
)
 
#Ищем все сертификаты, имеющие закрытый ключ
$certList = @( Get-ChildItem -Path 'Cert:LocalMachineMy' | Where-Object { $_.HasPrivateKey -eq $true } )
 
#Проходим по списку сертификатов, формируем строку "Имя сертификата - Дата - Thumbprint" и возвращаем её
foreach ($cert in $certList) {
    $name = '(unknown name)'
    try {
        $thumbprint = $cert.Thumbprint
        $dateExpire = $cert.NotAfter
        foreach ($nameType in $nameTypeList) {
            $name_temp = $cert.GetNameInfo( $nameType, $false)
            if ($name_temp -ne $null -and $name_temp -ne '') {
                $name = $name_temp;
                break;
            }
        }
        Write-Output "$($name) - $($dateExpire.ToString('dd.MM.yyyy')) - [T:$($thumbprint)]"
    }
    catch {
        Write-Error -Message "Error processing certificate list: $($_.Exception.Message)"
    }
}

Och redan inne Externparameter Vi matar in rader från ExternalList-listan, och vid utgången får vi samma antal dagar för varje. Identifieraren är tumavtrycket för certifikatet. Observera att HTTPS.CertificateExpireDate innehåller en asterisk (*) i denna variant. Detta är nödvändigt för att det ska acceptera externa variabler, bara vårt CertificateId.

Skript NetXMS_CertExpireDate.ps1:

#Определяем входящий параметр $CertificateId
param (
    [Parameter(Mandatory=$false)]
    [String]$CertificateId
)
 
#Проверка на существование
if ($CertificateId -eq $null) {
    Write-Error -Message "CertificateID parameter is required!"
    return
}
 
#По Thumbprint из строки в $CertificateId ищем сертификат и определяем его Expiration Date 
$certId = $CertificateId;
try {
    if ($certId -match '^.*[T:(?<Thumbprint>[A-Z0-9]+)]$') {
        $thumbprint = $Matches['Thumbprint']
        $certificatePath = "Cert:LocalMachineMy$($thumbprint)"
         
        if (Test-Path -PathType Leaf -Path $certificatePath ) {
            $certificate = Get-Item -Path $certificatePath;
            $certificateExpirationDate = $certificate.NotAfter
            $certificateDayToLive = [Math]::Floor( ($certificateExpirationDate - [DateTime]::Now).TotalDays )
            Write-Output "$($certificateDayToLive)";
        }
        else {
            Write-Error -Message "No certificate matching this thumbprint found on this server $($certId)"
        }
    }
    else {
        Write-Error -Message "CertificateID provided in wrong format. Must be FriendlyName [T:<thumbprint>]"
    }
}
catch {
    Write-Error -Message "Error while executing script: $($_.Exception.Message)"
}

I datainsamlingskonfigurationen för servern skapar vi en ny parameter. I Parameter väljer vi vår HTTPS.CertificateExpireDate(*) från listan, och (obs!) ändra asterisken till {exempel}. Denna viktiga punkt gör att du kan skapa en separat räknare för varje instans (certifikat). Resten fylls i som i föregående version:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

För att ha något att skapa räknare från, på fliken Instansupptäckt måste du välja Agent List från listan och i fältet List Name ange namnet på vår ExternalList från skriptet - HTTPS.CertificateNames.

Nästan klar, vänta lite eller tvinga fram Poll > Configuration and Poll > Instance Discovery om det är helt omöjligt att vänta. Som ett resultat får vi alla våra certifikat med giltighetsperioder:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Vad behöver du? Nåväl, ja, bara perfektionismens mask tittar på detta onödiga tumavtryck i diskens namn med sorgsna ögon och låter mig inte avsluta artikeln. För att mata den öppnar du räknaregenskaperna igen och på fliken Förekomstupptäckt, i fältet "Filterskript för förekomstupptäckt", lägger du till det som skrivits i NXSL (NetXMS internt språk) skript:

instance = $1;
 if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
 {
 return %(true, instance, $1);
 }
 return true;

som kommer att filtrera Thumbprint:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Och för att visa det filtrerat, på fliken Allmänt i fältet Beskrivning, ändra CertificateExpireDate: {instance} till CertificateExpireDate: {instansnamn}:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Det var allt, äntligen mållinjen från KDPV:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Är det skönhet?

Allt som återstår är att sätta upp varningar så att de kommer via e-post när certifikatet går ut.

1. Först måste vi skapa en händelsemall för att aktivera den när räknarvärdet sjunker till någon tröskel vi ställer in. I Händelsekonfiguration låt oss skapa två nya mallar med namn som CertificateExpireDate_Threshold_Activate med varningsstatus:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

och liknande CertificateExpireDate_Threshold_Deactivate med normal status.

2. Gå sedan till räknarens egenskaper och ställ in tröskeln på fliken Tröskelvärden:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

där vi väljer våra skapade händelser CertificateExpireDate_Threshold_Activate och CertificateExpireDate_Threshold_Deactivate, ställer in antalet sampel (Sampler) till 1 (specifikt för denna räknare är det ingen idé att ställa in fler), värdet är 30 (dagar), till exempel, och, viktigare, ställ in upprepningstiden för händelsen. För certifikat i produktion ställer jag in det en gång om dagen (86400 sekunder), annars kan man drunkna i aviseringar (vilket för övrigt hände en gång, så pass att brevlådan var full under helgen). För felsökningstiden är det vettigt att sätta den lägre, till exempel 60 sekunder.

3. In Åtgärdskonfiguration skapa en mall för meddelandebrev, så här:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Alla dessa %m, %S osv. — makron där värden från vår parameter kommer att ersättas. De beskrivs mer i detalj i manuell NetXMS.

4. Och slutligen, kombinera de föregående punkterna, till Händelsebearbetningspolicy skapa en regel enligt vilken ett larm kommer att skapas och ett brev kommer att skickas:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Vi sparar policyn, allt går att testa. Låt oss sätta tröskeln högre för att kontrollera. Mitt närmaste certifikat går ut om 723 dagar, jag ställer in det på 724 för att kontrollera. Som ett resultat får vi följande larm:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

och detta e-postmeddelande:

Övervaka certifikatets utgångsdatum i Windows på NetXMS

Det är allt säkert nu. Det skulle naturligtvis vara möjligt att sätta upp en instrumentpanel och bygga grafer, men för certifikat skulle dessa vara något meningslösa och tråkiga raka linjer, till skillnad från grafer över processor- eller minnesbelastning, till exempel. Men mer om detta någon annan gång.

Källa: will.com

Lägg en kommentar