Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Recent ne-am confruntat cu sarcina de a monitoriza perioada de valabilitate a certificatelor pe serverele Windows. Ei bine, cum m-am trezit după ce certificatele s-au transformat de mai multe ori în dovleac, chiar în momentul în care colegul cu barbă responsabil de reînnoirea lor era în vacanță. După aceea, el și cu mine am bănuit ceva și am decis să ne gândim la asta. Deoarece implementăm încet sistemul de monitorizare NetXMS, acesta a devenit principalul și, în principiu, singurul candidat pentru această sarcină.

Rezultatul a fost în final obținut sub următoarea formă:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Și procesul în sine continuă.

Merge. Nu există un contor încorporat pentru certificatele care expiră în NetXMS, așa că trebuie să vă creați propriul și să utilizați scripturi pentru a-i furniza date. Desigur, pe Powershell, acesta este Windows. Scriptul ar trebui să citească toate certificatele din sistemul de operare, să le ia data de expirare în zile de acolo și să transmită acest număr către NetXMS. Prin agentul său. De aici vom începe.

Opțiunea One, cel mai simplu. Pur și simplu obțineți numărul de zile până la data de expirare a certificatului cu cea mai apropiată dată.

Pentru ca serverul NetXMS să știe despre existența parametrului nostru personalizat, trebuie să îl primească de la agent. În caz contrar, acest parametru nu poate fi adăugat din cauza absenței sale. Prin urmare, în fișierul de configurare a agentului nxagentd.conf adăugăm un șir de parametri externi numit HTTPS.CertificateExpireDateSimple, în care înregistrăm lansarea scriptului:

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

Având în vedere că scriptul este lansat în rețea, trebuie să vă amintiți despre Politica de execuție, și, de asemenea, nu uitați de celălalt „-NoLogo -NoProfile -NonInteractive”, pe care l-am omis pentru o mai bună lizibilitate a codului.

Ca rezultat, configurația agentului arată cam așa:

#
# 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"

După aceasta, trebuie să salvați configurația și să reporniți agentul. Puteți face acest lucru din consola NetXMS: deschideți config (Editați fișierul de configurare al agentului), editați-l, executați Save&Apply, drept urmare, de fapt, același lucru se va întâmpla. Apoi recitiți configurația (Sondaj > Configurare), dacă nu aveți puterea să așteptați deloc. După acești pași, ar trebui să puteți adăuga parametrul nostru personalizat.

În consola NetXMS accesați Configurarea colectării datelor server experimental pe care vom monitoriza certificatele și vom crea acolo un nou parametru (în viitor, după configurare, are sens să-l transferăm în șabloane). Selectați HTTPS.CertificateExpireDateSimple din listă, introduceți o Descriere cu un nume clar, setați tipul la Integer și configurați intervalul de interogare. În scopuri de depanare, este logic să o faceți mai scurtă, 30 de secunde, de exemplu. Totul este gata, e suficient deocamdată.

Poți verifica... nu, e prea devreme. Acum, desigur, nu vom primi nimic. Pur și simplu pentru că scenariul nu a fost încă scris. Să corectăm această omisiune. Scriptul va afișa pur și simplu un număr, numărul de zile rămase până la expirarea certificatului. Cel mai minim dintre toate disponibile. Exemplu de script:

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
}

Se dovedește astfel:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

723 de zile, au mai rămas aproape doi ani până la expirarea certificatului. Este logic, pentru că am reemis certificate pentru bancul de testare Exchange destul de recent.

A fost o varianta usoara. Probabil că cineva va fi mulțumit de asta, dar noi ne-am dorit mai mult. Ne-am propus să obținem o listă cu toate certificatele de pe server, după nume, și ca fiecare să vadă numărul de zile rămase până la expirarea certificatului.

Doua opțiune, ceva mai complicat.

Din nou edităm configurația agentului și acolo, în loc de linia cu ExternalParameter, scriem alte două:

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

В Lista externă primim doar o listă de șiruri. În cazul nostru, o listă de șiruri de caractere cu nume de certificat. Vom primi o listă cu aceste rânduri folosind scriptul. Numele listei - HTTPS.CertificateNames.

Script 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)"
    }
}

Și deja intră ExternalParameter Introducem rânduri din lista ExternalList, iar la ieșire obținem același număr de zile pentru fiecare. Identificatorul este amprenta digitală a certificatului. Rețineți că HTTPS.CertificateExpireDate conține un asterisc (*) în această variantă. Acest lucru este necesar pentru ca acesta să accepte variabile externe, doar CertificateId-ul nostru.

Script 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)"
}

În Configurația de colectare a datelor a serverului, creăm un nou parametru. În Parametru selectam nostru HTTPS.CertificateExpireDate(*) din listă și (atenție!) schimbați asteriscul în {instanță}. Acest punct important vă va permite să creați un contor separat pentru fiecare instanță (certificat). Restul este completat ca în versiunea anterioară:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Pentru a avea ceva din care să creați contoare, pe fila Instance Discovery trebuie să selectați Lista agenți din listă și în câmpul List Name introduceți numele ExternalList din script - HTTPS.CertificateNames.

Aproape gata, așteptați puțin sau forțați Poll > Configuration and Poll > Instance Discovery dacă este complet imposibil să așteptați. Drept urmare, obținem toate certificatele noastre cu perioade de valabilitate:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

De ce ai nevoie? Ei bine, da, doar viermele perfecționismului privește această amprentă inutilă din numele ghișeului cu ochi triști și nu mă lasă să termin articolul. Pentru a-l alimenta, deschideți din nou proprietățile contorului și în fila Descoperire instanțe, în câmpul „Script de filtru de descoperire a instanțelor”, adăugați cel scris în NXSL script (limbaj intern NetXMS):

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

care va filtra Amprenta:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Și pentru a-l afișa filtrat, în fila General din câmpul Description, schimbați CertificateExpireDate: {instance} la CertificateExpireDate: {instance-name}:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Asta e, în sfârșit linia de sosire de la KDPV:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Este frumos?

Rămâne doar să configurați alerte, astfel încât acestea să ajungă prin e-mail când expiră certificatul.

1. Mai întâi trebuie să creăm un șablon de eveniment pentru a-l activa atunci când valoarea contorului scade la un prag stabilit de noi. ÎN Configurare eveniment haideți să creăm două șabloane noi cu nume precum CertificateExpireDate_Threshold_Activate cu stare de avertizare:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

și altele similare CertificateExpireDate_Threshold_Deactivate cu stare normală.

2. Apoi, accesați proprietățile contorului și setați pragul în fila Praguri:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

unde selectăm evenimentele noastre create CertificateExpireDate_Threshold_Activate și CertificateExpireDate_Threshold_Deactivate, setăm numărul de mostre (Samples) la 1 (în special pentru acest contor nu are rost să setați mai multe), valoarea este 30 (zile), de exemplu și, important, setați timpul de repetare a evenimentului. Pentru certificatele în producție, l-am setat o dată pe zi (86400 secunde), altfel vă puteți îneca în notificări (ceea ce, de altfel, s-a întâmplat o dată, atât de mult încât căsuța poștală a fost plină în weekend). Pentru timpul de depanare, este logic să îl setați mai mic, 60 de secunde, de exemplu.

3. În Configurarea acțiunii creați un șablon de scrisoare de notificare, astfel:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Toate aceste %m, %S etc. — macrocomenzi în care vor fi înlocuite valorile din parametrul nostru. Ele sunt descrise mai detaliat în manual NetXMS.

4. Și în final, combinând punctele anterioare, în Politica de procesare a evenimentelor creați o regulă conform căreia va fi creată o Alarmă și va fi trimisă o scrisoare:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Salvăm polița, totul poate fi testat. Să setăm pragul mai mare pentru a verifica. Cel mai apropiat certificat expiră în 723 de zile, l-am setat la 724 pentru a verifica. Ca urmare, primim următoarea alarmă:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

și această notificare prin e-mail:

Monitorizarea datei de expirare a certificatului în Windows pe NetXMS

Asta e totul sigur acum. Ar fi posibil, desigur, să configurați un tablou de bord și să construiți grafice, dar pentru certificate acestea ar fi linii drepte oarecum lipsite de sens și plictisitoare, spre deosebire de graficele de încărcare a procesorului sau a memoriei, de exemplu. Dar, mai multe despre asta altădată.

Sursa: www.habr.com

Adauga un comentariu