نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

اخیراً ما با وظیفه نظارت بر مدت اعتبار گواهینامه ها در سرورهای ویندوز روبرو بودیم. خوب، چگونه پس از چندین بار تبدیل شدن گواهینامه ها به کدو تنبل، درست در زمانی که همکار ریشو مسئول تمدید آنها در تعطیلات بود، بلند شدم. بعد از آن من و او به چیزی مشکوک شدیم و تصمیم گرفتیم در مورد آن فکر کنیم. از آنجایی که ما به آرامی در حال پیاده سازی سیستم مانیتورینگ NetXMS هستیم، این سیستم به اصلی ترین و در اصل تنها نامزد برای این کار تبدیل شده است.

در نهایت نتیجه به شکل زیر بدست آمد:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

و خود این روند ادامه دارد.

برو هیچ شمارنده داخلی برای گواهی های در حال انقضا در NetXMS وجود ندارد، بنابراین باید خود را بسازید و از اسکریپت هایی برای ارائه داده ها استفاده کنید. البته در پاورشل این ویندوز است. اسکریپت باید تمام گواهینامه های سیستم عامل را بخواند، تاریخ انقضای آنها را در چند روز از آنجا گرفته و این شماره را به NetXMS ارسال کند. از طریق نماینده اش. از آنجا شروع خواهیم کرد.

گزینه اول، ساده ترین به سادگی تعداد روزهای تا تاریخ انقضای گواهی را با نزدیکترین تاریخ دریافت کنید.

برای اینکه سرور 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 انجام دهید: پیکربندی (فایل پیکربندی عامل ویرایش) را باز کنید، آن را ویرایش کنید، 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

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

در پیکربندی Data Collection سرور، یک پارامتر جدید ایجاد می کنیم. در Parameter ما خود را انتخاب می کنیم HTTPS.CertificateExpireDate(*) از لیست، و (توجه!) ستاره را به تغییر دهید {نمونه، مثال}. این نکته مهم به شما این امکان را می دهد که برای هر نمونه (گواهی) یک شمارنده جداگانه ایجاد کنید. بقیه موارد مانند نسخه قبلی پر شده است:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

برای اینکه چیزی برای ایجاد شمارنده داشته باشید، در تب Instance Discovery باید Agent List را از لیست انتخاب کنید و در قسمت List Name نام ExternalList خود را از اسکریپت وارد کنید - HTTPS.CertificateNames.

تقریباً آماده است، کمی صبر کنید یا اگر منتظر ماندن کاملاً غیرممکن است، Poll > Configuration and Poll > Instance Discovery را مجبور کنید. در نتیجه، ما تمام گواهی های خود را با دوره های اعتبار دریافت می کنیم:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

چه چیزی نیاز دارید؟ خوب، بله، فقط کرم کمال گرایی با چشمانی غمگین به این اثر انگشت غیرضروری به نام پیشخوان نگاه می کند و نمی گذارد مقاله را تمام کنم. برای تغذیه آن، ویژگی های شمارنده را دوباره باز کنید و در تب Instance Discovery، در قسمت «اسکریپت فیلتر اکتشاف نمونه»، موردی را که در آن نوشته شده است اضافه کنید. NXSL اسکریپت (زبان داخلی NetXMS):

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

که Thumbprint را فیلتر می کند:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

و برای نمایش فیلتر شده، در تب General در قسمت Description، CertificateExpireDate: {instance} را به تغییر دهید CertificateExpireDate: {instance-name}:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

تمام، سرانجام خط پایان از KDPV:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

آیا زیبایی است؟

تنها چیزی که باقی می‌ماند این است که هشدارها را تنظیم کنید تا زمانی که گواهی منقضی می‌شود از طریق ایمیل ارسال شوند.

1. ابتدا باید یک Event Template ایجاد کنیم تا زمانی که مقدار شمارنده به آستانه ای که تعیین کرده ایم کاهش یابد، آن را فعال کنیم. که در پیکربندی رویداد بیایید دو قالب جدید با نام هایی مانند ایجاد کنیم CertificateExpireDate_Threshold_Activate با وضعیت هشدار:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

و مشابه CertificateExpireDate_Threshold_Deactivate با وضعیت عادی

2. سپس، به خواص شمارنده بروید و آستانه را در تب Tresholds تنظیم کنید:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

در جایی که رویدادهای ایجاد شده خود را انتخاب می کنیم CertificateExpireDate_Threshold_Activate و CertificateExpireDate_Threshold_Deactivate، تعداد نمونه ها (Samples) را روی 1 تنظیم می کنیم (مخصوصاً برای این شمارنده هیچ فایده ای برای تنظیم بیشتر ندارد)، مقدار به عنوان مثال 30 (روز) است، و مهمتر از همه، تنظیم کنید. زمان تکرار رویداد برای گواهی های در حال تولید، من آن را یک بار در روز (86400 ثانیه) تنظیم کردم، در غیر این صورت می توانید در اعلان ها غرق شوید (که اتفاقاً یک بار اتفاق افتاد، به طوری که صندوق پستی در آخر هفته پر شد). برای زمان رفع اشکال، منطقی است که آن را کمتر، مثلاً 60 ثانیه تنظیم کنید.

3. در پیکربندی عمل یک الگوی نامه اعلان ایجاد کنید، مانند این:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

همه این %m، %S، و غیره - ماکروهایی که مقادیر پارامتر ما جایگزین می شوند. آنها با جزئیات بیشتر در توضیح داده شده اند کتابچه راهنمای NetXMS.

4. و در نهایت با ترکیب نکات قبلی به خط مشی پردازش رویداد یک قانون ایجاد کنید که بر اساس آن یک هشدار ایجاد می شود و نامه ای ارسال می شود:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

ما سیاست را ذخیره می کنیم، همه چیز قابل آزمایش است. بیایید آستانه را بالاتر برای بررسی قرار دهیم. نزدیکترین گواهینامه من 723 روز دیگر منقضی می شود، برای بررسی آن را روی 724 تنظیم کردم در نتیجه زنگ زیر را دریافت می کنیم:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

و این اعلان ایمیل:

نظارت بر تاریخ انقضای گواهی در ویندوز در NetXMS

در حال حاضر همه چیز قطعی است. البته امکان راه اندازی داشبورد و ساخت نمودارها وجود دارد، اما برای گواهینامه ها برخلاف نمودارهای پردازنده یا بار حافظه، برای مثال، این خطوط مستقیم بی معنی و خسته کننده خواهند بود. اما، بیشتر در مورد این در زمان دیگری.

منبع: www.habr.com

اضافه کردن نظر