Kohë më parë, na u dha detyra për të monitoruar skadimin e certifikatave në serverat Windows. E thënë ndryshe, pasi që certifikatat disa herë u shndërruan në të pavlerë, në momentin kur kolegu përgjegjës për rinovimin e tyre, që kishte një mjekër, ishte në pushim. Pas kësaj, me të, filluam të dyshonim dhe vendosëm të mendojmë për këtë. Meqenëse po implementohej ngadalë sistemi i monitorimit NetXMS, ai u bë kandidati kryesor dhe, në parim, i vetmi për këtë detyrë.
Rezultati përfundimtar u arrit në këtë formë:

Dhe procesi vazhdon si më poshtë.
Le të fillojmë. Nuk ka një numërues të integruar për skadimin e certifikatave në NetXMS, prandaj duhet të krijojmë tonin dhe të përdorim skriptet për të siguruar të dhënat. Sigurisht, në Powershell, sepse kjo është Windows. Skripti duhet të lexojë të gjitha certifikat e sistemit operativ, të marrë nga ato afatin e skadimit në ditë dhe ta dërgojë këtë numër në NetXMS. Nëpërmjet agjentit të tij. Këtu do të fillojmë.
Varianti i parë, më i thjeshti. Thjesht merrni numrin e ditëve deri në skadimin e certifikatës me datën më të afërt.
Për të bërë që serveri NetXMS të dijë për ekzistencën e parametrave tanë të personalizuar, ai duhet ta marrë atë nga agjenti. Ndryshe, ky parametr nuk do të mundësohet për t'u shtuar, për shkak të mungesës. Prandaj, në skedarin e konfigurimit të agjentit nxagentd.conf ne shtojmë rreshtin e parametrave të jashtëm me emrin HTTPS.CertificateExpireDateSimple, ku e përcaktojmë ekzekutimin e skriptit:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"Duke pasur parasysh që skripti ekzekutohet në rrjet, nuk duhet të harrojmë për , si dhe nuk duhet të harrojmë për "-NoLogo -NoProfile -NonInteractive", të cilat i kam lënë mënjanë për të cilësuar lehtësisht kodin.
Si rezultat, konfigurimi i agjentit duket më pak si ky:
#
# 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ë ristartoni agjentin. Mund ta bëni këtë nga konsola NetXMS: hapni konfigurimin (Edit agent’s configuration file), redaktoni, kryeni Save&Apply, pas së cilës, në fakt, ndodh e njëjta gjë. Pastaj rishikoni konfigurimin (Poll > Configuration), nëse nuk e keni forcën të prisni. Pas këtyre veprimeve, duhet të shfaqet mundësia për të shtuar parametrin tonë të personalizuar.
Në konsolën NetXMS, shkojmë në Konfigurimi i Mbledhjes së Të Dhënave servidori provues, mbi të cilin do të monitorojmë certifikatat dhe aty krijojmë një parameter të ri (më vonë, pas konfigurimit, ka kuptim ta transferojmë në template). Zgjidhim HTTPS.CertificateExpireDateSimple nga lista, shkruajmë përshkrimin me një emër të qartë, vendosim llojin Integer dhe konfiguroni intervalin e kërkimit. Për kohën e debug-it, ka kuptim ta bëjmë më të shkurtër, për shembull, 30 sekonda. E gjithë, gati, për momentin është mjaft.
Mund ta kontrolloni… jo, është ende herët. Tani, padyshim, nuk do të marrim asgjë. Thjesht sepse skripti akoma nuk është shkruar. Po e korrigjojmë këtë mungesë. Skripti do të lëshojë thjesht një numër, numrin e ditëve të mbetuara deri në skadimin e certifikatës. Minimalen nga të gjitha që ekzistojnë. Shembulli i skriptit:
try {
# Marrim të gjitha certifikatat nga depoja e certifikatave
$lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
# Nëse nuk ka certifikatë, kthe "10 vjet"
if ($lmCertificates.Count -eq 0) { return 3650 }
# Marrim datën e skadimit të të gjitha certifikatave
$expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
# Marrim datën e skadimit më të afërt nga të gjitha
$minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
# Konvertojmë datën e skadimit më të afërt në numrin e ditëve të mbetura me përmirësim në katror
$daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
# Kthejmë vlerën
return $daysLeft
}
catch {
return -1
}Kështu, ndodh si vijon:

723 ditë, deri në skadimin e certifikatës ka pothuajse dy vjet. Logjike, sepse certifikatat në Exchange testin, i kam rinovuar shumë kohë më parë.
Ishte një variant i thjeshtë. Ndoshta dikush do ta pranonte edhe një të tillë, por ne donim më shumë. Detyrën që vetë ia vendosëm ishte të merrnim një listë të të gjitha certifikatave në server, emër për emër, dhe që të gjithë të shihnim numrin e ditëve që kanë mbetur deri në skadimin e certifikatës.
Zgjedhja e dytë, pak më të komplikuar.
Përsëri modifikojmë konfigurimin e agjentit dhe aty në vend të linjës 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"Në ExternalList ne marrim thjesht një listë stringash. Në rastin tonë, një listë stringash me emrat e certifikatave. Listën e këtyre stringave do ta marrim me skriptin. 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 japim në hyrje rreshta nga lista ExternalList, dhe në daljen do të kemi po aq ditë për secilin. Identifikuesi është Thumbprint i certifikatës. Vini re se HTTPS.CertificateExpireDate në këtë rast përmban një yll (*). Kjo është e nevojshme për të pranuar variablat e jashtme, siç është CertificateId ynë.
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ë parametër të ri. Në Parametrin seçim: HTTPS.CertificateExpireDate(*) nga lista, dhe, (këtë vëmendje!) e ndryshojmë yllin në {instance}. Ky moment i rëndësishëm do të lejojë të krijojmë një numërues të veçantë për secilën instancë (certifikatën). Të tjerat plotësohen si në variantin e mëparshëm:

Për t'u siguruar që ka nga çfarë të krijohen numëruesit, në skedën Instance Discovery duhet të zgjedhim Agent List nga lista dhe në fushën List Name të shkruajmë emrin e ExternalList nga skripti — HTTPS.CertificateNames.
Gati është, pak pritim ose detyrimisht bëni Poll > Configuration dhe Poll > Instance Discovery, nëse nuk mund të prisni fare. Rezultati është se marrim të gjitha certifikatat tona me datat e skadimit:
A është kjo ajo që ndiheni? Po, vetëm se një nevojë për perfektësi e shikon këtë Thumbprint të panevojshëm në emrin e numëruesit me sytë e trishtuar dhe nuk e lejon të përfundojë artikulli. Për ta ushqyer, hapim përsëri pronësitë e numëruesit dhe në skedën Instance Discovery në fushën "Instance discovery filter script" shtojmë skripti të shkruar në (gjuhën e brendshme të NetXMS):
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;i cili do të filtrojë Thumbprint:

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

Të gjitha, përfundimisht, finishi nga KDPV:
E bukur, apo jo?
Përfundimisht, duhet të konfigurojmë njoftimet për t'i dërguar në email kur afati i certifikatës afrohet përfundimit të saj logjik.
1. Fillimisht, duhet të krijojmë një model ngjarjeje (Event Template) për ta aktivizuar atë kur vlera e numëruesit të bie poshtë një pragu të caktuar nga ne. Në Event Configuration krijojmë dy modele të reja me emra, le të themi CertificateExpireDate_Threshold_Activate me status Warning:

dhe një të ngjashëm CertificateExpireDate_Threshold_Deactivate me status Normal.
2. Më pas, shkojmë te pronësitë e numëruesit dhe në skedën Tresholds konfiguroni pragun:

këtu zgjedhim ndodhitë tona të krijuara CertificateExpireDate_Threshold_Activate dhe CertificateExpireDate_Threshold_Deactivate, vendosim numrin e masave (Samples) 1 (për këtë matës nuk ka kuptim të vendosim më shumë), vlera në 30 (ditë), për shembull, dhe, ç'është e rëndësishme, konfiguroni kohën e përsëritjes së ngjarjes. Për certifikatat në prodhim unë vendos një herë në ditë (86400 sekonda), përndryshe mund të mbushet me njoftime (e cila, btw, ndodhi një herë, në mënyrë që kutia postare u mbush gjatë fundjavës). Në kohën e debugs, ka kuptim të vendosni më pak, 60 sekonda, për shembull.
3. Në Konfigurimin e Veprimit krijojmë një shabllon të emailit të njoftimit, diçka si kjo:

Të gjitha këto %m, %S dhe të tjera — makro, në të cilat do të vendosen vlerat nga parametri ynë. Më shumë informacion është përshkruar në NetXMS.
4. Dhe, përfundimisht, duke bashkuar pikat e mëparshme, në Politikën e Procesimit të Ngjarjeve krijojmë një rregull, sipas të cilit do të krijohet Alarm dhe do të dërgohet email:
Ruajmë politikën, ajo është, mund të testojmë. Do të vendosim një prag më të lartë për testim. Certifikata ime më e afërt skadon pas 723 ditëve, për testim vendosa 724. Si rezultat do të marrim një alarm të tillë:

dhe këtë njoftim në email:

Tani me të vërtetë është gjithçka. Natyrisht, do të mund të konfiguroni një panel, të nd construir grafika, por për certifikatat do të jenë disa linja të drejta të mërzitshme dhe pa kuptim, ndryshe nga grafikat e ngarkesës së procesorit ose memories, për shembull. Megjithatë, për këtë ndonjëherë në një kohë tjetër.
Burimi: habr.com
