Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα 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", το οποίο παρέλειψα για καλύτερη αναγνωσιμότητα κώδικα.

Ως αποτέλεσμα, το agent config μοιάζει κάπως έτσι:

#
# 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: ανοίξτε το config (Επεξεργασία αρχείου διαμόρφωσης πράκτορα), επεξεργαστείτε το, εκτελέστε Save&Apply, με αποτέλεσμα, στην πραγματικότητα, να συμβεί το ίδιο. Στη συνέχεια, διαβάστε ξανά τη διαμόρφωση (Poll > Configuration), εάν δεν έχετε τη δύναμη να περιμένετε καθόλου. Μετά από αυτά τα βήματα, θα πρέπει να μπορείτε να προσθέσετε την προσαρμοσμένη παράμετρό μας.

Στην κονσόλα 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
}

Αποδεικνύεται ως εξής:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

723 ημέρες, σχεδόν δύο χρόνια απομένουν μέχρι τη λήξη του πιστοποιητικού. Είναι λογικό, γιατί πρόσφατα εξέδωσα ξανά πιστοποιητικά για τον πάγκο δοκιμών του Exchange.

Ήταν μια εύκολη επιλογή. Μάλλον, κάποιος θα είναι ικανοποιημένος με αυτό, αλλά θέλαμε περισσότερα. Θέτουμε στους εαυτούς μας το καθήκον να λάβουμε μια λίστα με όλα τα πιστοποιητικά στον διακομιστή, ονομαστικά, και για το καθένα να δούμε τον αριθμό των ημερών που απομένουν μέχρι τη λήξη του πιστοποιητικού.

Η δεύτερη επιλογή, κάπως πιο περίπλοκο.

Και πάλι επεξεργαζόμαστε το agent config και εκεί, αντί για τη γραμμή με 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)"
}

Στη Διαμόρφωση συλλογής δεδομένων του διακομιστή, δημιουργούμε μια νέα παράμετρο. Στην Παράμετρος επιλέγουμε το δικό μας HTTPS.CertificateExpireDate(*) από τη λίστα και (προσοχή!) αλλάξτε τον αστερίσκο σε {παράδειγμα}. Αυτό το σημαντικό σημείο θα σας επιτρέψει να δημιουργήσετε έναν ξεχωριστό μετρητή για κάθε περίπτωση (πιστοποιητικό). Τα υπόλοιπα συμπληρώνονται όπως στην προηγούμενη έκδοση:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Για να έχετε κάτι από το οποίο μπορείτε να δημιουργήσετε μετρητές, στην καρτέλα Instance Discovery πρέπει να επιλέξετε Λίστα πράκτορα από τη λίστα και στο πεδίο Όνομα λίστας πληκτρολογήστε το όνομα της Εξωτερικής Λίστας μας από το σενάριο - HTTPS.CertificateNames.

Σχεδόν έτοιμο, περιμένετε λίγο ή αναγκάστε το Poll > Configuration and Poll > Instance Discovery εάν ​​είναι εντελώς αδύνατο να περιμένετε. Ως αποτέλεσμα, λαμβάνουμε όλα τα πιστοποιητικά μας με περιόδους ισχύος:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Τι χρειάζεσαι? Λοιπόν, ναι, μόνο το σκουλήκι της τελειομανίας κοιτάζει με θλιμμένα μάτια αυτό το περιττό αντίχειρα στο όνομα του πάγκου και δεν με αφήνει να τελειώσω το άρθρο. Για να το τροφοδοτήσετε, ανοίξτε ξανά τις ιδιότητες του μετρητή και στην καρτέλα Instance Discovery, στο πεδίο "Σενάριο φίλτρου εντοπισμού παρουσίας", προσθέστε αυτό που είναι γραμμένο σε NXSL Σενάριο (εσωτερική γλώσσα NetXMS):

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

που θα φιλτράρει το Thumbprint:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Και για να το εμφανίσετε φιλτραρισμένο, στην καρτέλα Γενικά στο πεδίο Περιγραφή, αλλάξτε CertificateExpireDate: {instance} σε CertificateExpireDate: {instance-name}:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Αυτό ήταν, επιτέλους η γραμμή τερματισμού από το KDPV:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Είναι ομορφιά;

Το μόνο που μένει είναι να ρυθμίσετε τις ειδοποιήσεις έτσι ώστε να φτάνουν μέσω email όταν λήξει το πιστοποιητικό.

1. Πρώτα πρέπει να δημιουργήσουμε ένα Πρότυπο Συμβάντος για να το ενεργοποιήσουμε όταν η τιμή του μετρητή μειωθεί σε κάποιο όριο που ορίσαμε. ΣΕ Διαμόρφωση συμβάντος Ας δημιουργήσουμε δύο νέα πρότυπα με ονόματα όπως CertificateExpireDate_Threshold_Activate με κατάσταση προειδοποίησης:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

και παρόμοια CertificateExpireDate_Threshold_Deactivate με Κανονική κατάσταση.

2. Στη συνέχεια, μεταβείτε στις ιδιότητες του μετρητή και ορίστε το όριο στην καρτέλα Tresholds:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

όπου επιλέγουμε τα συμβάντα που δημιουργήσαμε CertificateExpireDate_Threshold_Activate και CertificateExpireDate_Threshold_Deactivate, ορίζουμε τον αριθμό των δειγμάτων (Samples) σε 1 (συγκεκριμένα για αυτόν τον μετρητή δεν υπάρχει λόγος να ρυθμίσουμε περισσότερα), η τιμή είναι 30 (ημέρες), για παράδειγμα, και, κυρίως, ορίζουμε ο χρόνος επανάληψης του συμβάντος. Για πιστοποιητικά στην παραγωγή, το ρύθμισα μία φορά την ημέρα (86400 δευτερόλεπτα), διαφορετικά μπορείς να πνιγείς στις ειδοποιήσεις (που, παρεμπιπτόντως, συνέβη μια φορά, τόσο που το γραμματοκιβώτιο ήταν γεμάτο το Σαββατοκύριακο). Για τον χρόνο αποσφαλμάτωσης, είναι λογικό να τον ρυθμίσετε χαμηλότερα, 60 δευτερόλεπτα, για παράδειγμα.

3. Στο Διαμόρφωση δράσης δημιουργήστε ένα πρότυπο επιστολής ειδοποίησης, όπως αυτό:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Όλα αυτά τα %m, %S, κ.λπ. — μακροεντολές στις οποίες θα αντικατασταθούν τιμές από την παράμετρό μας. Περιγράφονται λεπτομερέστερα στο εγχειρίδιο NetXMS.

4. Και τέλος, συνδυάζοντας τα προηγούμενα σημεία, σε Πολιτική επεξεργασίας συμβάντων δημιουργήστε έναν κανόνα σύμφωνα με τον οποίο θα δημιουργηθεί ένας συναγερμός και θα σταλεί μια επιστολή:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Αποθηκεύουμε την πολιτική, όλα μπορούν να δοκιμαστούν. Ας ορίσουμε το όριο υψηλότερο για έλεγχο. Το πλησιέστερο πιστοποιητικό μου λήγει σε 723 ημέρες, το έβαλα στο 724 για έλεγχο. Ως αποτέλεσμα, λαμβάνουμε τον ακόλουθο συναγερμό:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

και αυτή η ειδοποίηση μέσω email:

Παρακολούθηση ημερομηνίας λήξης πιστοποιητικού στα Windows στο NetXMS

Αυτό είναι σίγουρο πλέον. Θα ήταν, φυσικά, δυνατό να δημιουργηθεί ένας πίνακας εργαλείων και να δημιουργηθούν γραφήματα, αλλά για τα πιστοποιητικά αυτά θα ήταν κάπως ανούσια και βαρετά ευθείες γραμμές, σε αντίθεση με τα γραφήματα του επεξεργαστή ή του φορτίου μνήμης, για παράδειγμα. Αλλά, περισσότερα για αυτό κάποια άλλη φορά.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο