NetXMS पर विंडोज पर निगरानी प्रमाणपत्र समाप्ति

हाल ही में, हमारे पास विंडोज़ के साथ सर्वरों पर प्रमाणपत्रों की वैधता अवधि की निगरानी का कार्य था। खैर, मैं कैसे उठ गया, कई बार प्रमाणपत्र कद्दू में बदल जाने के बाद, उसी समय जब दाढ़ी वाले सहकर्मी अपने नवीकरण के लिए जिम्मेदार थे, छुट्टी पर थे। उसके बाद, हमने कुछ संदेह किया और इसके बारे में सोचने का फैसला किया। चूंकि हम धीरे-धीरे नेटएक्सएमएस निगरानी प्रणाली की शुरुआत कर रहे हैं, यह मुख्य और सिद्धांत रूप में, इस कार्य के लिए एकमात्र उम्मीदवार बन गया है।

परिणाम अंततः प्राप्त किया गया था:



और प्रक्रिया ही आगे है।

चलो चलते हैं। नेटएक्सएमएस में प्रमाण पत्र को समाप्त करने के लिए कोई अंतर्निहित काउंटर नहीं है, इसलिए आपको डेटा के साथ प्रदान करने के लिए अपनी खुद की बनाने और स्क्रिप्ट का उपयोग करने की आवश्यकता है। बेशक, पॉवर्सशेल पर, यह विंडोज है। स्क्रिप्ट को ऑपरेटिंग सिस्टम के सभी प्रमाणपत्रों को पढ़ना चाहिए, वहां से दिनों में समाप्ति तिथि लेनी चाहिए और इस नंबर को नेटएक्सएमएस पर स्थानांतरित करना चाहिए। उसके एजेंट के माध्यम से। उसके साथ शुरू करते हैं

विकल्प एक , सबसे आसान। प्रमाण पत्र की समयावधि समाप्त होने से पहले बस दिनों की संख्या प्राप्त करें।

नेटएक्सएमएस सर्वर के लिए हमारे कस्टम पैरामीटर के अस्तित्व के बारे में जानने के लिए, इसे एजेंट से प्राप्त करना होगा। अन्यथा, इस पैरामीटर को इसकी अनुपस्थिति के कारण नहीं जोड़ा जा सकता है। इसलिए, nxagentd.conf एजेंट कॉन्फ़िगरेशन फ़ाइल में, हम HTTPS.CertificateExpireDateSimple नाम के साथ एक बाहरी पैरामीटर लाइन जोड़ते हैं , जिसमें हम चलाने के लिए स्क्रिप्ट लिखते हैं:

ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "\\server\share\NetXMS_CertExpireDateSimple.ps1" 

यह देखते हुए कि स्क्रिप्ट नेटवर्क पर चलती है, आपको निष्पादन नीति के बारे में नहीं भूलना चाहिए, और दूसरे "-NLLogo -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" 

उसके बाद, आपको कॉन्फ़िगरेशन को बचाने और एजेंट को पुनरारंभ करने की आवश्यकता है। आप इसे नेटएक्सएमएस कंसोल से कर सकते हैं: कॉन्फ़िगरेशन खोलें (एजेंट की कंफ्यूजन फ़ाइल को संपादित करें), संपादित करें, सहेजें और लागू करें, जिसके परिणामस्वरूप, वास्तव में, एक ही बात होगी। फिर कॉन्फ़िगरेशन (पोल> कॉन्फ़िगरेशन) को फिर से पढ़ें, अगर प्रतीक्षा करने के लिए बिल्कुल ताकत नहीं है। इन चरणों के बाद, आपको हमारे कस्टम पैरामीटर को जोड़ने में सक्षम होना चाहिए।

नेटएक्सएमएस कंसोल में, हम प्रयोगात्मक सर्वर के डेटा संग्रह कॉन्फ़िगरेशन पर जाते हैं, जिस पर हम प्रमाण पत्र की निगरानी करने और वहां एक नया पैरामीटर बनाने जा रहे हैं (भविष्य में, स्थापित होने के बाद, यह इसे टेम्पलेट्स में स्थानांतरित करने के लिए समझ में आता है)। हम सूची से 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 दिन, लगभग दो और साल। यह तर्कसंगत है, क्योंकि मैंने हाल ही में एक्सचेंज पर परीक्षण किए गए प्रमाणपत्रों पर फिर से हस्ताक्षर किए हैं।

यह एक आसान विकल्प था। शायद कोई इससे खुश होगा, लेकिन हम और चाहते थे। हम सर्वर पर सभी प्रमाणपत्रों की एक सूची प्राप्त करने का कार्य स्वयं निर्धारित करते हैं, नाम से, और प्रत्येक के लिए प्रमाण पत्र की अवधि समाप्त होने तक शेष दिनों की संख्या देखना।

दूसरा विकल्प , थोड़ा और अधिक जटिल।

फिर से हम एजेंट कॉन्फिगर को एडिट करते हैं और एक्सट्रपैरमीटर के साथ लाइन के बजाय हम दो अन्य लिखते हैं:

 ExternalList = HTTPS.CertificateNames: powershell.exe -File "\\server\share\netxms_CertExternalNames.ps1" ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "\\server\share\netxms_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:\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)" } } 

और पहले से ही बाह्यप्रमाण में हम बाहरी सूची से लाइनें फ़ीड करते हैं, और आउटपुट पर हमें प्रत्येक के लिए समान दिन मिलते हैं। पहचानकर्ता थम्बप्रिंट प्रमाण पत्र है। कृपया ध्यान दें कि इस विकल्प में 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:\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।

लगभग तैयार, थोड़ी प्रतीक्षा करें या पोल> कॉन्फ़िगरेशन और पोल> इंस्टेंस डिस्कवरी को मजबूर करें, अगर प्रतीक्षा करना पूरी तरह से असंभव है। परिणामस्वरूप, हमें समाप्ति तिथि के साथ हमारे सभी प्रमाण पत्र मिलते हैं:



क्या जरूरत है? खैर, हाँ, केवल पूर्णतावाद का एक कीड़ा इस अनावश्यक थम्बप्रिंट को उदास आँखों से काउंटर के नाम से देखता है और लेख को खत्म करने की अनुमति नहीं देता है। उसे खिलाने के लिए, काउंटर गुणों को फिर से खोलें और "इंस्टेंस डिस्कवरी फिल्टर स्क्रिप्ट" फ़ील्ड में इंस्टेंस डिस्कवरी टैब पर NXSL ( NetXMS आंतरिक भाषा) में लिखी गई स्क्रिप्ट जोड़ें:

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

जो थंबप्रिंट को फ़िल्टर करेगा:



और इसे फ़िल्टर करने के लिए विवरण फ़ील्ड में सामान्य टैब पर, प्रमाणपत्रExpireDate बदलें: {उदाहरण} से CertificateExpireDate: {उदाहरण-नाम} :



सब कुछ, अंत में KDPV का अंत:



यह की सुंदरता?

यह अलर्ट को कॉन्फ़िगर करने के लिए बना रहता है ताकि प्रमाणपत्र के तार्किक अंत में समाप्त होने पर वे डाक से पहुंचें।

1. सबसे पहले आपको हमारे द्वारा निर्धारित थ्रेसहोल्ड के काउंटर मूल्य को कम करने के लिए इसे सक्रिय करने के लिए एक ईवेंट टेम्पलेट बनाने की आवश्यकता है। ईवेंट कॉन्फ़िगरेशन में, नामों के साथ दो नए टेम्प्लेट बनाएं, सर्टिफ़िकेट कहें।



और इसी तरह का प्रमाण पत्र ExireDate_Threshold_ सामान्य स्थिति के साथ सक्रिय करें।

2. अगला, काउंटर प्रॉपर्टीज पर जाएं और ट्रेशोल्ड्स टैब पर थ्रेशोल्ड सेट करें:



जहाँ हम अपनी बनाई गई घटनाओं का चयन करते हैं सर्टिफिकेट। ExireDate_Threshold_Activate और CertificateExpireDate_Threshold_Deactivate, माप की संख्या निर्धारित करते हैं (नमूने) 1 (विशेष रूप से, एक विशिष्ट काउंटर स्थापित करने में कोई मतलब नहीं है), मूल्य 30 (दिन) है, उदाहरण के लिए, और, क्या महत्वपूर्ण है, हम घटना की पुनरावृत्ति समय निर्धारित करते हैं। उत्पादन में प्रमाणपत्र के लिए, मैंने इसे दिन में एक बार (86400 सेकंड) सेट किया, अन्यथा आप अलर्ट में डूब सकते हैं (जो, वैसे, एक बार हुआ, और इसके अलावा, मेलबॉक्स सप्ताहांत में पूर्ण था)। डिबगिंग के लिए, उदाहरण के लिए, 60 सेकंड कम सेट करना समझ में आता है।

3. एक्शन कॉन्फ़िगरेशन में, एक अलर्ट संदेश टेम्पलेट बनाएं, जैसे कि:



ये सभी% m,% S इत्यादि। - मैक्रो में हमारे पैरामीटर से मानों को प्रतिस्थापित किया जाएगा। वे नेटएक्सएमएस मैनुअल में अधिक विस्तार से वर्णित हैं।

4. और अंत में, पिछले बिंदुओं को मिलाकर, इवेंट प्रोसेसिंग पॉलिसी में एक नियम बनाया जाता है जिसके द्वारा एक अलार्म बनाया जाएगा और एक संदेश भेजा जाएगा:



हम नीति रखते हैं, हर चीज का परीक्षण किया जा सकता है। सत्यापन के लिए दहलीज को उच्चतर सेट करें। मेरा निकटतम प्रमाणपत्र 723 दिनों में समाप्त हो रहा है, मैंने सत्यापन के लिए 724 निर्धारित किया है। परिणामस्वरूप, हमें निम्नलिखित अलार्म मिलता है:



और ऐसे मेल अलर्ट:



अब बस इतना ही। आप निश्चित रूप से, डैशबोर्ड सेट कर सकते हैं, ग्राफ़ बना सकते हैं, लेकिन प्रमाण पत्र के लिए यह कुछ अर्थहीन और उबाऊ सीधी रेखाएँ होंगी, उदाहरण के लिए सीपीयू या मेमोरी लोडिंग के ग्राफ़ के विपरीत। लेकिन, इसके बारे में किसी और समय।

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


All Articles