Supervisión del vencimiento del certificado en Windows en NetXMS

Recientemente, tuvimos la tarea de monitorear el período de validez de los certificados en servidores con Windows. Bueno, cómo me levanté, después de que los certificados se convirtieron en una calabaza varias veces, al mismo tiempo que el colega barbudo responsable de su renovación estaba de vacaciones. Después de eso, sospechamos algo y decidimos pensarlo. Dado que estamos introduciendo lentamente el sistema de monitoreo NetXMS, se ha convertido en el principal y, en principio, el único candidato para esta tarea.

El resultado se obtuvo finalmente de la siguiente manera:



Y el proceso en sí mismo es más allá.

Vamos No hay un contador incorporado para los certificados que caducan en NetXMS, por lo que debe crear los suyos propios y utilizar secuencias de comandos para proporcionarle datos. Por supuesto, en Powershell, es Windows. El script debe leer todos los certificados en el sistema operativo, tomar la fecha de vencimiento en días desde allí y transferir este número a NetXMS. A través de su agente. Comencemos con él.

Opción uno , la más fácil. Simplemente obtenga el número de días antes de que el certificado caduque con la fecha más cercana.

Para que el servidor NetXMS conozca la existencia de nuestro parámetro personalizado, debe recibirlo del agente. De lo contrario, este parámetro no se puede agregar debido a su ausencia. Por lo tanto, en el archivo de configuración del agente nxagentd.conf , agregamos una línea de parámetro externo con el nombre HTTPS.CertificateExpireDateSimple , en el que escribimos el script para ejecutar:

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

Dado que el script se ejecuta en la red, no debe olvidarse de la Política de ejecución , y tampoco debe olvidarse del otro "-NoLogo -NoProfile -NonInteractive", que omití para una mejor legibilidad del código.

Como resultado, la configuración del agente se ve así:

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

Después de eso, debe guardar la configuración y reiniciar el agente. Puede hacerlo desde la consola de NetXMS: abra la configuración (Editar el archivo de confuguración del agente), edite, ejecute Guardar y aplicar, como resultado de lo cual, ocurrirá exactamente lo mismo. Luego, vuelva a leer la configuración (Encuesta> Configuración), si no hay absolutamente ninguna fuerza para esperar. Después de estos pasos, debería poder agregar nuestro parámetro personalizado.

En la consola NetXMS, vamos a la Configuración de recopilación de datos del servidor experimental en el que vamos a monitorear los certificados y crear un nuevo parámetro allí (en el futuro, después de la configuración, tiene sentido transferirlo a las plantillas). Seleccionamos HTTPS.CertificateExpireDateSimple de la lista, ingresamos Descripción con un nombre descriptivo, establecemos el tipo en Integer y establecemos el intervalo de sondeo. No tiene sentido hacerlo demasiado corto para no obstruir la base de datos con información innecesaria, será inconveniente esperar demasiado al verificar. Para los certificados, generalmente configuro 600 segundos. En el momento de la depuración, tiene sentido acortarlo, 30 segundos, por ejemplo:



Todo está listo, el tiempo suficiente. Puedes comprobar ... no, es demasiado temprano. Ahora, por supuesto, no obtendremos nada. Solo porque el guión aún no se ha escrito. Corregimos esta omisión. El script dará solo un número, el número de días restantes hasta que caduque el certificado. El más pequeño de todos disponibles. Script de ejemplo:

 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 } 

Resulta así:



723 días, antes de que el certificado expire por casi dos años más. Es lógico, porque recientemente volví a firmar los certificados en el banco de pruebas de Exchange.

Fue una opción fácil. Probablemente alguien estaría feliz con eso, pero queríamos más. Nos propusimos la tarea de obtener una lista de todos los certificados en el servidor, por nombre, y para cada uno ver el número de días restantes hasta que expire el certificado.

La segunda opción , un poco más complicada.

Nuevamente editamos la configuración del agente y allí, en lugar de la línea con ExternalParameter, escribimos otros dos:

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

En ExternalList obtenemos solo una lista de cadenas. En nuestro caso, una lista de cadenas con nombres de certificados. Una lista de estas líneas nos da el guión. El nombre de la lista es 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:\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)" } } 

Y ya en ExternalParameter alimentamos las líneas de la lista ExternalList, y en la salida obtenemos el mismo número de días para cada una. El identificador es el certificado de huella digital. Tenga en cuenta que HTTPS.CertificateExpireDate en esta opción contiene un asterisco (*). Esto es necesario para que acepte variables externas, solo nuestro 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:\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)" } 

En la Configuración del servidor de recopilación de datos, cree un nuevo parámetro. En Parámetro, seleccione nuestro HTTPS.CertificateExpireDate (*) de la lista y (¡atención!) Cambie el asterisco a {instancia} . Este importante punto le permitirá crear un contador separado para cada instancia (certificado). El resto se completa, como en la versión anterior:



Para que los contadores sean algo para crear, en la pestaña Descubrimiento de instancias, seleccione la Lista de agentes de la lista y en el campo Nombre de la lista ingrese el nombre de nuestra Lista externa del script: HTTPS.CertificateNames.

Casi listo, espere un poco o fuerce Encuesta> Configuración y Encuesta> Descubrimiento de instancias, si es completamente imposible esperar. Como resultado, obtenemos todos nuestros certificados con fechas de vencimiento:



¿Qué se necesita? Bueno, sí, solo un gusano de perfeccionismo mira esta huella digital innecesaria en el nombre del mostrador con ojos tristes y no permite terminar el artículo. Para alimentarlo, abra nuevamente las propiedades del contador y en la pestaña Descubrimiento de instancias en el campo “Script de filtro de descubrimiento de instancias” agregue el script escrito en NXSL ( lenguaje interno de NetXMS ):

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

que filtrará la huella digital:



Y para mostrarlo filtrado, en la pestaña General en el campo Descripción, cambie CertificateExpireDate: {instancia} a CertificateExpireDate: {nombre-instancia} :



Todo, finalmente el final del KDPV :



Belleza?

Queda por configurar las alertas para que lleguen por correo cuando el certificado caduque en su final lógico.

1. Primero debe crear una Plantilla de eventos para activarla cuando disminuya el valor del contador a algún umbral establecido por nosotros. En Configuración de eventos, cree dos nuevas plantillas con nombres, diga CertificateExpireDate_Threshold_Activate con el estado de Advertencia:



y CertificateExpireDate_Threshold_Deactivate con estado normal similar.

2. A continuación, vaya a las propiedades del contador y establezca el umbral en la pestaña Tresholds:



donde seleccionamos nuestros eventos creados CertificateExpireDate_Threshold_Activate y CertificateExpireDate_Threshold_Deactivate, establecemos el número de mediciones (Muestras) 1 (específicamente, no tiene sentido establecer un contador específico), el valor es 30 (días), por ejemplo, y, lo que es importante, establecemos el tiempo de repetición del evento. Para los certificados en producción, lo configuré una vez al día (86400 segundos), de lo contrario puede ahogarse en las alertas (que, por cierto, sucedió una vez, y además, el buzón estuvo lleno durante el fin de semana). Para la depuración, tiene sentido establecer menos, 60 segundos, por ejemplo.

3. En Configuración de acción, cree una plantilla de mensaje de alerta, como esta:



Todos estos% m,% S, etc. - macros en las que se sustituirán los valores de nuestro parámetro. Se describen con más detalle en el manual de NetXMS.

4. Y finalmente, combinando los puntos anteriores, en la Política de procesamiento de eventos, cree una regla mediante la cual se creará una alarma y se enviará un mensaje:



Mantenemos la política, todo se puede probar. Establezca el umbral más alto para la verificación. Mi certificado más cercano caduca en 723 días, configuré 724 para la verificación. Como resultado, recibimos la siguiente alarma:



y tal alerta de correo:



Ahora eso es todo. Podría, por supuesto, configurar un tablero de mandos, construir gráficos, pero para los certificados será algo recto y aburrido, a diferencia de los gráficos de CPU o carga de memoria, por ejemplo. Pero, sobre eso de alguna otra manera.

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


All Articles