Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Dènyèman nou te fè fas ak travay la nan kontwole peryòd validite sètifika sou Windows serveurs. Oke, ki jan mwen leve apre sètifika yo tounen yon joumou plizyè fwa, nan moman an menm lè kòlèg la bab ki responsab pou renouvèlman yo te an vakans. Apre sa, li menm ak mwen sispèk yon bagay e deside reflechi sou li. Piske n ap aplike sistèm siveyans NetXMS la tou dousman, li te vin kandida prensipal e, an prensip, sèl kandida pou travay sa a.

Finalman, rezilta a te jwenn nan fòm sa a:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Ak pwosesis la li menm ap kontinye.

Ale. Pa gen okenn kontwa entegre pou sètifika ekspire nan NetXMS, kidonk ou bezwen kreye pwòp ou a epi sèvi ak scripts pou bay li done. Natirèlman, sou Powershell, sa a se Windows. Script la ta dwe li tout sètifika yo nan sistèm operasyon an, pran dat ekspirasyon yo nan jou apre sa epi pase nimewo sa a nan NetXMS. Atravè ajan li. Se la nou pral kòmanse.

Opsyon yon sèl, pi senp. Senpleman jwenn kantite jou jiska dat ekspirasyon sètifika a ak dat ki pi pre a.

Pou sèvè NetXMS la konnen egzistans paramèt koutim nou an, li dwe resevwa li nan men ajan an. Sinon, paramèt sa a pa ka ajoute akòz absans li. Se poutèt sa, nan dosye a konfigirasyon ajan nxagentd.conf nou ajoute yon fisèl paramèt ekstèn rele HTTPS.CertificateExpireDateSimple, kote nou anrejistre lansman script la:

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

Lè ou konsidere ke se script la te lanse sou rezo a, ou bezwen sonje sou Règ Egzekisyon, epi tou pa bliye lòt "-NoLogo -NoProfile -NonInteractive", ke mwen omisyon pou pi bon lizibilite kòd.

Kòm yon rezilta, konfigirasyon ajan an sanble yon bagay tankou sa a:

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

Apre sa, ou bezwen sove konfigirasyon an epi rekòmanse ajan an. Ou ka fè sa nan konsole NetXMS la: louvri konfigirasyon an (Edit fichye konfigirasyon ajan an), edite li, egzekite Save&Aplike, kòm yon rezilta, an reyalite, menm bagay la pral rive. Lè sa a, re-li konfigirasyon an (Sòt > Konfigirasyon), si ou pa gen fòs pou tann ditou. Apre etap sa yo, ou ta dwe kapab ajoute paramèt koutim nou an.

Nan konsole NetXMS ale nan Konfigirasyon Koleksyon Done sèvè eksperimantal sou ki nou pral kontwole sètifika ak kreye yon nouvo paramèt la (nan lavni an, apre konfigirasyon, li fè sans yo transfere li nan modèl). Chwazi HTTPS.CertificateExpireDateSimple nan lis la, antre yon Deskripsyon ak yon non klè, mete kalite a nan Integer ak konfigirasyon entèval sondaj la. Pou rezon debogaj, li fè sans pou fè li pi kout, 30 segonn, pou egzanp. Tout bagay pare, sa ase pou kounye a.

Ou ka tcheke... non, li twò bonè. Koulye a, nan kou, nou pa pral jwenn anyen. Senpleman paske script la poko ekri. Ann korije omisyon sa a. Script la pral tou senpleman montre yon nimewo, kantite jou ki rete jiskaske sètifika a ekspire. Pi minim nan tout ki disponib. Egzanp script:

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
}

Li sanble tankou sa a:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

723 jou, prèske dezan rete jiskaske sètifika a ekspire. Li lojik, paske mwen te re-bay sètifika pou ban tès Echanj la dènyèman.

Se te yon opsyon fasil. Pwobableman, yon moun pral satisfè ak sa a, men nou te vle plis. Nou mete tèt nou travay pou jwenn yon lis tout sètifika sou sèvè a, pa non, epi pou chak moun wè kantite jou ki rete jiskaske sètifika a ekspire.

Dezyèm posiblite a, yon ti jan pi konplike.

Ankò nou edite konfigirasyon ajan an epi la, olye pou yo liy lan ak ExternalParameter, nou ekri de lòt:

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

В Externallist nou jis jwenn yon lis fisèl. Nan ka nou an, yon lis fisèl ak non sètifika. Nou pral resevwa yon lis liy sa yo lè l sèvi avèk script la. Non lis - HTTPS.CertificateNames.

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

E deja antre ExternalParameter Nou antre ranje nan lis ExternalList, ak nan pwodiksyon an nou jwenn menm kantite jou pou chak. Idantifyan an se anprent sètifika a. Remake byen ke HTTPS.CertificateExpireDate gen yon asterisk (*) nan variant sa a. Sa nesesè pou li aksepte varyab ekstèn, jis CertificateId nou an.

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

Nan Konfigirasyon Koleksyon Done nan sèvè a, nou kreye yon nouvo paramèt. Nan Paramèt nou chwazi nou an HTTPS.CertificateExpireDate(*) soti nan lis la, epi (atansyon!) chanje asterisk la {egzanp}. Pwen enpòtan sa a pral pèmèt ou kreye yon kontwa separe pou chak egzanp (sètifika). Rès la ranpli tankou nan vèsyon anvan an:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Pou w ka gen yon bagay pou kreye kontè, sou tab la Dekouvèt Enstans ou bezwen chwazi Lis Ajan nan lis la epi nan non lis jaden antre non ExternalList nou an soti nan script la - HTTPS.CertificateNames.

Prèske pare, tann yon ti kras oswa fòse Vòt > Konfigirasyon ak Vòt > Dekouvèt Enstans si li konplètman enposib pou tann. Kòm yon rezilta, nou jwenn tout sètifika nou yo ak peryòd validite:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Kisa ou bezwen? Oke, repons lan se wi, sèlman vè k'ap manje kadav la nan pèfeksyonism gade nan anprint sa a pa nesesè nan non an nan kontwa a ak je tris epi li pa kite m 'fini atik la. Pou nouri li, louvri pwopriyete kontwa yo ankò epi sou tab la Dekouvèt Enstans, nan jaden "Script dekouvèt Enstans filtre", ajoute youn ki ekri nan NXSL (NetXMS lang entèn) script:

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

ki pral filtre Thumbprint:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Epi pou montre li filtre, sou tab Jeneral la nan jaden Deskripsyon, chanje CertificateExpireDate: {instance} pou CertificateExpireDate: {instance-name}:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Sa a li, finalman liy lan fini soti nan KDPV:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Èske se pa bèlte?

Tout sa ki rete se mete alèt yo pou yo rive pa imel lè sètifika a ekspire.

1. Premyèman, nou bezwen kreye yon Modèl Evènman pou aktive li lè valè kontwa an diminye nan kèk papòt nou mete. NAN Konfigirasyon Evènman ann kreye de nouvo modèl ak non tankou CertificateExpireDate_Threshold_Activate ak sitiyasyon avètisman:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

ak menm jan an CertificateExpireDate_Threshold_Deactivate ak estati nòmal.

2. Apre sa, ale nan pwopriyete yo vann san preskripsyon epi mete papòt la sou tab la Tresholds:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

kote nou chwazi evènman nou yo kreye CertificateExpireDate_Threshold_Activate ak CertificateExpireDate_Threshold_Deactivate, mete kantite echantiyon (Samples) a 1 (espesyalman pou kontwa sa a pa gen okenn pwen nan mete plis), valè a se 30 (jou), pou egzanp, epi, sa ki enpòtan, mete tan repetisyon evènman an. Pou sètifika nan pwodiksyon, mwen mete li yon fwa pa jou (86400 segonn), otreman ou ka nwaye nan notifikasyon (ki, nan chemen an, te rive yon fwa, tèlman bagay ke bwat lèt la te plen nan fen semèn nan). Pou tan debogaj, li fè sans pou mete li pi ba, 60 segonn, pou egzanp.

NAN. Nan Aksyon Konfigirasyon kreye yon modèl lèt notifikasyon, tankou sa a:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Tout sa yo %m, %S, elatriye. - makro nan ki valè ki soti nan paramèt nou yo pral ranplase. Yo dekri an plis detay nan manyèl NetXMS.

4. Epi finalman, konbine pwen anvan yo, nan Règleman Pwosesis Evènman kreye yon règ dapre ki pral kreye yon Alam epi yo pral voye yon lèt:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Nou sove politik la, tout bagay ka teste. Ann mete papòt la pi wo pou tcheke. Sètifika ki pi pre mwen an ekspire nan 723 jou, mwen mete l sou 724 pou m tcheke. Kòm rezilta, nou jwenn alam sa a:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

ak notifikasyon imel sa a:

Siveyans dat ekspirasyon sètifika nan Windows sou NetXMS

Sa a tout pou asire w kounye a. Li ta posib, nan kou, yo mete kanpe yon tablodbò ak bati graf, men pou sètifika sa yo ta dwe yon ti jan san sans ak raz liy dwat, kontrèman ak graf nan processeur oswa chaj memwa, pou egzanp. Men, plis sou sa a yon lòt fwa.

Sous: www.habr.com

Add nouvo kòmantè