Supervisió de la data de caducitat del certificat a Windows a NetXMS

Recentment ens hem enfrontat a la tasca de controlar el període de validesa dels certificats als servidors Windows. Bé, com em vaig aixecar després que els certificats es convertissin en carbassa diverses vegades, en el mateix moment en què el company barbut responsable de la seva renovació estava de vacances. Després d'això, ell i jo vam sospitar alguna cosa i vam decidir pensar-hi. Com que a poc a poc anem implementant el sistema de monitorització NetXMS, s'ha convertit en el principal i, en principi, l'únic candidat per a aquesta tasca.

Finalment, el resultat es va obtenir de la forma següent:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

I el procés en si continua.

Vés. No hi ha cap comptador integrat per als certificats caducats a NetXMS, de manera que heu de crear el vostre propi i utilitzar scripts per proporcionar-li dades. Per descomptat, a Powershell, això és Windows. L'script hauria de llegir tots els certificats del sistema operatiu, agafar-ne la data de caducitat en dies i passar aquest número a NetXMS. A través del seu agent. Per aquí començarem.

Opció Un, el més senzill. Només cal obtenir el nombre de dies fins a la data de caducitat del certificat amb la data més propera.

Perquè el servidor NetXMS conegui l'existència del nostre paràmetre personalitzat, l'ha de rebre de l'agent. En cas contrari, aquest paràmetre no es pot afegir per la seva absència. Per tant, al fitxer de configuració de l'agent nxagentd.conf afegim una cadena de paràmetres extern anomenada HTTPS.CertificateExpireDateSimple, en què registrem el llançament del guió:

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

Tenint en compte que l'script es llança a la xarxa, cal recordar-ho Política d'execució, i tampoc oblideu l'altre "-NoLogo -NoProfile -NonInteractive", que vaig ometre per a una millor llegibilitat del codi.

Com a resultat, la configuració de l'agent té un aspecte semblant a això:

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

Després d'això, heu de desar la configuració i reiniciar l'agent. Pots fer-ho des de la consola NetXMS: obriu la configuració (Edita el fitxer de configuració de l'agent), editeu-la, executeu Save&Apply, com a conseqüència de la qual cosa, de fet, passarà el mateix. A continuació, torneu a llegir la configuració (Enquesta > Configuració), si no teniu força per esperar. Després d'aquests passos, hauríeu de poder afegir el nostre paràmetre personalitzat.

A la consola NetXMS aneu a Configuració de la recollida de dades servidor experimental en el qual monitoritzarem els certificats i crear-hi un nou paràmetre (en el futur, després de la configuració, té sentit transferir-lo a plantilles). Seleccioneu HTTPS.CertificateExpireDateSimple de la llista, introduïu una descripció amb un nom clar, definiu el tipus a Enter i configureu l'interval de sondeig. Per a finalitats de depuració, té sentit fer-ho més curt, 30 segons, per exemple. Tot a punt, de moment ja n'hi ha prou.

Podeu comprovar... no, és massa aviat. Ara, és clar, no aconseguirem res. Simplement perquè el guió encara no s'ha escrit. Corregim aquesta omissió. L'script només mostrarà un número, el nombre de dies que queden fins que caduca el certificat. El més mínim de tots disponibles. Exemple de script:

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
}

Resulta així:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

723 dies, falten gairebé dos anys perquè caduqui el certificat. És lògic, perquè recentment vaig tornar a emetre certificats per al banc de proves Exchange.

Era una opció fàcil. Probablement, algú estarà satisfet amb això, però en volíem més. Ens proposem la tasca d'aconseguir una llista de tots els certificats del servidor, per nom, i que cadascú vegi el nombre de dies que falten fins que caduqui el certificat.

La segona opció, una mica més complicat.

De nou editem la configuració de l'agent i allà, en comptes de la línia amb ExternalParameter, escrivim dos més:

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

В Llista externa només obtenim una llista de cadenes. En el nostre cas, una llista de cadenes amb noms de certificat. Rebrem una llista d'aquestes línies mitjançant l'script. Nom de la llista - HTTPS.CertificateNames.

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

I ja dins Paràmetre extern Introduïm files de la llista ExternalList i a la sortida obtenim el mateix nombre de dies per a cadascuna. L'identificador és l'empremta digital del certificat. Tingueu en compte que HTTPS.CertificateExpireDate conté un asterisc (*) en aquesta variant. Això és necessari perquè accepti variables externes, només el nostre CertificateId.

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

A la configuració de recollida de dades del servidor, creem un nou paràmetre. A Paràmetre seleccionem el nostre HTTPS.CertificateExpireDate(*) de la llista i (atenció!) canvieu l'asterisc per {instància}. Aquest punt important us permetrà crear un comptador independent per a cada instància (certificat). La resta s'omple com a la versió anterior:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Per tenir alguna cosa per crear comptadors, a la pestanya Detecció d'instàncies, heu de seleccionar Llista d'agents de la llista i, al camp Nom de la llista, introduïu el nom de la nostra llista externa de l'script: HTTPS.CertificateNames.

Gairebé a punt, espereu una mica o forçau Poll > Configuració i Poll > Instance Discovery si és completament impossible esperar. Com a resultat, obtenim tots els nostres certificats amb períodes de validesa:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Què necessites? Bé, sí, només el cuc del perfeccionisme mira aquesta empremta digital innecessària en nom del taulell amb ulls tristos i no em deixa acabar l'article. Per alimentar-lo, torneu a obrir les propietats del comptador i a la pestanya Detecció d'instàncies, al camp "Script de filtre de descoberta d'instàncies", afegiu l'escriu a NXSL Script (llenguatge intern de NetXMS):

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

que filtrarà l'empremta digital:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

I per mostrar-lo filtrat, a la pestanya General del camp Descripció, canvieu CertificateExpireDate: {instance} per CertificateExpireDate: {instance-name}:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Això és tot, finalment la meta de KDPV:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

No és bellesa?

Només queda configurar alertes perquè arribin per correu electrònic quan caduqui el certificat.

1. Primer hem de crear una Plantilla d'esdeveniment per activar-la quan el valor del comptador disminueixi fins a algun llindar que establim. EN Configuració d'esdeveniments anem a crear dues plantilles noves amb noms com ara CertificateExpireDate_Threshold_Activate amb estat d'avís:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

i similars CertificateExpireDate_Threshold_Desactivate amb estat normal.

2. A continuació, aneu a les propietats del comptador i configureu el llindar a la pestanya Llindars:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

on seleccionem els nostres esdeveniments creats CertificateExpireDate_Threshold_Activate i CertificateExpireDate_Threshold_Deactivate, establim el nombre de mostres (Mostres) a 1 (específicament per a aquest comptador no té sentit establir-ne més), el valor és 30 (dies), per exemple, i, sobretot, establim el temps de repetició de l'esdeveniment. Per als certificats en producció, ho poso un cop al dia (86400 segons), en cas contrari us podeu ofegar en les notificacions (que, per cert, va passar una vegada, tant que la bústia estava plena durant el cap de setmana). Per al temps de depuració, té sentit establir-lo més baix, 60 segons, per exemple.

3. In Configuració de l'acció creeu una plantilla de carta de notificació, com aquesta:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Tots aquests %m, %S, etc. — macros en les quals es substituiran els valors del nostre paràmetre. Es descriuen amb més detall a manual NetXMS.

4. I finalment, combinant els punts anteriors, en Política de processament d'esdeveniments creeu una regla segons la qual es crearà una alarma i s'enviarà una carta:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Guardem la política, tot es pot provar. Anem a establir el llindar més alt per comprovar. El meu certificat més proper caduca en 723 dies, el vaig establir en 724 per comprovar-ho. Com a resultat, ens apareix l'alarma següent:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

i aquesta notificació per correu electrònic:

Supervisió de la data de caducitat del certificat a Windows a NetXMS

Això és tot segur ara. Seria possible, per descomptat, configurar un tauler i construir gràfics, però per als certificats aquestes serien línies rectes una mica sense sentit i avorrides, a diferència dels gràfics de càrrega de processador o memòria, per exemple. Però, més sobre això en un altre moment.

Font: www.habr.com

Afegeix comentari