Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Koartlyn waarden wy konfrontearre mei de taak om de jildigensperioade fan sertifikaten op Windows-tsjinners te kontrolearjen. No, hoe't ik oerein kaam nei't de sertifikaten ferskate kearen in pompoen feroare, krekt op 'e tiid doe't de burdige kollega ferantwurdlik foar har fernijing op fakânsje wie. Dêrnei fertochten hy en ik wat en besleaten der oer nei te tinken. Om't wy it NetXMS-monitorsysteem stadichoan ymplementearje, is it de wichtichste en, yn prinsipe, de ienige kandidaat foar dizze taak wurden.

It resultaat waard úteinlik krigen yn 'e folgjende foarm:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

En it proses sels giet troch.

Gean. D'r is gjin ynboude teller foar ferrinnende sertifikaten yn NetXMS, dus jo moatte jo eigen meitsje en skripts brûke om it mei gegevens te leverjen. Fansels, op Powershell, dit is Windows. It skript moat alle sertifikaten yn it bestjoeringssysteem lêze, har ferfaldatum yn dagen fanôf nimme en dit nûmer trochjaan oan NetXMS. Troch syn agent. Dêr sille wy begjinne.

Option ien, ienfâldichste. Krij gewoan it oantal dagen oant de ferfaldatum fan it sertifikaat mei de tichtstbye datum.

Foar de NetXMS-tsjinner om te witten oer it bestean fan ús oanpaste parameter, moat it it ûntfange fan 'e agent. Oars kin dizze parameter net tafoege wurde fanwegen syn ôfwêzigens. Dêrom, yn de agent konfiguraasje triem nxagentd.conf wy foegje in eksterne parameter string neamd HTTPS.CertificateExpireDateSimple, wêryn wy de lansearring fan it skript registrearje:

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

Yn betinken nommen dat it skript wurdt lansearre oer it netwurk, jo moatte ûnthâlde oer Utfiering Belied, en ferjit ek de oare "-NoLogo -NoProfile -NonInteractive", dy't ik wegere haw foar bettere koadelêsberens.

As resultaat sjocht de agentkonfiguraasje der sa út:

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

Hjirnei moatte jo de konfiguraasje bewarje en de agent opnij starte. Jo kinne dit dwaan fanút de NetXMS-konsole: iepenje de konfiguraasje (Konfiguraasjetriem fan agint bewurkje), bewurkje it, útfiere Bewarje en tapasse, as gefolch wêrfan, yn feite, itselde ding sil barre. Lês dan de konfiguraasje opnij (Poll> Konfiguraasje), as jo hielendal net de krêft hawwe om te wachtsjen. Nei dizze stappen moatte jo ús oanpaste parameter tafoegje kinne.

Yn 'e NetXMS-konsole gean nei Konfiguraasje fan gegevenssammeling eksperimintele tsjinner dêr't wy sille tafersjoch op sertifikaten en meitsje in nije parameter dêr (yn 'e takomst, nei konfiguraasje, is it logysk om oerdrage it nei sjabloanen). Selektearje HTTPS.CertificateExpireDateSimple út 'e list, fier in beskriuwing yn mei in dúdlike namme, set it type op Integer en konfigurearje it polling-ynterval. Foar debuggen is it sinlik om it koarter te meitsjen, bygelyks 30 sekonden. Alles is klear, dat is foar no genôch.

Jo kinne kontrolearje ... nee, it is te betiid. No krije wy fansels neat. Gewoan omdat it skript noch net skreaun is. Litte wy dizze weglating korrigearje. It skript sil gewoan in nûmer werjaan, it oantal dagen dat oerbliuwt oant it sertifikaat ferrint. De meast minimale fan alle beskikber. Foarbyld skript:

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
}

It komt sa út:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

723 dagen, hast twa jier noch oant it sertifikaat ferrint. It is logysk, om't ik koartlyn sertifikaten opnij útjûn foar de Exchange-testbank.

It wie in maklike opsje. Wierskynlik, immen sil wêze tefreden mei dit, mar wy woenen mear. Wy sette ússels de taak yn om in list te krijen fan alle sertifikaten op 'e tsjinner, by namme, en foar elk om it oantal oerbleaune dagen te sjen oant it sertifikaat ferrint.

De twadde opsje, wat yngewikkelder.

Wer bewurkje wy de agent konfiguraasje en dêr, ynstee fan de line mei ExternalParameter, skriuwe wy twa oaren:

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

В ExternalList wy krije gewoan in list mei snaren. Yn ús gefal, in list mei snaren mei sertifikaatnammen. Wy krije in list fan dizze rigels mei it skript. List namme - HTTPS.CertificateNames.

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

En al yn Eksterne parameter Wy ynfiere rigen fan 'e ExternalList list, en by de útfier krije wy itselde oantal dagen foar elk. De identifier is de Thumbprint fan it sertifikaat. Tink derom dat HTTPS.CertificateExpireDate in asterisk (*) befettet yn dizze fariant. Dit is nedich sadat it eksterne fariabelen akseptearret, gewoan ús CertificateId.

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

Yn 'e konfiguraasje fan gegevenssammeling fan' e tsjinner meitsje wy in nije parameter. Yn Parameter selektearje wy ús HTTPS.CertificateExpireDate(*) út de list, en (omtinken!) feroarje it asterisk oan {eksimplaar}. Dit wichtige punt lit jo in aparte teller meitsje foar elke eksimplaar (sertifikaat). De rest is ynfolle lykas yn 'e foarige ferzje:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Om wat te hawwen om tellers fan te meitsjen, moatte jo op it ljepblêd Instance Discovery selektearje Agent List út 'e list en yn it List Name fjild ynfiere de namme fan ús ExternalList út it skript - HTTPS.CertificateNames.

Hast klear, wachtsje in bytsje of twinge Poll> Konfiguraasje en Poll> Instance Discovery as it folslein ûnmooglik is om te wachtsjen. As resultaat krije wy al ús sertifikaten mei jildigensperioaden:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Wat hast nedich? No, ja, allinich de wjirm fan perfeksjonisme sjocht dizze ûnnedige Thumbprint yn 'e namme fan' e teller mei tryste eagen en lit my it artikel net ôfmeitsje. Om it te feeden, iepenje de tellereigenskippen opnij en op it ljepblêd Instance Discovery, yn it fjild "Instance discovery filter script" foegje dejinge ta skreaun yn NXSL (NetXMS ynterne taal) skript:

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

dy't Thumbprint sil filterje:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

En om it filtere wer te jaan, feroarje op it ljepblêd Algemien yn it Beskriuwingsfjild CertificateExpireDate: {instance} yn CertificateExpireDate: {instance-name}:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Dat is it, einliks de finish fan KDPV:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Is it net moai?

Alles wat oerbliuwt is warskôgings yn te stellen sadat se per e-post komme as it sertifikaat ferrint.

1. Earst moatte wy in Event Template meitsje om it te aktivearjen as de tellerwearde ôfnimt nei guon drompel dy't wy ynstelle. YN Event Konfiguraasje lit ús twa nije sjabloanen meitsje mei nammen lykas CertificateExpireDate_Threshold_Activate mei warskôgingsstatus:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

en ferlykber CertificateExpireDate_Threshold_Deactivate mei normale status.

2. Gean dan nei de teller eigenskippen en set de drompel op it ljepblêd Tresholds:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

wêr't wy ús oanmakke eveneminten selektearje CertificateExpireDate_Threshold_Activate en CertificateExpireDate_Threshold_Deactivate, set it oantal samples (Samples) op 1 (spesifyk foar dizze teller hat it gjin punt om mear yn te stellen), de wearde is bygelyks 30 (dagen), en, wichtiger, set it evenemint werhelling tiid. Foar sertifikaten yn produksje set ik it ien kear deis yn (86400 sekonden), oars kinne jo fersûpe yn notifikaasjes (wat, trouwens, ien kear bard is, safolle dat de brievebus yn it wykein fol wie). Foar debuggen tiid makket it sin om it leger te setten, bygelyks 60 sekonden.

3.In Aksje Konfiguraasje meitsje in notifikaasjebriefsjabloan, lykas dit:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Al dizze %m, %S, ensfh. - makro's wêryn wearden fan ús parameter sille wurde ferfongen. Se wurde beskreaun yn mear detail yn hantlieding NetXMS.

4. En as lêste, kombinearjen de foarige punten, yn Event Processing Policy meitsje in regel wêryn't in Alarm sil wurde makke en in brief sil ferstjoerd wurde:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Wy bewarje it belied, alles kin wurde hifke. Litte wy de drompel heger ynstelle om te kontrolearjen. Myn tichtstby lizzende sertifikaat ferrint oer 723 dagen, ik set it op 724 om te kontrolearjen. As gefolch krije wy it folgjende alarm:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

en dizze e-postnotifikaasje:

Monitoring fan ferfaldatum fan sertifikaat yn Windows op NetXMS

Dat is no alles wis. It soe fansels mooglik wêze om in dashboard op te setten en grafiken te bouwen, mar foar sertifikaten soene dy wat sinleas en saaie rjochte linen wêze, oars as bygelyks grafiken fan prosessor of ûnthâldlading. Mar, mear oer dit in oare kear.

Boarne: www.habr.com

Add a comment