Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Së fundmi, na u shfaq një detyrë për monitorimin e afatit të skadimit të certifikatave në serverët me Windows. Po si u shfaq, pasqyra e certifikatave që ktheheshin në kunguj disa herë, në atë kohë kur kolegu ynë përgjegjës për rinovimin kishte shkuar me pushime. Pas kësaj, ne dy u dyshuam dhe vendosëm të mendojmë për këtë çështje. Meqë po implementohej ngadalë sistemi i monitorimit NetXMS, ai u bë kandidati kryesor dhe, në parim, i vetmi për këtë detyrë.

Rezultati në fund u arrit në këtë formë:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Dhe procesi i vetë.

Le të fillojmë. Nuk ka një numërues të integruar për skadimin e certifikatave në NetXMS, pra duhet të krijojmë të tonin dhe të përdorim skriptet për t'i siguruar ato të dhëna. Sigurisht, në Powershell, sepse është Windows. Skripti duhet të lexojë të gjitha certifikat e në sistemin operativ, të marrë afatin e skadimit në ditë dhe t'ia përcjellë këtë numër në NetXMS. Përmes agentit të tij. Këtu do të fillojmë.

Opsioni i parë, më i thjeshti. Thjesht të marrim numrin e ditëve deri në skadimin e certifikatës me datën më të afërt.

Për të njohur ekzistencën e parametrave të zakonshëm, serveri NetXMS duhet ta marrë atë nga agjenti. Përndryshe, ky parametr nuk mund të shtohet për shkak të mungesës së tij. Prandaj, në skedarin e konfigurimit të agjentit, nxagentd.conf shtojmë rreshtin e parametrave të jashtëm me emrin HTTPS.CertificateExpireDateSimple, ku shënojmë ekzekutimin e skriptit:

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

Duke marrë parasysh se skripti ekzekutohet përmes rrjetit, mos harroni rregullin e Execution Policy, si dhe mos harroni të tjerë "-NoLogo -NoProfile -NonInteractive", të cilat i kam anashkaluar për të lehtësuar lexueshmërinë e kodit.

Si rezultat, konfigurimi i agjentit duket përllishtu kështu:

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

Pas kësaj, duhet të ruani konfigurimin dhe të rinisni agjentin. Mund ta bëni këtë nga konsola NetXMS: hapni konfigurimin (Edit agent’s confuguration file), redaktoni, kryeni Save&Apply, si rezultat do të ndodhë e njëjta gjë. Më pas, rivlerësoni konfigurimin (Poll > Configuration), nëse nuk keni durim të prisni. Pas këtyre veprimeve, duhet të krijohet mundësia për të shtuar parametrin tonë të zakonshëm.

Në konsolën NetXMS shkojmë në Data Collection Configuration serverin përmbajtja e cila do të monitorohet për certifikata dhe krijojmë atje një parametrë të re (në vazhdim, pas konfigurimit, ka kuptim ta transferojmë në template). Zgjidhni HTTPS.CertificateExpireDateSimple nga lista, shkruani përshkrimin me një emër të qartë, vendosni llojin Integer dhe konfiguroni intervalin e monitorimit. Për periudhën e debug-it, ndoshta ka kuptim ta bëni më të shkurtër, për shembull, 30 sekonda. E gjitha, përfundoi, për tani mjafton.

Mund të kontrollojmë... jo, akoma herët. Tani, natyrisht, nuk do të marrim asgjë. Thjesht sepse skripti ende nuk është shkruar. Le t'i japim fund këtij mungese. Skripti do të japë thjesht një numër, sasinë e ditëve që kanë mbetur deri në skadimin e certifikatës. Më minimale nga të gjitha që ekzistojnë. Shembuj i skriptit:

provo {
    # Merrit të gjitha certifikatat nga depoja e certifikatave
    $lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
     
    # Nëse nuk ka certifikata, kthe "10 vjet"
    if ($lmCertificates.Count -eq 0) { return 3650 }
 
    # Merrni datën e skadencës të të gjitha certifikatave
    $expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
 
    # Merrni datën e skadencës më të afërt nga të gjitha
    $minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
 
    # Konvertoni datën e skadencës më të afërt në numrin e ditëve që kanë mbetur duke e rrounduar poshtë
    $daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
 
    # Kthe vlerën
    return $daysLeft
}
kap { 
    return -1
}

Kështu rezulton:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

723 ditë, deri në skadencën e certifikatës ka akoma pothuajse dy vjet. Logjikisht, sepse certifikatat në serverin e testimit Exchange i kam ribërë krejt së fundi.

Ky ishte një variant i thjeshtë. Ndoshta, dikush mund t'i pranojë kështu, por ne dëshironim më shumë. Detyra që vendosëm për vete ishte të merrnim një listë të gjitha certifikatave në server, me emra, dhe për secilin të shihnim numrin e ditëve që kishin mbetur deri në përfundimin e afatit.

Varianti i dytë, pak më i komplikuar.

Përsëri po e redaktojmë konfigurimin e agjentit dhe aty në vend të rreshtit me ExternalParameter shkruajmë dy të tjera:

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

ExternalList ne marrim thjesht një listë rreshtash. Në rastin tonë, lista e rreshtave me emrat e certifikatave. Këtë listë të rreshtave do ta marrim me skenarin. Emri i listës — HTTPS.CertificateNames.

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

Dhe tashmë në ExternalParameter ne do të japim si input rreshtat nga lista ExternalList, dhe si output do të marrim numrin e ditëve për secilin. Identifikuesi shërben si Thumbprint i certifikatës. Kini parasysh se HTTPS.CertificateExpireDate në këtë variant përmban një yll (*). Kjo është e nevojshme që të pranojnë variablat e jashtme, pikërisht CertificateId tonë.

Skripti 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ë Konfigurimin e Mbledhjes së Të Dhënave të serverit krijojmë një parametr të ri. Në Parameter zgjedhim tonë HTTPS.CertificateExpireDate(*) nga lista, dhe, (vëmendje!) ndryshojmë yllin në {instance}. Ky moment i rëndësishëm do të lejojë krijimin e një numëruesi të veçantë për çdo instancë (certifikat). E gjithë pjesa tjetër plotësohet si në variantin e mëparshëm:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Për të krijuar numruesit, në skedën Instance Discovery duhet të zgjidhni Agent List nga lista dhe në fushën List Name të shkruani emrin e ExternalList tonë nga skripti — HTTPS.CertificateNames.

Gati, presim pak ose e bëjmë me forcë Poll > Configuration dhe Poll > Instance Discovery, nëse e pritni është shumë e vështirë. Si rezultat, marrim të gjitha certifikatat tona me datat e skadimit:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

A është e nevojshme? Po, por një anxhel i perfeksionizmit e sheh këtë Thumbprint të panevojshëm në emrin e numruesit me sy të trishtuar dhe nuk e lejon të përfundoj artikullin. Për ta ushqyer atë, hapim përsëri pronat e numruesit dhe në skedën Instance Discovery në fushën 'Instance discovery filter script' shtojmë skriptin të shkruar në NXSL (gjuha e brendshme e NetXMS) skriptin:

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

i cili do të filtrojë Thumbprint:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Dhe për ta treguar atë të filtruar, në skedën General në fushën Description e ndryshojmë CertificateExpireDate: {instance} në CertificateExpireDate: {instance-name}:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Të gjitha, përfundimisht arritëm në fund të KDPV:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Bukuri, apo jo?

Na mbetet të konfigurojmë njoftimet, që ato të vijnë në e-mail kur afati i certifikatës afrohet në fundin e saj logjik.

1. Së pari duhet të krijojmë një model ngjarjeje (Event Template) për ta aktivizuar atë kur vlera e numëruesit të arrijë një prag të caktuar nga ne. Në Konfigurimin e Ngjarjeve krijojmë dy modele të reja me emra, le të themi CertificateExpireDate_Threshold_Activate me statusin Warning:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

dhe një të ngjashëm CertificateExpireDate_Threshold_Deactivate me statusin Normal.

2. Më pas shkojmë te pronat e numëruesit dhe në tabin Tresholds konfiguroni pragun:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

ku zgjedhim ngjarjet tona të krijuara CertificateExpireDate_Threshold_Activate dhe CertificateExpireDate_Threshold_Deactivate, vendosim numrin e matjeve (Samples) në 1 (përë këtë numërues nuk ka kuptim të vendosim më shumë), vlera në 30 (ditë), për shembull, dhe, çfarë është e rëndësishme, konfiguroni kohën e ripërsëritjes së ngjarjes. Për certifikatat në prodhim, unë vendos një herë në ditë (86400 sekonda), përndryshe mund të mbytem në njoftime (çka, për ta thënë të vërtetën, ndodhi një herë, dhe aq sa mbushej kutia postare për fundjavë). Për kohën e debugging ka kuptim të vendosni më pak, 60 sekonda, për shembull.

3. Në Konfigurimin e Veprimeve krijojmë një model mesazhi njoftimi, si ky:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Të gjitha këto %m, %S etj. — janë makros, ku do të vendosen vlerat nga parametri ynë. Më shumë detaje janë të përshkruara në manualin NetXMS.

4. Dhe, në fund, duke bashkuar pikat e mëparshme, në Politika e Procesimit të Ngjarjeve krijojmë një rregull, sipas të cilit do të krijohet Alarm dhe do të dërgohet një email:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Ruajmë politikën, çka do të thotë se tani mund të testojmë. Do ta vendosim pragun më lartë për testim. Kam një certifikatë që përfundon në 723 ditë; për testim e vendosa në 724. Si rezultat do të marrim një alarm të tillë:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

dhe një njoftim të tillë në email:

Monitorimi i afatit të skadimit të certifikatave në Windows me NetXMS

Tani, sigurisht, është gjithçka. Do të mund të konfiguroni një dashboard, të krijoni grafike, por për certifikatat do të jenë disa vijëza të drejta të mërzitshme dhe pa kuptim, në krahasim me grafikët e ngarkesës së procesorit ose memorjes, për shembull. Por, për këtë do të flasim ndonjëherë tjetër.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster