Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Kohët e fundit u përballëm me detyrën e monitorimit të periudhës së vlefshmërisë së certifikatave në serverët Windows. Epo, si u ngrita pasi certifikatat u kthyen në kungull disa herë, pikërisht në kohën kur kolegu mjekër përgjegjës për rinovimin e tyre ishte me pushime. Pas kësaj, ai dhe unë dyshuam për diçka dhe vendosëm të mendonim për të. Duke qenë se ne po zbatojmë ngadalë sistemin e monitorimit NetXMS, ai është bërë kandidati kryesor dhe, në parim, i vetmi për këtë detyrë.

Më në fund, rezultati u mor në formën e mëposhtme:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Dhe vetë procesi vazhdon.

Shkoni. Nuk ka numërues të integruar për certifikatat që skadojnë në NetXMS, kështu që ju duhet të krijoni tuajin dhe të përdorni skriptet për t'i dhënë të dhëna. Sigurisht, në Powershell, ky është Windows. Skripti duhet të lexojë të gjitha certifikatat në sistemin operativ, të marrë datën e skadimit të tyre në ditë që andej dhe t'ia kalojë këtë numër NetXMS. Përmes agjentit të tij. Këtu do të fillojmë.

Një opsion, më e thjeshta. Thjesht merrni numrin e ditëve deri në datën e skadimit të certifikatës me datën më të afërt.

Që serveri NetXMS të dijë për ekzistencën e parametrit tonë të personalizuar, duhet ta marrë atë nga agjenti. Përndryshe, ky parametër nuk mund të shtohet për shkak të mungesës së tij. Prandaj, në skedarin e konfigurimit të agjentit nxagentd.konf shtojmë një varg parametrash të jashtëm të quajtur HTTPS.CertificateExpireDateSimple, në të cilën ne regjistrojmë nisjen e skenarit:

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

Duke pasur parasysh që skenari është nisur përmes rrjetit, duhet të mbani mend Politika e Ekzekutimit, dhe gjithashtu mos harroni "-NoLogo -NoProfile -NonInteractive" tjetër, të cilin e hoqa për lexueshmëri më të mirë të kodit.

Si rezultat, konfigurimi i agjentit duket diçka si kjo:

#
# 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. Ju mund ta bëni këtë nga tastiera NetXMS: hapni konfigurimin (Redaktoni skedarin e konfigurimit të agjentit), modifikoni atë, ekzekutoni Save&Apply, si rezultat i së cilës, në fakt, do të ndodhë e njëjta gjë. Më pas rilexoni konfigurimin (Anndazh > Konfigurimi), nëse nuk keni fuqi të prisni fare. Pas këtyre hapave, duhet të jeni në gjendje të shtoni parametrin tonë të personalizuar.

Në tastierën NetXMS shkoni te Konfigurimi i mbledhjes së të dhënave server eksperimental në të cilin do të monitorojmë certifikatat dhe do të krijojmë një parametër të ri atje (në të ardhmen, pas konfigurimit, ka kuptim ta transferojmë atë në shabllone). Zgjidhni HTTPS.CertificateExpireDateSimple nga lista, futni një përshkrim me një emër të qartë, vendosni llojin në Integer dhe konfiguroni intervalin e votimit. Për qëllime korrigjimi, ka kuptim ta shkurtojmë atë, për shembull 30 sekonda. Gjithçka është gati, mjafton tani për tani.

Mund të kontrolloni... jo, është shumë herët. Tani, sigurisht, nuk do të marrim asgjë. Thjesht sepse skenari nuk është shkruar ende. Le ta korrigjojmë këtë lëshim. Skripti thjesht do të shfaqë një numër, numrin e ditëve të mbetura deri në skadimin e certifikatës. Më minimalja nga të gjitha të disponueshme. Shembull i skenarit:

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
}

Rezulton kështu:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Kanë mbetur edhe 723 ditë, gati dy vjet deri në skadimin e certifikatës. Është logjike, sepse kohët e fundit kam rilëshuar çertifikata për stolin e testimit të Exchange.

Ishte një opsion i lehtë. Ndoshta dikush do të jetë i kënaqur me këtë, por ne donim më shumë. Ne i vendosëm vetes detyrën për të marrë një listë të të gjitha certifikatave në server, me emër, dhe që secili të shikojë numrin e ditëve të mbetura deri në skadimin e certifikatës.

Mundësia e dytë, disi më e ndërlikuar.

Përsëri modifikojmë konfigurimin e agjentit dhe atje, 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"

В Lista e jashtme ne thjesht marrim një listë të vargjeve. Në rastin tonë, një listë vargjesh me emra certifikatash. Ne do të marrim një listë të këtyre rreshtave duke përdorur skriptin. Emri i listës - HTTPS.Emrat e certifikatave.

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ë Parametri i jashtëm Ne futim rreshta nga lista ExternalList, dhe në dalje marrim të njëjtin numër ditësh për secilën. Identifikuesi është shenja e gishtit të certifikatës. Vini re se HTTPS.CertificateExpireDate përmban një yll (*) në ​​këtë variant. Kjo është e nevojshme në mënyrë që të pranojë variabla të jashtëm, vetëm 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, ne krijojmë një parametër të ri. Në Parametri ne zgjedhim tonë HTTPS.Certificate ExpireDate(*) nga lista, dhe (vëmendje!) ndryshoni yllin në {shembull}. Kjo pikë e rëndësishme do t'ju lejojë të krijoni një numërues të veçantë për çdo shembull (certifikatë). Pjesa tjetër plotësohet si në versionin e mëparshëm:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Në mënyrë që të keni diçka për të krijuar numërues, në skedën "Zbulimi i shembullit" duhet të zgjidhni Lista e agjentëve nga lista dhe në fushën Emri i listës shkruani emrin e Listës sonë të Jashtme nga skripti - HTTPS.Emrat e certifikatës.

Pothuajse gati, prisni pak ose detyroni Poll > Konfigurimi dhe Sondazhi > Zbulimi i shembullit nëse është plotësisht e pamundur të presësh. Si rezultat, ne marrim të gjitha certifikatat tona me periudha vlefshmërie:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Cfare te nevojitet? Epo, po, vetëm krimbi i perfeksionizmit e shikon me sy të trishtuar këtë gjurmë gishti të panevojshëm në emër të banakut dhe nuk më lë të mbaroj artikullin. Për ta ushqyer atë, hapni përsëri vetitë e numëruesit dhe në skedën "Zbulimi i shembullit", në fushën "Skripti i filtrit të zbulimit të shembullit", shtoni atë të shkruar në NXSL Skripti i gjuhës së brendshme NetXMS:

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

i cili do të filtrojë gjurmën e gishtit:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Dhe për ta shfaqur atë të filtruar, në skedën e Përgjithshme në fushën e Përshkrimi, ndryshoni CertificateExpireDate: {instance} në Certificate ExpireDate: {instance-name}:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Kjo është ajo, më në fund vija e finishit nga KDPV:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

A nuk është bukuria?

Mbetet vetëm për të vendosur sinjalizimet në mënyrë që ato të mbërrijnë me email kur të skadojë certifikata.

1. Së pari duhet të krijojmë një shabllon ngjarjesh për ta aktivizuar atë kur vlera e numëruesit ulet në një prag që kemi vendosur. NË Konfigurimi i ngjarjes le të krijojmë dy shabllone të rinj me emra si CertificateExpireDate_Threshold_Activate me status paralajmërues:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

dhe të ngjashme CertificateExpireDate_Threshold_Deactivate me status normal.

2. Më pas, shkoni te vetitë e numëruesit dhe vendosni pragun në skedën Tresholds:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

ku zgjedhim ngjarjet tona të krijuara CertificateExpireDate_Threshold_Activate dhe CertificateExpireDate_Threshold_Deactivate, vendosim numrin e mostrave (Samples) në 1 (veçanërisht për këtë numërues nuk ka kuptim të vendosësh më shumë), vlera është 30 (ditë), për shembull, dhe, më e rëndësishmja, vendos koha e përsëritjes së ngjarjes. Për certifikatat në prodhim, e vendosa një herë në ditë (86400 sekonda), përndryshe mund të mbytesh në njoftime (që, meqë ra fjala, ndodhi një herë, aq sa kutia postare ishte plot gjatë fundjavës). Për kohën e korrigjimit, ka kuptim ta vendosni atë më të ulët, për shembull 60 sekonda.

3. në Konfigurimi i veprimit krijoni një model letre njoftimi, si kjo:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Të gjitha këto %m, %S, etj. - makro në të cilat do të zëvendësohen vlerat nga parametri ynë. Ato përshkruhen më në detaje në manual NetXMS.

4. Dhe së fundi, duke kombinuar pikat e mëparshme, në Politika e përpunimit të ngjarjeve krijoni një rregull sipas të cilit do të krijohet një alarm dhe do të dërgohet një letër:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Ne ruajmë politikën, gjithçka mund të testohet. Le ta vendosim pragun më të lartë për të kontrolluar. Certifikata ime më e afërt skadon për 723 ditë, e vendosa në 724 për ta kontrolluar. Si rezultat, marrim alarmin e mëposhtëm:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

dhe ky njoftim me email:

Monitorimi i datës së skadimit të certifikatës në Windows në NetXMS

Kjo është e gjitha e sigurt tani. Natyrisht, do të ishte e mundur të vendosni një panel kontrolli dhe të ndërtoni grafikë, por për certifikatat këto do të ishin linja të drejta disi të pakuptimta dhe të mërzitshme, ndryshe nga grafikët e procesorit ose ngarkesës së memories, për shembull. Por, më shumë për këtë herë tjetër.

Burimi: www.habr.com

Shto një koment