NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Վերջերս մենք բախվեցինք Windows սերվերների վրա վկայագրերի վավերականության ժամկետի մոնիտորինգի խնդրին: Դե, ինչպես ես վեր կացա այն բանից հետո, երբ վկայականները մի քանի անգամ վերածվեցին դդմի, հենց այն ժամանակ, երբ նրանց նորացման համար պատասխանատու մորուքավոր գործընկերը արձակուրդում էր։ Դրանից հետո ես ու նա ինչ-որ բան կասկածեցինք ու որոշեցինք մտածել դրա մասին։ Քանի որ մենք կամաց-կամաց ներդրում ենք NetXMS մոնիտորինգի համակարգը, այն դարձել է այս առաջադրանքի հիմնական և, սկզբունքորեն, միակ թեկնածուն:

Արդյունքը վերջապես ստացվեց հետևյալ ձևով.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Եվ գործընթացը ինքնին շարունակվում է։

Գնա։ NetXMS-ում ժամկետանց վկայականների համար ներկառուցված հաշվիչ չկա, այնպես որ դուք պետք է ստեղծեք ձեր սեփականը և օգտագործեք սկրիպտներ՝ դրանք տվյալների տրամադրելու համար: Իհարկե, Powershell-ում սա Windows-ն է: Սկրիպտը պետք է կարդա օպերացիոն համակարգի բոլոր վկայագրերը, այնտեղից վերցնի դրանց պիտանելիության ժամկետը օրերով և փոխանցի այս թիվը NetXMS-ին: Իր գործակալի միջոցով։ Այստեղից կսկսենք:

Option One, ամենապարզ. Պարզապես ստացեք օրերի քանակը մինչև սերտիֆիկատի գործողության ժամկետը մոտակա ամսաթվով:

Որպեսզի NetXMS սերվերը իմանա մեր հատուկ պարամետրի գոյության մասին, այն պետք է ստանա այն գործակալից: Հակառակ դեպքում, այս պարամետրը չի կարող ավելացվել դրա բացակայության պատճառով: Հետևաբար, գործակալի կազմաձևման ֆայլում nxagentd.conf մենք ավելացնում ենք արտաքին պարամետրի տողը, որը կոչվում է HTTPS.CertificateExpireDateSimple, որում գրանցում ենք սցենարի մեկնարկը.

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

Հաշվի առնելով, որ սցենարը գործարկվել է ցանցի միջոցով, դուք պետք է հիշեք դրա մասին Կատարման քաղաքականություն, և նաև մի մոռացեք մյուս «-NoLogo -NoProfile -NonInteractive»-ի մասին, որը ես բաց թողեցի կոդերի ավելի լավ ընթեռնելիության համար:

Արդյունքում, գործակալի կազմաձևը նման է հետևյալին.

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

Դրանից հետո դուք պետք է պահպանեք կազմաձևը և վերագործարկեք գործակալը: Դա կարող եք անել NetXMS կոնսոլից՝ բացեք կոնֆիգը (Edit agent's configuration file), խմբագրեք այն, կատարեք Save&Apply, ինչի արդյունքում, փաստորեն, նույնը տեղի կունենա։ Այնուհետև նորից կարդացեք կոնֆիգուրացիան (Հարցում > Կազմաձևում), եթե ընդհանրապես ուժ չունեք սպասելու: Այս քայլերից հետո դուք պետք է կարողանաք ավելացնել մեր հատուկ պարամետրը:

NetXMS վահանակում գնացեք Տվյալների հավաքագրման կոնֆիգուրացիա փորձարարական սերվեր, որի վրա մենք պատրաստվում ենք վերահսկել վկայագրերը և այնտեղ ստեղծել նոր պարամետր (ապագայում, կազմաձևումից հետո, իմաստ ունի այն փոխանցել կաղապարներին): Ցանկից ընտրեք HTTPS.CertificateExpireDateSimple, մուտքագրեք հստակ անվանումով նկարագրություն, սահմանեք տեսակը Integer և կարգավորեք հարցումների միջակայքը: Վրիպազերծման նպատակների համար իմաստ ունի այն ավելի կարճ դարձնել, օրինակ՝ 30 վայրկյան: Ամեն ինչ պատրաստ է, առայժմ բավական է։

Դուք կարող եք ստուգել... ոչ, դեռ վաղ է: Հիմա, իհարկե, ոչինչ չենք ստանա։ Պարզապես այն պատճառով, որ սցենարը դեռ գրված չէ։ Ուղղենք այս բացթողումը։ Սցենարը պարզապես կցուցադրի մի թիվ՝ վկայագրի ժամկետի ավարտին մնացած օրերի քանակը: Բոլոր հասանելիներից ամենանվազագույնը: Օրինակ սցենար.

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
}

Ստացվում է այսպես.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

723 օր, գրեթե երկու տարի է մնացել վկայագրի ժամկետի ավարտին։ Տրամաբանական է, քանի որ վերջերս ես վերաթողարկեցի հավաստագրերը Exchange թեստային նստարանի համար:

Հեշտ տարբերակ էր։ Հավանաբար ինչ-որ մեկին սրանով կբավարարվի, բայց մենք ավելին էինք ուզում։ Մենք մեզ խնդիր ենք դրել՝ ստանալ սերվերի բոլոր վկայագրերի ցուցակը, ըստ անվանման, և յուրաքանչյուրի համար տեսնել, թե որքան օրեր են մնացել մինչև վկայագրի ժամկետի ավարտը:

Երկրորդ տարբերակը, մի փոքր ավելի բարդ:

Կրկին խմբագրում ենք գործակալի կազմաձևը և այնտեղ, ExternalParameter-ով տողի փոխարեն, գրում ենք ևս երկուսը.

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

В Արտաքին ցուցակ մենք պարզապես ստանում ենք տողերի ցանկը: Մեր դեպքում վկայականների անուններով տողերի ցանկ: Մենք կստանանք այս տողերի ցանկը՝ օգտագործելով սցենարը: Ցուցակի անվանումը - HTTPS.CertificateNames.

Սկրիպտ 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)"
    }
}

Եվ արդեն ներս Արտաքին պարամետր Մենք մուտքագրում ենք տողեր ExternalList ցուցակից, և ելքում մենք ստանում ենք նույն թվով օրեր յուրաքանչյուրի համար: Նույնացուցիչը վկայականի մատնահետքն է: Նկատի ունեցեք, որ HTTPS.CertificateExpireDate-ը պարունակում է աստղանիշ (*) այս տարբերակում: Սա անհրաժեշտ է, որպեսզի այն ընդունի արտաքին փոփոխականները, պարզապես մեր CertificateId-ը:

Սցենար 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)"
}

Սերվերի տվյալների հավաքագրման կոնֆիգուրացիայի մեջ մենք ստեղծում ենք նոր պարամետր: Պարամետրում մենք ընտրում ենք մեր HTTPS.CertificateExpireDate(*) ցուցակից և (ուշադրությո՛ւն) փոխել աստղանիշը {օրինակ}. Այս կարևոր կետը թույլ կտա ստեղծել առանձին հաշվիչ յուրաքանչյուր օրինակի համար (վկայական): Մնացածը լրացվում է ինչպես նախորդ տարբերակում.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Որպեսզի հաշվիչներ ստեղծելու ինչ-որ բան ունենաք, Instance Discovery ներդիրում դուք պետք է ընտրեք Agent List ցանկից և List Name դաշտում մուտքագրեք մեր ExternalList-ի անունը սկրիպտից՝ HTTPS.CertificateNames:

Գրեթե պատրաստ է, մի քիչ սպասեք կամ պարտադրեք Հարցում > Կազմաձևում և հարցում > Օրինակի հայտնաբերում, եթե սպասելն ամբողջովին անհնար է: Արդյունքում մենք ստանում ենք մեր բոլոր վկայականները վավերականության ժամկետներով.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Ինչ է ձեզ պետք: Դե, այո, միայն պերֆեկցիոնիզմի որդն է տխուր աչքերով նայում վաճառասեղանի անվան այս անհարկի Բթամատին ու չի թողնում, որ վերջացնեմ հոդվածը։ Այն կերակրելու համար կրկին բացեք հաշվիչի հատկությունները և «Instance Discovery» ներդիրում «Instance հայտնաբերման ֆիլտրի սցենար» դաշտում ավելացրեք այն, որը գրված է. NXSL (NetXMS ներքին լեզվի) սցենար.

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

որը զտելու է Thumbprint-ը.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Իսկ այն զտված ցուցադրելու համար Նկարագրություն դաշտի Ընդհանուր ներդիրում փոխեք CertificateExpireDate՝ {instance}-ի։ CertificateExpireDate՝ {instance-name}:

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Վերջ, վերջապես KDPV-ի ավարտի գիծը.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Մի՞թե դա գեղեցկություն չէ։

Մնում է միայն կարգավորել ահազանգերը, որպեսզի նրանք հասնեն էլփոստով, երբ վկայագրի ժամկետը լրանա:

1. Սկզբում մենք պետք է ստեղծենք Իրադարձության Կաղապար՝ այն ակտիվացնելու համար, երբ հաշվիչի արժեքը նվազում է մինչև մեր սահմանած որոշ շեմ: IN Իրադարձության կոնֆիգուրացիա եկեք ստեղծենք երկու նոր կաղապարներ՝ նման անուններով CertificateExpireDate_Threshold_Activate Նախազգուշացման կարգավիճակով.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

և նմանատիպ CertificateExpireDate_Threshold_Deactivate նորմալ կարգավիճակով։

2. Հաջորդը, անցեք հաշվիչի հատկություններին և սահմանեք շեմը Tresholds ներդիրում.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

որտեղ մենք ընտրում ենք մեր ստեղծած իրադարձությունները CertificateExpireDate_Threshold_Activate և CertificateExpireDate_Threshold_Deactivate, նմուշների թիվը (Նմուշներ) սահմանում ենք 1-ի (հատկապես այս հաշվիչի համար ավելին սահմանելը իմաստ չունի), արժեքը 30 է (օր), և, ամենակարևորը, սահմանել: իրադարձության կրկնության ժամանակը. Արտադրության մեջ սերտիֆիկատների համար ես այն սահմանել եմ օրը մեկ անգամ (86400 վայրկյան), հակառակ դեպքում կարող եք խեղդվել ծանուցումների մեջ (ինչը, ի դեպ, մեկ անգամ է տեղի ունեցել, այնքան, որ փոստարկղը հանգստյան օրերին լիքն էր): Վրիպազերծման ժամանակի համար իմաստ ունի այն ավելի ցածր դնել, օրինակ՝ 60 վայրկյան:

3. Ի Գործողությունների կոնֆիգուրացիա ստեղծել ծանուցման նամակի ձևանմուշ, այսպես.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Այս բոլորը %m, %S և այլն: — մակրոներ, որոնց մեջ կփոխարինվեն մեր պարամետրի արժեքները: Դրանք ավելի մանրամասն նկարագրված են ձեռնարկ NetXMS.

4. Եվ վերջապես, նախորդ կետերը համադրելով՝ մեջ Միջոցառումների մշակման քաղաքականություն ստեղծել կանոն, ըստ որի կստեղծվի ահազանգ և նամակ կուղարկվի.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Մենք պահպանում ենք քաղաքականությունը, ամեն ինչ կարելի է փորձարկել։ Եկեք ավելի բարձր դնենք շեմը՝ ստուգելու համար։ Իմ մոտակա վկայականի ժամկետը լրանում է 723 օրից, ստուգելու համար դրել եմ 724, արդյունքում ստանում ենք հետևյալ ահազանգը.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

և այս էլփոստի ծանուցումը.

NetXMS-ում Windows-ում վկայագրի գործողության ժամկետի մոնիտորինգ

Դա արդեն հաստատ է: Իհարկե, հնարավոր կլինի տեղադրել վահանակ և կառուցել գրաֆիկներ, բայց վկայագրերի համար դրանք ինչ-որ չափով անիմաստ և ձանձրալի ուղիղ գծեր կլինեն, ի տարբերություն, օրինակ, պրոցեսորի կամ հիշողության բեռնվածության գրաֆիկների: Բայց այս մասին ավելի շատ այլ ժամանակ:

Source: www.habr.com

Добавить комментарий