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

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

تم الحصول على النتيجة في النهاية على النحو التالي:



والعملية نفسها هي أبعد من ذلك.

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

الخيار الأول ، الأسهل. فقط احصل على عدد الأيام قبل انتهاء صلاحية الشهادة مع أقرب تاريخ.

لكي يتعرف خادم NetXMS على وجود المعلمة المخصصة الخاصة بنا ، يجب أن يستلمها من الوكيل. خلاف ذلك ، لا يمكن إضافة هذه المعلمة بسبب غيابها. لذلك ، في ملف تكوين عامل nxagentd.conf ، نضيف سطر معلمة خارجي باسم HTTPS.CertificateExpireDateSimple ، نكتب فيه البرنامج النصي لتشغيله:

ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "\\server\share\NetXMS_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:\NetXMS\etc\nxagentd.conf.d LogFile = {syslog} FileStore = C:\NetXMS\var 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 "\\server\share\NetXMS_CertExpireDateSimple.ps1" 

بعد ذلك ، تحتاج إلى حفظ التكوين وإعادة تشغيل الوكيل. يمكنك القيام بذلك من وحدة التحكم NetXMS: افتح config (ملف تشويش وكيل التعديل) ، وقم بتحرير وتنفيذ حفظ وتطبيق ، ونتيجة لذلك ، سيحدث نفس الشيء في الواقع. ثم أعد قراءة التكوين (Poll> Configuration) ، إذا لم تكن هناك قوة مطلقة للانتظار. بعد هذه الخطوات ، يجب أن تكون قادرًا على إضافة المعلمة المخصصة الخاصة بنا.

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



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

 try { #       $lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:\LocalMachine\My' -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 } 

اتضح مثل هذا:



723 يومًا ، قبل انتهاء صلاحية الشهادة لمدة عامين تقريبًا. هذا منطقي ، لأنني قمت مؤخرًا بتوقيع الشهادات على موقع test Exchange.

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

الخيار الثاني ، أكثر تعقيدا قليلا.

مرة أخرى ، نقوم بتحرير تهيئة agent وهناك بدلاً من السطر مع ExternalParameter نكتب اثنين آخرين:

 ExternalList = HTTPS.CertificateNames: powershell.exe -File "\\server\share\netxms_CertExternalNames.ps1" ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "\\server\share\netxms_CertExternalParameter.ps1" -CertificateId "$1" 

في ExternalList ، نحصل على قائمة من السلاسل. في حالتنا ، قائمة سلاسل مع أسماء الشهادة. قائمة بهذه السطور نحصل عليها. اسم القائمة هو 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:\LocalMachine\My' | 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)" } } 

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



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

جاهز تقريبًا ، انتظر قليلاً أو اضغط على Poll> Configuration and Poll> Instance Discovery ، إذا كان الانتظار مستحيلًا تمامًا. نتيجة لذلك ، نحصل على جميع شهاداتنا مع تواريخ انتهاء الصلاحية:



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

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

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



ولعرضها التي تمت تصفيتها ، في علامة التبويب عام في حقل الوصف ، قم بتغيير CertificateExpireDate: {مثيل} إلى CertificateExpireDate: {مثيل-الاسم} :



كل شيء ، وأخيرا الانتهاء من KDPV :



جمال ذلك؟

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

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



و CertificateExpireDate_Threshold_Deactivate مماثلة مع الحالة العادية.

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



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

3. في "تكوين الإجراء" ، قم بإنشاء قالب رسالة تنبيه ، مثل هذا:



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

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



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



ومثل هذا التنبيه الإلكتروني:



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

Source: https://habr.com/ru/post/ar460193/


All Articles