NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Bu yaxınlarda Windows serverlərində sertifikatların etibarlılıq müddətinə nəzarət etmək vəzifəsi ilə qarşılaşdıq. Yaxşı, sertifikatlar bir neçə dəfə balqabağa çevrildikdən sonra necə ayağa qalxdım, onların yenilənməsinə cavabdeh olan saqqallı həmkarımın tətildə olduğu bir vaxtda. Bundan sonra o və mən nədənsə şübhələndik və bu barədə düşünməyə qərar verdik. NetXMS monitorinq sistemini yavaş-yavaş tətbiq etdiyimiz üçün o, bu vəzifə üçün əsas və prinsipcə yeganə namizəd oldu.

Nəticə nəhayət aşağıdakı formada alındı:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Və prosesin özü davam edir.

Get. NetXMS-də müddəti bitən sertifikatlar üçün daxili sayğac yoxdur, ona görə də siz özünüz yaratmalı və onu məlumatlarla təmin etmək üçün skriptlərdən istifadə etməlisiniz. Əlbəttə ki, Powershell-də bu Windows-dur. Skript əməliyyat sistemindəki bütün sertifikatları oxumalı, onların son istifadə tarixini oradan günlərlə götürməli və bu nömrəni NetXMS-ə ötürməlidir. Onun agenti vasitəsilə. Biz burada başlayacağıq.

Seçim biri, ən sadə. Sadəcə olaraq ən yaxın tarixlə sertifikatın bitmə tarixinə qədər olan günlərin sayını əldə edin.

NetXMS serverinin bizim fərdi parametrimizin mövcudluğu haqqında bilməsi üçün onu agentdən almalıdır. Əks halda, bu parametr onun olmaması səbəbindən əlavə edilə bilməz. Buna görə agent konfiqurasiya faylında nxagentd.conf adlı xarici parametr sətirini əlavə edirik HTTPS.CertificateExpireDateSimple, skriptin işə salınmasını qeyd etdiyimiz:

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

Skriptin şəbəkə üzərindən işə salındığını nəzərə alsaq, xatırlamaq lazımdır İcra Siyasəti, və həmçinin kodun daha yaxşı oxunması üçün buraxdığım digər “-NoLogo -NoProfile -NonInteractive”i də unutmayın.

Nəticədə agent konfiqurasiyası belə görünür:

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

Bundan sonra konfiqurasiyanı saxlamalı və agenti yenidən başlatmalısınız. Siz bunu NetXMS konsolundan edə bilərsiniz: konfiqurasiyanı açın (agentin konfiqurasiya faylını redaktə et), onu redaktə edin, Saxla və Tətbiq edin, nəticədə əslində eyni şey baş verəcək. Sonra, ümumiyyətlə gözləməyə gücünüz yoxdursa, konfiqurasiyanı yenidən oxuyun (Sorğu > Konfiqurasiya). Bu addımlardan sonra siz bizim fərdi parametrimizi əlavə edə bilməlisiniz.

NetXMS konsolunda gedin Məlumat Toplama Konfiqurasiyası sertifikatları izləyəcəyimiz və orada yeni bir parametr yaratacağımız eksperimental server (gələcəkdə konfiqurasiyadan sonra onu şablonlara köçürməyin mənası var). Siyahıdan HTTPS.CertificateExpireDateSimple seçin, aydın adı olan Təsvir daxil edin, növü Tam ədədə təyin edin və səsvermə intervalını konfiqurasiya edin. Sazlama məqsədləri üçün, məsələn, 30 saniyəni qısaltmağın mənası var. Hər şey hazırdır, hələlik kifayətdir.

Yoxlaya bilərsiniz... yox, hələ tezdir. İndi, əlbəttə, heç nə əldə etməyəcəyik. Sadəcə ona görə ki, ssenari hələ yazılmayıb. Gəlin bu səhvi düzəldək. Skript sadəcə bir nömrə göstərəcək, sertifikatın müddəti bitənə qədər qalan günlərin sayı. Mövcud olanların ən minimalı. Nümunə 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
}

Bu belə çıxır:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Sertifikatın bitməsinə 723 gün, demək olar ki, iki il qalıb. Bu məntiqlidir, çünki mən bu yaxınlarda Exchange test masası üçün sertifikatları yenidən verdim.

Asan variantdı. Yəqin ki, kimsə bununla kifayətlənəcək, amma biz daha çox istəyirdik. Biz özümüzə serverdəki bütün sertifikatların siyahısını adla və hər biri üçün sertifikatın müddəti bitənə qədər qalan günlərin sayını görmək vəzifəsini qoyduq.

İkinci seçim, bir qədər daha mürəkkəbdir.

Yenə agent konfiqurasiyasını redaktə edirik və orada ExternalParameter ilə sətir əvəzinə daha ikisini yazırıq:

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

В Xarici Siyahı biz sadəcə sətirlərin siyahısını alırıq. Bizim vəziyyətimizdə sertifikat adları olan sətirlərin siyahısı. Skriptdən istifadə edərək bu sətirlərin siyahısını alacağıq. Siyahı adı - 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)"
    }
}

Və artıq daxil Xarici Parametr ExternalList siyahısından sətirləri daxil edirik və çıxışda hər biri üçün eyni sayda gün alırıq. İdentifikator sertifikatın Baş barmağıdır. Qeyd edək ki, HTTPS.CertificateExpireDate bu variantda ulduz işarəsini (*) ehtiva edir. Bu, xarici dəyişənləri qəbul etməsi üçün lazımdır, sadəcə bizim 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)"
}

Serverin Məlumat Toplama Konfiqurasiyasında yeni parametr yaradırıq. Parametrdə biz özümüzü seçirik HTTPS.CertificateExpireDate(*) siyahıdan seçin və (diqqət!) ulduz işarəsini dəyişdirin {nümunə}. Bu vacib məqam hər bir instansiya (sertifikat) üçün ayrıca sayğac yaratmağa imkan verəcək. Qalanları əvvəlki versiyada olduğu kimi doldurulur:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Sayğac yaratmaq üçün bir şeyə sahib olmaq üçün Nümunələrin Kəşf edilməsi sekmesinde siyahıdan Agent Siyahısını seçməlisiniz və Siyahı Adı sahəsinə skriptdən Xarici Siyahımızın adını daxil etməlisiniz - HTTPS.SertifikatAdları.

Demək olar ki, hazırdır, bir az gözləyin və ya gözləmək tamamilə mümkün deyilsə, Sorğu > Konfiqurasiya və Sorğu > Nümunə Kəşfini məcbur edin. Nəticədə, etibarlılıq müddəti olan bütün sertifikatlarımızı alırıq:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

sənə nə lazımdır? Hə, bəli, ancaq mükəmməllik qurdu piştaxta adındakı bu lazımsız Baş barmaq izinə kədərli gözlərlə baxır və yazını bitirməyə imkan vermir. Onu qidalandırmaq üçün sayğac xüsusiyyətlərini yenidən açın və Nümunə Kəşf tabında, “Nümunə kəşfi filtri skripti” sahəsində yazılanı əlavə edin. NXSL (NetXMS daxili dili) skripti:

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

Baş barmaq izini süzəcək:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Və onu süzülmüş şəkildə göstərmək üçün Təsvir sahəsində Ümumi nişanında CertificateExpireDate: {instance} kimi dəyişin CertificateExpireDate: {instance-name}:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Budur, nəhayət KDPV-dən finiş xətti:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Gözəllik deyilmi?

Qalan yalnız xəbərdarlıqları qurmaqdır ki, sertifikatın müddəti bitdikdə e-poçtla gəlsinlər.

1. Əvvəlcə sayğac dəyəri müəyyən etdiyimiz həddə qədər azaldıqda onu aktivləşdirmək üçün Hadisə Şablonunu yaratmalıyıq. IN Hadisə Konfiqurasiyası kimi adlarla iki yeni şablon yaradaq CertificateExpireDate_Hreshold_Activate Xəbərdarlıq statusu ilə:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

və bənzərdir CertificateExpireDate_Hreshold_Deaktiv Normal statusu ilə.

2. Sonra, sayğac xüsusiyyətlərinə keçin və Hədiyyələr nişanında həddi təyin edin:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

yaradılan hadisələrimizi seçdiyimiz yerdə CertificateExpireDate_Threshold_Activate və CertificateExpireDate_Threshold_Deactivate, nümunələrin (Nümunələrin) sayını 1-ə təyin edin (xüsusilə bu sayğac üçün daha çox təyin etməyin mənası yoxdur), dəyər məsələn, 30 (gün) təşkil edir və ən əsası təyin edin hadisənin təkrarlanma vaxtı. İstehsalda olan sertifikatlar üçün onu gündə bir dəfə (86400 saniyə) təyin etdim, əks halda bildirişlərdə boğula bilərsiniz (yeri gəlmişkən, bir dəfə baş verdi, həftə sonu poçt qutusu dolu idi). Sazlama vaxtı üçün onu daha aşağı, məsələn, 60 saniyə təyin etmək məntiqlidir.

3. Məqalədə: Fəaliyyət konfiqurasiyası belə bir bildiriş məktubu şablonu yaradın:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Bütün bunlar %m, %S və s. — parametrimizdən dəyərlərin əvəz ediləcəyi makrolar. Onlarda daha ətraflı təsvir edilmişdir təlimat NetXMS.

4. Və nəhayət, əvvəlki nöqtələri birləşdirərək, daxil Hadisələrin İşlənməsi Siyasəti Siqnalın yaradılacağı və məktub göndəriləcəyi bir qayda yaradın:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

Siyasəti saxlayırıq, hər şey sınaqdan keçirilə bilər. Yoxlamaq üçün həddi daha yüksək təyin edək. Ən yaxın sertifikatımın müddəti 723 günə bitir, yoxlamaq üçün onu 724-ə təyin etdim. Nəticədə aşağıdakı həyəcan siqnalı alırıq:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

və bu e-poçt bildirişi:

NetXMS-də Windows-da sertifikatın bitmə tarixinə nəzarət

İndi hər şey əmindir. Əlbəttə ki, tablosunu qurmaq və qrafiklər qurmaq mümkün olardı, lakin sertifikatlar üçün bunlar, məsələn, prosessor və ya yaddaş yükü qrafiklərindən fərqli olaraq bir qədər mənasız və darıxdırıcı düz xətlər olardı. Ancaq bu barədə başqa vaxt.

Mənbə: www.habr.com

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