Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Nedávno sme sa stretli s úlohou monitorovania platnosti certifikátov na serveroch s Windows. Ako sme sa s tým oboznámili, certifikáty sa niekoľkokrát premenili na tekvicu v čase, keď náš kolega zodpovedný za ich obnovu bol na dovolenke. Po tomto sme s tým niečo podozrievali a rozhodli sme sa to preskúmať. Keďže u nás sa postupne zavádza monitorovací systém NetXMS, stal sa hlavným a v podstate jediným kandidátom na túto úlohu.

Výsledok bol nakoniec získaný v takejto forme:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

A samotný proces pokračuje.

Ideme na to. V NetXMS neexistuje vstavaný čítač vypršania platnosti certifikátov, a preto je potrebné vytvoriť si vlastný a použiť skripty na zabezpečenie údajov. Samozrejme, na Powershell, veď je to Windows. Skript by mal prečítať všetky certifikáty v operačnom systéme, získať odtiaľ dobu ich platnosti v dňoch a odovzdať toto číslo do NetXMS. Cez jeho agenta. S tým aj začneme.

Prvá možnosť, najjednoduchšia. Jednoducho získať počet dní do vypršania platnosti certifikátu s najbližším dátumom.

Aby server NetXMS vedel o existencii našej vlastnej položky, musí ju získať od agenta. Inak túto položku nebude možné pridať z dôvodu jej absencie. Preto do konfiguračného súboru agenta nxagentd.conf pridáme riadok externa parameter s názvom HTTPS.CertificateExpireDateSimple, kde určíme spustenie skriptu:

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

Vzhľadom na to, že skript sa spúšťa cez sieť, nezabudnite na Execution Policy, ako aj na ďalšie „-NoLogo -NoProfile -NonInteractive“, ktoré som vynechal pre lepšiu čitateľnosť kódu.

Výsledkom je, že konfigurácia agenta vyzerá približne takto:

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

Po tomto je potrebné uložiť konfiguráciu a reštartovať agenta. Môžete to urobiť z konzoly NetXMS: otvoriť konfiguráciu (Edit agent’s configuration file), upraviť, vykonať Save&Apply, čím sa v podstate stane to isté. Potom prečítať konfiguráciu (Poll > Configuration), ak sa naozaj nechcete čakať. Po týchto krokoch by sa mala objaviť možnosť pridať našu vlastnú položku.

V konzole NetXMS ideme do Nastavenie zberu údajov testovacieho servera, na ktorom sa chystáme monitorovať certifikáty a vytvárame tam nový parameter (následne, po nastavení, má zmysel ho presunúť do šablón). Vyberáme HTTPS.CertificateExpireDateSimple zo zoznamu, zapisujeme Description s jasným názvom, typ nastavujeme na Integer a konfigurovame interval dotazovania. Na čas ladenia má zmysel nastaviť ho kratší, napríklad 30 sekúnd. Všetko, hotovo, zatiaľ stačí.

Môžeme overiť… nie, ešte je priskoro. Teraz, prirodzene, nič nedostaneme. Jednoducho preto, že skript ešte nebol napísaný. Oprávame túto chybu. Skript bude vydávať len číslo, počet dní, ktoré zostávajú do vypršania platnosti certifikátu. To najmenšie zo všetkých dostupných. Príklad skriptu:

try {
    # Získavame všetky certifikáty zo skladu certifikátov
    $lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
     
    # Ak nie sú certifikáty, vrátiť "10 rokov"
    if ($lmCertificates.Count -eq 0) { return 3650 }
 
    # Získavame Expiration Date všetkých certifikátov
    $expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
 
    # Získavame najbližší Expiration Date zo všetkých
    $minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
 
    # Konvertujeme najbližší Expiration Date na počet zostávajúcich dní s zaokrúhľovaním na nižšiu stranu
    $daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
 
    # Vrátime hodnotu
    return $daysLeft
}
catch {
    return -1
}

Vyzerá to takto:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

723 dni, do vypršania platnosti certifikátu zostáva ešte takmer dva roky. Logické, pretože certifikáty na Exchange testovacej platforme som nedávno obnovený.

To bol jednoduchý variant. Možno niekoho aj taký uspokojí, ale my sme chceli viac. Zadanie, ktoré sme si dali, je získať zoznam všetkých certifikátov na serveri, menovite, a pri každom vidieť počet dní, ktoré zostávajú do vypršania platnosti certifikátu.

Druhý variant, trochu zložitejší.

Opäť upravujeme konfiguráciu agenta a namiesto riadku s ExternalParameter píšeme dve iné:

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

V ExternalList získavame proste zoznam reťazcov. V našom prípade, zoznam reťazcov s názvami certifikátov. Tento zoznam reťazcov získame skriptom. Názov zoznamu je 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)"
    }
}

A už v ExternalParameter Na vstupu máme reťazce zo zoznamu ExternalList a na výstupe dostaneme rovnaký počet dní pre každú z nich. Identifikátorom je Thumbprint certifikátu. Upozorňujeme, že HTTPS.CertificateExpireDate v tejto variante obsahuje hviezdičku (*). To je nevyhnutné na to, aby prijímal externé premenné, konkrétne náš 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)"
}

V Data Collection Configuration servera vytvárame nový parameter. V Parameter vyberáme náš HTTPS.CertificateExpireDate(*) zo zoznamu a, (pozor!) meníme hviezdičku na {instance}. Tento dôležitý moment umožní vytvoriť samostatný počítač pre každý inštanc (certifikát). Zvyšok sa vyplní, ako v predchádzajúcej variante:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Aby bolo možné vytvoriť počítače, na karte Instance Discovery musíme vybrať Agent List zo zoznamu a do poľa List Name napísať názov nášho ExternalList zo skriptu — HTTPS.CertificateNames.

Takmer hotové, stačí si trochu počkať alebo manuálne vykonať Poll > Configuration a Poll > Instance Discovery, ak sa nedá čakať. Nakoniec dostaneme všetky naše certifikáty so termínmi platnosti:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Je to, čo potrebujeme? No áno, iba červíček perfekcionizmu sa pozrie na tento nepotrebný Thumbprint v mene počítača smutnými očami a nedovolí dokončiť článok. Aby sme ho nakrmili, znovu otvoríme vlastnosti počítača a na karte Instance Discovery v poli "Instance discovery filter script" pridáme napísaný na NXSL (vnútornej reči NetXMS) skript:

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

ktorý bude filtrovať Thumbprint:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Aby sa zobrazila filtrovaná verzia, na karte General v poli Description meníme CertificateExpireDate: {instance} na CertificateExpireDate: {instance-name}:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Všetko, konečne koniec z KDPV:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Krása, však?

Zostáva nastaviť upozornenia, aby sa posielali na e-mail, keď sa termín certifikátu blíži k svojmu logickému koncu.

1. Najprv je potrebné vytvoriť šablónu udalosti (Event Template) pre jej aktiváciu pri znížení hodnoty počítača pod nejaký stanovený prah. V Event Configuration vytvárame dva nové šablóny s názvami, povedzme CertificateExpireDate_Threshold_Activate so statusom Warning:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

a podobný CertificateExpireDate_Threshold_Deactivate so statusom Normal.

2. Ďalej prechádzame do vlastností počítača a na karte Tresholds nastavujeme prah:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

kde vyberáme naše vytvorené udalosti CertificateExpireDate_Threshold_Activate a CertificateExpireDate_Threshold_Deactivate, nastavujeme počet meraní (Samples) na 1 (konkrétne pre tento čítač nemá zmysel nastaviť viac), hodnotu na 30 (dní), napríklad, a, čo je dôležité, nastavujeme čas opakovania udalosti. Pre certifikáty v produkcii nastavujem raz za deň (86400 sekúnd), inak by sme mohli byť zahltení upozorneniami (čo sa mimochodom raz stalo, a to tak, že mi za víkend preplnil poštovú schránku). Pri ladení má zmysel nastaviť menej, napríklad 60 sekúnd.

3. V Action Configuration vytvárame šablónu e-mailu upozornenia, akúsi podobnú tejto:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Všetky tieto %m, %S a podobne — sú makrá, do ktorých sa vložia hodnoty z nášho parametra. Podrobnejšie sú popísané v návode NetXMS.

4. A nakoniec, spájajúc predchádzajúce body, v Event Processing Policy vytvárame pravidlo, podľa ktorého sa vytvorí alarm a odošle sa e-mail:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Uložíme politiku, všetko, môžeme testovať. Nastavíme prah vyššie, pre kontrolu. Môj najbližší certifikát vyprší za 723 dní, pre kontrolu som nastavil na 724. Výsledkom dostaneme takýto alarm:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

a takéto upozornenie e-mailom:

Monitorovanie platnosti certifikátov v systéme Windows na NetXMS

Teraz je to presne všetko. Samozrejme, mohli by sme nastaviť dashboard, vytvoriť grafy, ale pre certifikáty by to boli niekoľko bezvýznamných a nudných priamok, na rozdiel od grafov zaťaženia CPU alebo pamäte, napríklad. O tom ale niekedy inokedy.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster