A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Nemrég azzal a feladattal szembesültünk, hogy ellenőrizzük a tanúsítványok érvényességi idejét a Windows szervereken. Hát hogyan keltem fel azután, hogy a bizonyítványokból többször is tökös lett, éppen akkor, amikor a megújításukért felelős szakállas kolléga nyaralt. Ezek után ő és én gyanakodtunk valamire, és úgy döntöttünk, hogy meggondoljuk. Mióta lassan bevezetjük a NetXMS felügyeleti rendszert, ez lett a fő és elvileg az egyetlen jelölt erre a feladatra.

Az eredmény végül a következő formában született:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

És maga a folyamat folytatódik.

Megy. A NetXMS-ben nincs beépített számláló a lejáró tanúsítványokhoz, ezért létre kell hoznia saját számláját, és szkripteket kell használnia az adatok megadásához. Természetesen a Powershellnél ez a Windows. A szkriptnek be kell olvasnia az operációs rendszerben található összes tanúsítványt, lejárati dátumát napokban kell megadnia onnan, és át kell adnia ezt a számot a NetXMS-nek. Az ügynökén keresztül. Ott kezdjük.

Option One, legegyszerűbb. Egyszerűen szerezze be a tanúsítvány lejárati dátumáig eltelt napok számát a legközelebbi dátummal.

Ahhoz, hogy a NetXMS szerver tudjon egyéni paraméterünk létezéséről, meg kell kapnia azt az ügynöktől. Ellenkező esetben ez a paraméter nem adható hozzá a hiánya miatt. Ezért az ügynök konfigurációs fájljában nxagentd.conf nevű külső paraméter-karakterláncot adunk hozzá HTTPS.CertificateExpireDateSimple, amelyben regisztráljuk a szkript elindítását:

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

Figyelembe véve, hogy a szkript a hálózaton keresztül indul el, emlékeznie kell kb Végrehajtási politika, és ne feledkezzünk meg a másik „-NoLogo -NoProfile -NonInteractive”-ról sem, amelyet a jobb kód olvashatóság érdekében kihagytam.

Ennek eredményeként az ügynök konfigurációja valahogy így néz ki:

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

Ezt követően el kell mentenie a konfigurációt, és újra kell indítania az ügynököt. Ezt megteheti a NetXMS konzolból: nyissa meg a config-ot (Edit agent's configuration file), szerkessze, futtassa a Save&Apply-t, aminek eredményeként tulajdonképpen ugyanez történik. Ezután olvassa el újra a konfigurációt (Szavazás > Konfiguráció), ha egyáltalán nincs ereje várni. Ezen lépések után felveheti egyéni paraméterünket.

A NetXMS konzolban lépjen a következőre: Adatgyűjtés konfigurációja kísérleti szerver, amelyen a tanúsítványokat figyelni fogjuk, és ott új paramétert hozunk létre (a jövőben a konfiguráció után érdemes átvinni sablonokba). Válassza ki a listából a HTTPS.CertificateExpireDateSimple elemet, írjon be egy Leírást egyértelmű névvel, állítsa be a típust Integer értékre, és konfigurálja a lekérdezési intervallumot. Hibakeresési célból érdemes rövidebbre tenni, például 30 másodpercre. Minden készen van, egyelőre ennyi elég.

Ellenőrizheti... nem, még túl korai. Most persze nem kapunk semmit. Egyszerűen azért, mert a forgatókönyvet még nem írták meg. Javítsuk ki ezt a hiányosságot. A szkript egyszerűen megjelenít egy számot, vagyis a tanúsítvány lejártáig hátralévő napok számát. A legminimálisabb az összes elérhető közül. Példa szkript:

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
}

Így alakul:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

723 nap, majdnem két év van hátra a tanúsítvány lejártáig. Ez logikus, mert nemrégiben adtam ki újra a tanúsítványokat az Exchange tesztpadhoz.

Könnyű lehetőség volt. Valószínűleg valaki elégedett lesz ezzel, de mi többet akartunk. Azt a feladatot tűztük ki magunk elé, hogy név szerint lekérjük a szerveren lévő összes tanúsítvány listáját, és mindegyiknél lássuk, hány nap van hátra a tanúsítvány lejártáig.

A második lehetőség, valamivel bonyolultabb.

Ismét szerkesztjük az ügynök konfigurációját, és ott az ExternalParameter sor helyett két másikat írunk:

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

В Külső lista csak kapunk egy listát a húrokról. Esetünkben a karakterláncok listája tanúsítványnevekkel. Ezekről a sorokról kapunk egy listát a szkript segítségével. Lista név - HTTPS.CertificateNames.

NetXMS_CertNames.ps1 szkript:

#Список возможных имен сертификатов
$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)"
    }
}

És már bent is Külső paraméter Az ExternalList listából beírunk sorokat, és a kimeneten mindegyikhez ugyanannyi napot kapunk. Az azonosító a tanúsítvány ujjlenyomata. Vegye figyelembe, hogy a HTTPS.CertificateExpireDate ebben a változatban egy csillagot (*) tartalmaz. Erre azért van szükség, hogy elfogadja a külső változókat, csak a tanúsítványazonosítónkat.

NetXMS_CertExpireDate.ps1 szkript:

#Определяем входящий параметр $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)"
}

A szerver Adatgyűjtési konfigurációjában új paramétert hozunk létre. A Paraméterben kiválasztjuk a sajátunkat HTTPS.CertificateExpireDate(*) a listából, és (figyelem!) módosítsa a csillagot erre {példa}. Ez a fontos pont lehetővé teszi, hogy minden példányhoz (tanúsítványhoz) külön számlálót hozzon létre. A többit az előző változat szerint kell kitölteni:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Ahhoz, hogy legyen miből számlálókat létrehozni, a Példányfelderítés lapon ki kell választani a listából az Ügynöklistát, és a Listanév mezőbe be kell írni a külső listánk nevét a szkriptből - HTTPS.CertificateNames.

Majdnem kész, várjon egy kicsit, vagy kényszerítse a Poll > Configuration and Poll > Instance Discovery parancsot, ha teljesen lehetetlen várni. Ennek eredményeként minden tanúsítványunkat megkapjuk az alábbi érvényességi időkkel:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Mire van szükséged? Hát igen, csak a perfekcionizmus férge nézi szomorú szemekkel ezt a felesleges Ujjlenyomatot a pult nevében, és nem engedi, hogy befejezzem a cikket. A betápláláshoz nyissa meg újra a számláló tulajdonságait, és a Példányfelderítés lap „Példányfelderítési szűrőszkript” mezőjébe adja hozzá a NXSL (NetXMS belső nyelv) szkript:

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

amely szűri az ujjlenyomatot:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

A szűrt megjelenítéséhez pedig az Általános lap Leírás mezőjében állítsa át a CertificateExpireDate: {példány} értékre Tanúsítvány lejárati dátuma: {példánynév}:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Ennyi, végre a cél a KDPV-től:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Ez a szépség?

Már csak be kell állítani a riasztásokat, hogy a tanúsítvány lejártakor e-mailben érkezzenek.

1. Először létre kell hoznunk egy Eseménysablont, hogy aktiváljuk, amikor a számláló értéke valamely általunk beállított küszöbértékre csökken. BAN BEN Esemény konfiguráció hozzunk létre két új sablont ilyen névvel CertificateExpireDate_Threshold_Activate Figyelmeztetés állapottal:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

és hasonlók CertificateExpireDate_Threshold_Deaktiválás Normál állapottal.

2. Ezután lépjen a számláló tulajdonságaihoz, és állítsa be a küszöbértéket a Küszöbértékek lapon:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

ahol kiválasztjuk a létrehozott eseményeinket CertificateExpireDate_Threshold_Activate és CertificateExpireDate_Threshold_Deactivate, a minták (Minták) számát állítsuk 1-re (konkrétan ennél a számlálónál nincs értelme többet beállítani), az érték például 30 (nap), és ami fontos, beállítjuk az esemény ismétlési ideje. A gyártásban lévő tanúsítványoknál naponta egyszer állítottam be (86400 másodperc), különben belefulladhat az értesítésekbe (ami egyébként egyszer megtörtént, olyannyira, hogy hétvégén megtelt a postaláda). A hibakeresési időnél érdemes alacsonyabbra, például 60 másodpercre beállítani.

3. -Ban Művelet konfigurációja hozzon létre egy értesítő levél sablont, például:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Mindezek %m, %S stb. — makrók, amelyekbe a paraméterünk értékeit behelyettesítjük. Részletesebben le vannak írva a kézikönyv NetXMS.

4. És végül az előző pontokat összevonva be Eseményfeldolgozási szabályzat hozzon létre egy szabályt, amely szerint riasztást hoz létre és levelet küld:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Mentjük a szabályzatot, minden tesztelhető. Az ellenőrzéshez állítsuk magasabbra a küszöböt. A legközelebbi tanúsítványom 723 nap múlva jár le, ellenőrzésre 724-re állítottam, ennek eredményeként a következő riasztást kapjuk:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

és ez az e-mail értesítés:

A tanúsítvány lejárati dátumának figyelése a Windows rendszerben a NetXMS rendszeren

Most már csak ennyi. Természetesen lehetséges lenne műszerfal felállítása és grafikonok készítése, de a tanúsítványok esetében ezek kissé értelmetlenek és unalmas egyenesek lennének, ellentétben például a processzor- vagy memóriaterhelési grafikonokkal. De erről majd máskor.

Forrás: will.com

Hozzászólás