Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Viru kuerzem ware mir mat der Aufgab konfrontéiert fir d'Validitéitsperiod vun den Certificaten op Windows Serveren ze iwwerwaachen. Ma, wéi ech opgestan sinn, nodeems d'Zertifikater e puer Mol zu engem Kürbis verwandelt hunn, an der Zäit wou de bäertege Kolleg, deen fir hir Erneierung verantwortlech ass, an der Vakanz war. Duerno hunn hien an ech eppes verdächtegt an hunn decidéiert doriwwer nozedenken. Well mir den NetXMS Iwwerwachungssystem lues a lues ëmsetzen, ass et den Haaptgrond an am Prinzip deen eenzege Kandidat fir dës Aufgab ginn.

D'Resultat gouf endlech an der folgender Form kritt:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

An de Prozess selwer geet weider.

Gitt. Et gëtt keen agebaute Konter fir oflafen Zertifikater an NetXMS, also musst Dir Är eege erstellen a Scripte benotzen fir se mat Daten ze liwweren. Natierlech, op Powershell, ass dëst Windows. De Skript soll all d'Zertifikater am Betribssystem liesen, hiren Verfallsdatum an Deeg vun do huelen an dës Nummer un NetXMS passéieren. Duerch säin Agent. Do fänke mer un.

Optioun eng, am einfachsten. Gitt einfach d'Zuel vun den Deeg bis zum Verfallsdatum vum Zertifika mam nooste Datum.

Fir den NetXMS Server iwwer d'Existenz vun eisem personaliséierte Parameter ze wëssen, muss et vum Agent kréien. Soss kann dëse Parameter net bäigefüügt ginn wéinst sengem Fehlen. Dofir, an der Agent Configuratiounsdatei nxagentd.conf mir dobäi eng extern Parameter String genannt HTTPS.CertificateExpireDateSimple, an deem mir de Start vum Skript registréieren:

ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"

Bedenkt datt de Skript iwwer d'Netzwierk lancéiert gëtt, musst Dir Iech drun erënneren Ausféierung Politik, an och net vergiessen déi aner "-NoLogo -NoProfile -NonInteractive", déi ech fir eng besser Code Liesbarkeet ewechgelooss.

Als Resultat gesäit d'Agentkonfiguratioun sou eppes aus:

#
# 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"

Duerno musst Dir d'Konfiguratioun späicheren an den Agent nei starten. Dir kënnt dat vun der NetXMS Konsole maachen: d'Konfiguratioun opmaachen (Konfiguratiounsdatei vum Agent änneren), editéieren, späicheren & gëllen ausféieren, als Resultat vun deem tatsächlech datselwecht geschitt. Da liest d'Konfiguratioun nach eng Kéier (Poll> Konfiguratioun), wann Dir guer net d'Kraaft hutt fir ze waarden. No dëse Schrëtt sollt Dir fäeg sinn eise personaliséierte Parameter derbäi ze ginn.

An der NetXMS Konsole gitt op Datesammlung Configuratioun experimentellen Server, op deem mir d'Zertifikater iwwerwaachen an do en neie Parameter erstellen (an Zukunft, no der Konfiguratioun, mécht et Sënn fir se op Templates ze transferéieren). Wielt HTTPS.CertificateExpireDateSimple aus der Lëscht, gitt eng Beschreiwung mat engem klore Numm, set den Typ op Integer a konfiguréiert de Pollingintervall. Fir Debugging Zwecker mécht et Sënn fir et méi kuerz ze maachen, zum Beispill 30 Sekonnen. Alles ass prett, dat geet elo duer.

Dir kënnt kontrolléieren ... nee, et ass ze fréi. Elo wäerte mir natierlech näischt kréien. Einfach well de Skript nach net geschriwwe gouf. Loosst eis dës Ofdreiwung korrigéieren. D'Skript weist einfach eng Zuel, d'Zuel vun den Deeg, déi bliwwe sinn bis de Certificat ofleeft. Déi minimal vun all verfügbar. Beispill Skript:

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
}

Et stellt sech sou eraus:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

723 Deeg, bal zwee Joer bleiwen bis de Certificat ofleeft. Et ass logesch, well ech zimmlech viru kuerzem Zertifikater fir d'Exchange Testbank nei ausgestallt hunn.

Et war eng einfach Optioun. Wahrscheinlech wäert een domat zefridden sinn, awer mir wollte méi. Mir setzen eis d'Aufgab fir eng Lëscht vun all Certificaten um Server ze kréien, mam Numm, a fir jidderee fir d'Zuel vun den Deeg ze gesinn, déi bleiwen bis de Certificat ofleeft.

Déi zweet Optioun, bësse méi komplizéiert.

Nach eng Kéier änneren mir d'Agent Config an do, amplaz vun der Linn mat ExternalParameter, schreiwen mir zwee aner:

ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"

В Extern Lëscht mir kréien just eng Lëscht vun Saiten. An eisem Fall eng Lëscht vu Saiten mat Zertifikatnimm. Mir kréien eng Lëscht vun dëse Linnen mam Skript. Lëscht Numm - HTTPS.CertificateNames.

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

A schonn an Extern Parameter Mir aginn Reihen aus der ExternalList Lëscht, a beim Ausgang kréie mir déiselwecht Zuel vun Deeg fir all. Den Identifizéierer ass den Thumbprint vum Zertifika. Notéiert datt HTTPS.CertificateExpireDate an dëser Variant en Asterisk (*) enthält. Dëst ass néideg fir datt et extern Variabelen akzeptéiert, just eis CertificateId.

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

An der Datesammlung Konfiguratioun vum Server erstellen mir en neie Parameter. Am Parameter wielt mir eis HTTPS.CertificateExpireDate(*) aus der Lëscht, an (opgepasst!) Änneren d'Asterisk op {Instanz}. Dëse wichtege Punkt erlaabt Iech eng separat Konter fir all Instanz ze kreéieren (Zertifikat). De Rescht ass ausgefëllt wéi an der viregter Versioun:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Fir eppes ze hunn fir Teller ze kreéieren, op der Instance Discovery Tab musst Dir Agent Lëscht aus der Lëscht auswielen an am Feld Lëscht Numm gitt den Numm vun eiser ExternalList aus dem Skript - HTTPS.CertificateNames.

Bal prett, waart e bëssen oder forcéiere Poll> Configuration and Poll> Instance Discovery wann et komplett onméiglech ass ze waarden. Als Resultat kréie mir all eis Certificaten mat Validitéitsperioden:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Wat brauchs du? Gutt, jo, nëmmen de Wuerm vum Perfektionismus kuckt dësen onnéidege Daumofdrock am Numm vum Comptoir mat traureg Aen a léisst mech den Artikel net fäerdeg maachen. Fir et ze fidderen, öffnen d'Zählereigenschaften nach eng Kéier op an op der Instance Discovery Tab, am Feld "Instance Discovery Filter Script" füügt deen derbäi geschriwwen NXSL (NetXMS intern Sprooch) Skript:

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

deen Thumbprint filtert:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

A fir et gefiltert ze weisen, op der Allgemeng Reiter am Beschreiwungsfeld, änneren CertificateExpireDate: {Instance} op CertificateExpireDate: {instance-name}:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Dat ass et, endlech d'Arrivée vum KDPV:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Schéinheet?

Alles wat bleift ass Alarmer opzestellen sou datt se per E-Mail kommen wann de Certificat ofleeft.

1. Als éischt musse mir eng Event-Schabloun erstellen fir se z'aktivéieren wann de Konterwäert op e puer Schwell erofgeet, dee mir setzen. IN Event Configuratioun loosst eis zwee nei Templates erstellen mat Nimm wéi CertificateExpireDate_Threshold_Activate mat Warnungsstatus:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

an ähnlech CertificateExpireDate_Threshold_Deactivate mat normale Status.

2. Als nächst gitt op d'Zählereigenschaften a setzt d'Schwell op der Tresholds Tab:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

wou mir eis erstallt Eventer CertificateExpireDate_Threshold_Activate an CertificateExpireDate_Threshold_Deactivate auswielen, d'Zuel vun de Proben (Samples) op 1 setzen (spezifesch fir dëse Konter ass et kee Sënn fir méi ze setzen), de Wäert ass 30 (Deeg), zum Beispill, an, wichteg, setzen der Manifestatioun Widderhuelung Zäit. Fir Zertifikater an der Produktioun, hunn ech et eemol am Dag gesat (86400 Sekonnen), soss kënnt Dir an Notifikatiounen erdrénken (wat iwwregens eemol geschitt ass, sou vill datt d'Mailbox iwwer de Weekend voll war). Fir Debugging Zäit mécht et Sënn fir et méi niddereg ze setzen, zum Beispill 60 Sekonnen.

3. An der Aktioun Configuratioun eng Notifikatiounsbréif Schabloun erstellen, sou:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

All dës %m, %S, etc. - Makroen an deenen Wäerter vun eisem Parameter ersat ginn. Si ginn am Detail beschriwwen manuell NetXMS.

4. A schlussendlech, kombinéiert déi virdrun Punkten, an Event Veraarbechtung Politik eng Regel erstellen no där en Alarm erstallt gëtt an e Bréif geschéckt gëtt:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Mir retten d'Politik, alles kann getest ginn. Loosst eis d'Schwell méi héich setzen fir ze kontrolléieren. Mäin noosten Zertifika leeft a 723 Deeg of, ech hunn et op 724 gesat fir ze kontrolléieren.Als Resultat kréie mir de folgenden Alarm:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

an dës E-Mail Notifikatioun:

Iwwerwachung Zertifikat Verfallsdatum am Windows op NetXMS

Dat ass elo alles sécher. Et wier méiglech, natierlech, en Dashboard opzestellen a Grafiken ze bauen, awer fir Certificaten wieren dës e bëssen sënnlos a langweileg riicht Linnen, am Géigesaz zu Grafike vum Prozessor oder Erënnerungslaascht, zum Beispill. Awer, méi iwwer dëst eng aner Kéier.

Source: will.com

Setzt e Commentaire