Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Lastatempe ni alfrontis la taskon kontroli la validecperiodon de atestiloj en Windows-serviloj. Nu, kiel mi ellitiĝis post kiam la atestiloj plurfoje fariĝis kukurbo, en la sama tempo, kiam la barba kolego respondeca pri ilia renovigo estis ferie. Post tio, li kaj mi suspektis ion kaj decidis pensi pri tio. Ĉar ni malrapide efektivigas la NetXMS-monitorsistemon, ĝi fariĝis la ĉefa kaj, principe, la sola kandidato por ĉi tiu tasko.

La rezulto estis finfine akirita en la sekva formo:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Kaj la procezo mem daŭras.

Iru. Ne ekzistas enkonstruita nombrilo por eksvalidiĝaj atestiloj en NetXMS, do vi devas krei vian propran kaj uzi skriptojn por provizi al ĝi datumojn. Kompreneble, ĉe Powershell, ĉi tio estas Vindozo. La skripto devus legi ĉiujn atestojn en la operaciumo, preni ilian limdaton en tagoj de tie kaj transdoni ĉi tiun numeron al NetXMS. Per lia agento. Jen kie ni komencos.

Opcio Unu, plej simpla. Simple ricevu la nombron da tagoj ĝis la limdato de la atestilo kun la plej proksima dato.

Por ke la servilo NetXMS sciu pri la ekzisto de nia kutima parametro, ĝi devas ricevi ĝin de la agento. Alie, ĉi tiu parametro ne povas esti aldonita pro ĝia foresto. Tial, en la agorda dosiero nxagentd.conf ni aldonas eksteran parametron nomitan HTTPS.CertificateExpireDateSimple, en kiu ni registras la lanĉon de la skripto:

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

Konsiderante ke la skripto estas lanĉita tra la reto, vi devas memori pri Ekzekuta Politiko, kaj ankaŭ ne forgesu la alian "-NoLogo -NoProfile -NonInteractive", kiun mi preterlasis por pli bona kodlegebleco.

Kiel rezulto, la agenta agordo aspektas kiel ĉi tio:

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

Post ĉi tio, vi devas konservi la agordon kaj rekomenci la agenton. Vi povas fari tion de la NetXMS-konzolo: malfermu la agordon (Redakti la agordan dosieron de agento), redakti ĝin, ekzekuti Save&Apliki, rezulte de kio, fakte, okazos la sama afero. Poste relegu la agordon (Enketo > Agordo), se vi tute ne havas la forton atendi. Post ĉi tiuj paŝoj, vi devus povi aldoni nian kutiman parametron.

En la NetXMS-konzolo iru al Datumkolekta Agordo eksperimenta servilo, sur kiu ni kontrolos atestilojn kaj kreos novan parametron tie (en la estonteco, post agordo, estas senco transdoni ĝin al ŝablonoj). Elektu HTTPS.CertificateExpireDateSimple el la listo, enigu Priskribon kun klara nomo, agordu la tipon al Entjero kaj agordu la balotintervalon. Por sencimigaj celoj, estas senco fari ĝin pli mallonga, 30 sekundoj, ekzemple. Ĉio estas preta, tio sufiĉas nuntempe.

Vi povas kontroli... ne, estas tro frue. Nun, kompreneble, ni ricevos nenion. Simple ĉar la skripto ankoraŭ ne estas skribita. Ni korektu ĉi tiun preterlason. La skripto simple montros nombron, la nombron da tagoj restantaj ĝis la atestilo eksvalidiĝos. La plej minimuma el ĉiuj disponeblaj. Ekzempla skripto:

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
}

Ĝi rezultas jene:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

723 tagoj, preskaŭ du jaroj restas ĝis la atestilo eksvalidiĝas. Estas logike, ĉar mi reeldonis atestojn por la Exchange-testbenko sufiĉe lastatempe.

Ĝi estis facila opcio. Verŝajne, iu kontentiĝos pri tio, sed ni volis pli. Ni metas al ni la taskon akiri liston de ĉiuj atestiloj sur la servilo, laŭnome, kaj por ĉiu vidi la nombron da tagoj restantaj ĝis la atestilo eksvalidiĝos.

La dua eblo, iom pli komplika.

Denove ni redaktas la agordan agordon kaj tie, anstataŭ la linio kun ExternalParameter, ni skribas du aliajn:

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

В Ekstera Listo ni nur ricevas liston de ŝnuroj. En nia kazo, listo de ĉenoj kun atestilnomoj. Ni ricevos liston de ĉi tiuj linioj uzante la skripton. Listo nomo - HTTPS.CertificateNames.

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

Kaj jam en EksteraParametro Ni enigas vicojn el la Listo de Eksteraj Listo, kaj ĉe la eligo ni ricevas la saman nombron da tagoj por ĉiu. La identigilo estas la dikfingro de la atestilo. Notu, ke HTTPS.CertificateExpireDate enhavas asteriskon (*) en ĉi tiu varianto. Ĉi tio estas necesa por ke ĝi akceptu eksterajn variablojn, nur nian CertificateId.

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

En la Datuma Kolekta Agordo de la servilo, ni kreas novan parametron. En Parametro ni elektas nian HTTPS.CertificateExpireDate(*) el la listo, kaj (atentu!) ŝanĝu la asteriskon al {instanco}. Ĉi tiu grava punkto permesos al vi krei apartan nombrilon por ĉiu kazo (atestilo). La resto estas plenigita kiel en la antaŭa versio:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Por havi ion por krei nombrilojn, sur la langeto Instance Discovery vi devas elekti Agentliston el la listo kaj en la kampo List Name enigu la nomon de nia ExternalList el la skripto - HTTPS.CertificateNames.

Preskaŭ preta, atendu iomete aŭ devigu Enketon > Agordon kaj Enketon > Instance Discovery se estas tute neeble atendi. Kiel rezulto, ni ricevas ĉiujn niajn atestojn kun validecaj periodoj:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Kion vi bezonas? Nu, jes, nur la vermo de perfektismo rigardas ĉi tiun nenecesan Dikspuron en la nomo de la vendotablo kun malĝojaj okuloj kaj ne lasas min fini la artikolon. Por nutri ĝin, malfermu la nombrilojn denove kaj sur la langeto Instance Discovery, en la kampo "Instance discovery filtri skripto", aldonu tiun skribitan en NXSL (NetXMS interna lingvo) skripto:

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

kiu filtros Thumbprint:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Kaj por montri ĝin filtrita, sur la Ĝenerala langeto en la kampo Priskribo, ŝanĝu CertificateExpireDate: {instance} al CertificateExpireDate: {instance-name}:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Jen ĝi, finfine la cellinio de KDPV:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Ĉu ne estas beleco?

Restas nur agordi atentigojn por ke ili alvenu retpoŝte kiam la atestilo eksvalidiĝas.

1. Unue ni devas krei Eventa Ŝablono por aktivigi ĝin kiam la nombrilo valoro malpliiĝas al iu sojlo ni fiksis. EN Eventa Agordo ni kreu du novajn ŝablonojn kun nomoj kiel CertificateExpireDate_Threshold_Activate kun Averta stato:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

kaj similaj CertificateExpireDate_Threshold_Malaktivigi kun Normala statuso.

2. Poste, iru al la nombrilaj proprietoj kaj starigu la sojlon sur la langeto Sojloj:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

kie ni elektas niajn kreitajn eventojn CertificateExpireDate_Threshold_Activate kaj CertificateExpireDate_Threshold_Deactivate, agordu la nombron da specimenoj (Samples) al 1 (specife por ĉi tiu nombrilo ne utilas agordi pli), la valoro estas 30 (tagoj), ekzemple, kaj, grave, agordu la evento-ripettempo. Por atestiloj en produktado, mi fiksas ĝin unufoje tage (86400 sekundoj), alie vi povas droni en sciigoj (kio, cetere, okazis unufoje, tiel ke la leterkesto estis plena dum la semajnfino). Por sencimiga tempo, estas senco agordi ĝin pli malalta, 60 sekundoj, ekzemple.

3. En Ago-Agordo kreu sciigan letero-ŝablonon, jene:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Ĉiuj ĉi tiuj %m, %S, ktp. - makrooj en kiuj valoroj de nia parametro estos anstataŭigitaj. Ili estas priskribitaj pli detale en manlibro NetXMS.

4. Kaj fine, kombinante la antaŭajn punktojn, en Politiko pri Procesado de Eventoj kreu regulon laŭ kiu Alarmo estos kreita kaj letero estos sendita:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Ni konservas la politikon, ĉio povas esti provita. Ni agordu la sojlon pli altan por kontroli. Mia plej proksima atestilo eksvalidiĝas en 723 tagoj, mi fiksis ĝin por kontroli 724. Rezulte, ni ricevas la jenan alarmon:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

kaj ĉi tiu retpoŝta sciigo:

Monitora atestildato de eksvalidiĝo en Vindozo sur NetXMS

Tio estas ĉio certe nun. Eblus, kompreneble, agordi instrumentpanelon kaj konstrui grafikaĵojn, sed por atestiloj tiuj estus iom sensencaj kaj enuigaj rektaj linioj, male al grafikaĵoj de procesoro aŭ memorŝarĝo, ekzemple. Sed, pli pri ĉi tiu alia fojo.

fonto: www.habr.com

Aldoni komenton