Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Nedavno smo se suočili sa zadatkom praćenja perioda važenja sertifikata na Windows serverima. Pa kako sam ustao nakon što su se sertifikati nekoliko puta pretvorili u bundevu, baš u vreme kada je bradati kolega zadužen za njihovo obnavljanje bio na odmoru. Nakon toga, on i ja smo nešto posumnjali i odlučili da razmislimo o tome. Pošto polako implementiramo NetXMS sistem za praćenje, on je postao glavni i u principu jedini kandidat za ovaj zadatak.

Rezultat je konačno dobijen u sljedećem obliku:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

I sam proces se nastavlja.

Idi. Ne postoji ugrađeni brojač za istekle sertifikate u NetXMS-u, tako da morate da kreirate sopstveni i koristite skripte da biste mu dali podatke. Naravno, na Powershell-u, ovo je Windows. Skripta treba da pročita sve sertifikate u operativnom sistemu, uzme njihov datum isteka u danima odatle i prosledi ovaj broj NetXMS-u. Preko njegovog agenta. Tu ćemo početi.

Opcija jedan, najjednostavniji. Jednostavno uzmite broj dana do datuma isteka certifikata s najbližim datumom.

Da bi NetXMS server znao za postojanje našeg prilagođenog parametra, mora ga primiti od agenta. U suprotnom, ovaj parametar se ne može dodati zbog njegovog odsustva. Stoga, u konfiguracijskoj datoteci agenta nxagentd.conf dodajemo eksterni niz parametara tzv HTTPS.CertificateExpireDateSimple, u kojem registrujemo pokretanje skripte:

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

S obzirom da se skripta pokreće preko mreže, morate se sjetiti Politika izvršenja, a također ne zaboravite na drugi "-NoLogo -NoProfile -NonInteractive", koji sam izostavio radi bolje čitljivosti koda.

Kao rezultat toga, konfiguracija agenta izgleda otprilike ovako:

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

Nakon toga, potrebno je da sačuvate konfiguraciju i ponovo pokrenete agenta. To možete učiniti iz NetXMS konzole: otvorite konfiguraciju (Uredi konfiguracijsku datoteku agenta), uredite je, izvršite Save&Apply, kao rezultat čega će se, u stvari, desiti ista stvar. Zatim ponovo pročitajte konfiguraciju (Anketa > Konfiguracija), ako uopće nemate snage čekati. Nakon ovih koraka, trebali biste biti u mogućnosti da dodate naš prilagođeni parametar.

U NetXMS konzoli idite na Konfiguracija prikupljanja podataka eksperimentalni server na kojem ćemo pratiti certifikate i tamo kreirati novi parametar (u budućnosti, nakon konfiguracije, ima smisla prenijeti ga u šablone). Izaberite HTTPS.CertificateExpireDateSimple sa liste, unesite Opis sa jasnim imenom, postavite tip na Integer i konfigurišite interval anketiranja. Za potrebe otklanjanja grešaka, ima smisla da bude kraći, na primer 30 sekundi. Sve je spremno, za sada je dovoljno.

Možete provjeriti... ne, prerano je. Sada, naravno, nećemo ništa dobiti. Jednostavno zato što scenario još nije napisan. Ispravimo ovaj propust. Skripta će jednostavno prikazati broj, broj dana preostalih do isteka certifikata. Najminimalniji od svih dostupnih. Primjer skripte:

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
}

Ispada ovako:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

723 dana, skoro dvije godine do isteka certifikata. To je logično, jer sam nedavno ponovo izdao sertifikate za Exchange test bench.

To je bila laka opcija. Vjerovatno će neko biti zadovoljan ovim, ali mi smo htjeli više. Postavili smo sebi zadatak da dobijemo listu svih sertifikata na serveru, po imenu, i za svaki da vidimo koliko dana je ostalo do isteka sertifikata.

Druga opcija, nešto komplikovanije.

Ponovo uređujemo konfiguraciju agenta i tamo, umjesto linije s ExternalParameterom, pišemo još dvije:

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

В ExternalList dobijamo samo listu stringova. U našem slučaju, lista stringova sa imenima sertifikata. Dobit ćemo listu ovih linija koristeći skriptu. Ime liste - HTTPS.CertificateNames.

Skripta 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 već unutra ExternalParameter Unosimo redove sa liste ExternalList, a na izlazu dobijamo isti broj dana za svaki. Identifikator je Thumbprint certifikata. Imajte na umu da HTTPS.CertificateExpireDate sadrži zvjezdicu (*) u ovoj varijanti. Ovo je neophodno kako bi prihvatio vanjske varijable, samo naš CertificateId.

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

U konfiguraciji prikupljanja podataka servera kreiramo novi parametar. U Parametru biramo naše HTTPS.CertificateExpireDate(*) sa liste i (pažnja!) promenite zvezdicu u {instance}. Ova važna tačka će vam omogućiti da kreirate poseban brojač za svaku instancu (sertifikat). Ostatak se popunjava kao u prethodnoj verziji:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Da biste imali od čega da kreirate brojače, na kartici Instance Discovery potrebno je sa liste izabrati Agent List i u polje Ime liste uneti ime naše ExternalList iz skripte - HTTPS.CertificateNames.

Skoro spremno, pričekajte malo ili prisilite Anketu > Konfiguracija i Anketa > Otkrivanje instance ako je potpuno nemoguće čekati. Kao rezultat, dobijamo sve naše sertifikate sa rokom važenja:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Šta ti treba? Pa da, samo crv perfekcionizma tužnim očima gleda ovaj nepotreban Thumbprint u nazivu tezge i ne da mi da završim članak. Da biste ga uneli, ponovo otvorite svojstva brojača i na kartici Otkrivanje instance, u polje „Skripta filtera otkrivanja instance“, dodajte onu napisanu NXSL (NetXMS interni jezik) skripta:

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

koji će filtrirati Thumbprint:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

A da biste ga prikazali filtrirano, na kartici Općenito u polju Opis promijenite CertificateExpireDate: {instance} u CertificateExpireDate: {instance-name}:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

To je to, konačno cilj sa KDPV-a:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Zar nije lepota?

Ostaje samo da podesite upozorenja tako da stižu e-poštom kada certifikat istekne.

1. Prvo moramo kreirati predložak događaja da ga aktiviramo kada se vrijednost brojača smanji na neki prag koji smo postavili. IN Konfiguracija događaja napravimo dva nova šablona sa imenima kao što su CertificateExpireDate_Threshold_Activate sa statusom upozorenja:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

i slično CertificateExpireDate_Threshold_Deactivate sa normalnim statusom.

2. Zatim idite na svojstva brojača i postavite prag na kartici Tresholds:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

gdje biramo naše kreirane događaje CertificateExpireDate_Threshold_Activate i CertificateExpireDate_Threshold_Deactivate, postavljamo broj uzoraka (Samples) na 1 (konkretno za ovaj brojač nema smisla postavljati više), vrijednost je 30 (dana), npr. i, što je važno, postavite vrijeme ponavljanja događaja. Za sertifikate u proizvodnji postavljam jednom dnevno (86400 sekundi), inače se možete utopiti u notifikacijama (što se, inače, jednom desilo, toliko da je sanduče bilo puno preko vikenda). Za vrijeme otklanjanja grešaka, ima smisla postaviti ga niže, na primjer 60 sekundi.

3.In Konfiguracija akcije kreirajte predložak pisma obavještenja, ovako:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Svi ovi %m, %S, itd. — makronaredbe u koje će biti zamijenjene vrijednosti iz našeg parametra. Oni su detaljnije opisani u priručnik NetXMS.

4. I na kraju, kombinujući prethodne tačke, u Politika obrade događaja kreirajte pravilo prema kojem će se kreirati Alarm i poslati pismo:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

Mi čuvamo polisu, sve se može testirati. Postavimo viši prag da provjerimo. Moj najbliži sertifikat ističe za 723 dana, postavio sam ga na 724 da proverim. Kao rezultat, dobijamo sledeći alarm:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

i ovo obavještenje putem e-pošte:

Nadgledanje datuma isteka certifikata u Windows-u na NetXMS-u

To je sada sve sigurno. Naravno, bilo bi moguće postaviti kontrolnu ploču i graditi grafikone, ali za certifikate bi to bile pomalo besmislene i dosadne ravne linije, za razliku od grafova opterećenja procesora ili memorije, na primjer. Ali, više o ovome neki drugi put.

izvor: www.habr.com

Dodajte komentar