مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

واجهنا مؤخرًا مهمة مراقبة فترة صلاحية الشهادات على خوادم Windows. حسنًا، كيف نهضت بعد أن تحولت الشهادات إلى يقطينة عدة مرات، في نفس الوقت الذي كان فيه الزميل الملتحي المسؤول عن تجديدها في إجازة. بعد ذلك، شككنا أنا وهو في شيء ما وقررنا التفكير فيه. نظرًا لأننا نقوم بتنفيذ نظام مراقبة NetXMS ببطء، فقد أصبح المرشح الرئيسي والوحيد لهذه المهمة من حيث المبدأ.

وأخيراً تم الحصول على النتيجة بالشكل التالي:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

وتستمر العملية نفسها.

يذهب. لا يوجد عداد مضمن لانتهاء صلاحية الشهادات في NetXMS، لذلك تحتاج إلى إنشاء عداد خاص بك واستخدام البرامج النصية لتزويده بالبيانات. بالطبع، على Powershell، هذا هو Windows. يجب أن يقرأ البرنامج النصي جميع الشهادات الموجودة في نظام التشغيل، ويأخذ تاريخ انتهاء صلاحيتها بعد أيام من هناك، ويمرر هذا الرقم إلى 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: افتح التكوين (تحرير ملف تكوين الوكيل)، وقم بتحريره، ثم قم بتنفيذ الحفظ والتطبيق، ونتيجة لذلك، في الواقع، سيحدث نفس الشيء. ثم أعد قراءة التكوين (استطلاع > التكوين)، إذا لم تكن لديك القوة للانتظار على الإطلاق. بعد هذه الخطوات، يجب أن تكون قادرًا على إضافة المعلمة المخصصة لدينا.

في وحدة تحكم NetXMS، انتقل إلى تكوين جمع البيانات الخادم التجريبي الذي سنقوم بمراقبة الشهادات عليه وإنشاء معلمة جديدة هناك (في المستقبل، بعد التكوين، من المنطقي نقلها إلى القوالب). حدد HTTPS.CertificateExpireDateSimple من القائمة، وأدخل وصفًا باسم واضح، واضبط النوع على عدد صحيح وقم بتكوين الفاصل الزمني للاستقصاء. ولأغراض تصحيح الأخطاء، فمن المنطقي جعلها أقصر، 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
}

اتضح مثل هذا:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على 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.أسماء الشهادات.

البرنامج النصي 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 يحتوي على علامة النجمة (*) في هذا المتغير. يعد هذا ضروريًا حتى يقبل المتغيرات الخارجية، فقط معرف الشهادة الخاص بنا.

البرنامج النصي 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(*) من القائمة، و(انتباه!) قم بتغيير العلامة النجمية إلى {مثال}. ستسمح لك هذه النقطة المهمة بإنشاء عداد منفصل لكل مثيل (شهادة). يتم ملء الباقي كما في الإصدار السابق:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

لكي يكون لديك شيء لإنشاء العدادات منه، في علامة التبويب "اكتشاف المثيلات"، يتعين عليك تحديد قائمة الوكلاء من القائمة وفي حقل "اسم القائمة"، أدخل اسم القائمة الخارجية الخاصة بنا من البرنامج النصي - HTTPS.CertificateNames.

جاهز تقريبًا، انتظر قليلاً أو قم بفرض الاستطلاع > التكوين والاستقصاء > اكتشاف المثيل إذا كان من المستحيل الانتظار تمامًا. ونتيجة لذلك، نحصل على جميع شهاداتنا مع فترات صلاحية:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

ماذا تحتاج؟ حسنًا ، نعم ، فقط دودة الكمال تنظر إلى بصمة الإبهام غير الضرورية باسم العداد بعيون حزينة ولا تسمح لي بإنهاء المقال. لإطعامه، افتح خصائص العداد مرة أخرى وفي علامة التبويب "اكتشاف المثيل"، في حقل "البرنامج النصي لمرشح اكتشاف المثيل"، أضف ما هو مكتوب فيه NXSL (لغة ​​NetXMS الداخلية) البرنامج النصي:

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

والتي سوف تصفية بصمة الإبهام:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

ولعرضها بعد تصفيتها، في علامة التبويب "عام" في حقل "الوصف"، قم بتغيير "تاريخ انتهاء الصلاحية: {instance}" إلى تاريخ انتهاء الشهادة: {اسم المثيل}:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

هذا كل شيء، أخيرًا خط النهاية من KDPV:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

هل هو جمال؟

كل ما تبقى هو إعداد التنبيهات بحيث تصل عبر البريد الإلكتروني عند انتهاء صلاحية الشهادة.

1. نحتاج أولاً إلى إنشاء قالب حدث لتنشيطه عندما تنخفض قيمة العداد إلى حد ما قمنا بتعيينه. في تكوين الحدث لنقم بإنشاء قالبين جديدين بأسماء مثل تاريخ انتهاء الصلاحية_الحد_تنشيط_الشهادة مع حالة التحذير:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

وما شابه تاريخ انتهاء الصلاحية_الحد_تعطيل_الشهادة مع الوضع الطبيعي.

2. بعد ذلك، انتقل إلى خصائص العداد وقم بتعيين الحد في علامة التبويب "الحدود":

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

حيث نختار الأحداث التي تم إنشاؤها: CertifiedExpireDate_Threshold_Activate وCertificateExpireDate_Threshold_Deactivate، وقم بتعيين عدد العينات (Samples) على 1 (خاصة لهذا العداد لا يوجد أي معنى في تعيين المزيد)، والقيمة هي 30 (يومًا)، على سبيل المثال، والأهم من ذلك، تعيين زمن تكرار الحدث. بالنسبة لشهادات الإنتاج، أقوم بتعيينها مرة واحدة يوميًا (86400 ثانية)، وإلا فقد تغرق في الإشعارات (وهو ما حدث بالمناسبة مرة واحدة، لدرجة أن صندوق البريد كان ممتلئًا خلال عطلة نهاية الأسبوع). بالنسبة لوقت تصحيح الأخطاء، فمن المنطقي ضبطه على أقل من 60 ثانية، على سبيل المثال.

3. ال تكوين العمل قم بإنشاء قالب خطاب الإخطار، مثل هذا:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

كل هذه %m، %S، وما إلى ذلك. - وحدات الماكرو التي سيتم استبدال القيم من معلمتنا بها. تم وصفها بمزيد من التفصيل في يدوي NetXMS.

4. وأخيرا، دمج النقاط السابقة في سياسة معالجة الأحداث أنشئ قاعدة يتم بموجبها إنشاء إنذار وإرسال خطاب:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

نحن نحفظ السياسة، ويمكن اختبار كل شيء. دعونا نضبط العتبة أعلى للتحقق. أقرب شهادة لي تنتهي صلاحيتها بعد 723 يومًا، قمت بضبطها على 724 للتحقق، ونتيجة لذلك، نحصل على الإنذار التالي:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

وهذا الإشعار عبر البريد الإلكتروني:

مراقبة تاريخ انتهاء صلاحية الشهادة في Windows على NetXMS

هذا كل شيء مؤكد الآن. سيكون من الممكن، بالطبع، إعداد لوحة معلومات وإنشاء رسوم بيانية، ولكن بالنسبة للشهادات، ستكون هذه خطوطًا مستقيمة مملة بلا معنى إلى حد ما، على عكس الرسوم البيانية الخاصة بالمعالج أو حمل الذاكرة، على سبيل المثال. ولكن، المزيد عن هذا في وقت آخر.

المصدر: www.habr.com

إضافة تعليق