Monitorización da data de caducidade do certificado en Windows en NetXMS

Recentemente afrontámonos coa tarefa de supervisar o período de validez dos certificados nos servidores Windows. Ben, como me erguín despois de que os certificados se converteran varias veces nunha cabaza, no mesmo momento en que o barbudo colega responsable da súa renovación estaba de vacacións. Despois diso, el e eu sospeitamos algo e decidimos pensalo. Xa que pouco a pouco estamos implementando o sistema de vixilancia NetXMS, converteuse no principal e, en principio, no único candidato para esta tarefa.

Finalmente, o resultado obtívose da seguinte forma:

Monitorización da data de caducidade do certificado en Windows en NetXMS

E o proceso en si continúa.

Vaia. Non hai un contador incorporado para os certificados que caducan en NetXMS, polo que debes crear o teu propio e usar scripts para proporcionarlle datos. Por suposto, en Powershell, isto é Windows. O script debería ler todos os certificados do sistema operativo, tomar a súa data de caducidade en días a partir de aí e pasar este número a NetXMS. A través do seu axente. Por aí comezaremos.

Unha opción, o máis sinxelo. Só ten que obter o número de días ata a data de caducidade do certificado coa data máis próxima.

Para que o servidor NetXMS coñeza a existencia do noso parámetro personalizado, debe recibilo do axente. En caso contrario, este parámetro non se pode engadir debido á súa ausencia. Polo tanto, no ficheiro de configuración do axente nxagentd.conf engadimos unha cadea de parámetros externa chamada HTTPS.CertificateExpireDateSimple, no que rexistramos o lanzamento do script:

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

Tendo en conta que o script se lanza a través da rede, cómpre lembrar Política de execución, e tampouco esquezas o outro "-NoLogo -NoProfile -NonInteractive", que omitii para unha mellor lexibilidade do código.

Como resultado, a configuración do axente ten un aspecto así:

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

Despois diso, cómpre gardar a configuración e reiniciar o axente. Podes facelo desde a consola de NetXMS: abre a configuración (Editar o ficheiro de configuración do axente), edítaa, executa Gardar&Aplicar, polo que, de feito, sucederá o mesmo. A continuación, volve ler a configuración (Enquisa > Configuración), se non tes forzas para esperar. Despois destes pasos, deberías poder engadir o noso parámetro personalizado.

Na consola NetXMS vai a Configuración da recollida de datos servidor experimental no que imos supervisar os certificados e crear alí un novo parámetro (no futuro, despois da configuración, ten sentido transferilo a modelos). Seleccione HTTPS.CertificateExpireDateSimple na lista, introduza unha Descrición cun nome claro, configure o tipo en Enteiro e configure o intervalo de votación. Para fins de depuración, ten sentido facelo máis curto, 30 segundos, por exemplo. Xa está todo listo, de momento é suficiente.

Podes comprobar... non, é demasiado cedo. Agora, claro, non conseguiremos nada. Simplemente porque o guión aínda non está escrito. Corrixemos esta omisión. O script simplemente mostrará un número, o número de días que quedan ata que caduque o certificado. O máis mínimo de todos os dispoñibles. Script de exemplo:

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 así:

Monitorización da data de caducidade do certificado en Windows en NetXMS

723 días, quedan case dous anos para que caduque o certificado. É lóxico, porque volvín emitir certificados para o banco de probas de Exchange hai bastante tempo.

Era unha opción fácil. Probablemente, alguén estará satisfeito con isto, pero queriamos máis. Propuxémonos a tarefa de obter unha lista de todos os certificados do servidor, polo seu nome, e que cada un vexa o número de días que faltan para que caduque o certificado.

A segunda opción, algo máis complicado.

De novo editamos a configuración do axente e alí, en lugar da liña con ExternalParameter, escribimos outras dúas:

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

В Lista externa só temos unha lista de cadeas. No noso caso, unha lista de cadeas con nomes de certificado. Recibiremos unha lista destas liñas mediante o script. Nome da lista - 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)"
    }
}

E xa dentro Parámetro externo Introducimos filas da lista ExternalList e na saída obtemos o mesmo número de días para cada unha. O identificador é a pegada dixital do certificado. Teña en conta que HTTPS.CertificateExpireDate contén un asterisco (*) nesta variante. Isto é necesario para que acepte variables externas, só o noso 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)"
}

Na configuración de recollida de datos do servidor, creamos un novo parámetro. En Parámetro seleccionamos o noso HTTPS.CertificateExpireDate(*) da lista e (¡atención!) cambie o asterisco a {instancia}. Este punto importante permitirache crear un contador separado para cada instancia (certificado). O resto énchese como na versión anterior:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Para ter algo do que crear contadores, na pestana Detección de instancias cómpre seleccionar Lista de axentes da lista e no campo Nome da lista introduza o nome da nosa Lista Externa do script - HTTPS.CertificateNames.

Case listo, agarda un pouco ou forza a Enquisa > Configuración e enquisa > Descubrimento de instancias se é completamente imposible esperar. Como resultado, obtemos todos os nosos certificados con períodos de validez:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Que necesitas? Pois si, só o verme do perfeccionismo mira esta Pegada innecesaria no nome do mostrador con ollos tristes e non me deixa rematar o artigo. Para alimentalo, abra de novo as propiedades do contador e na pestana Detección de instancias, no campo "Script de filtro de descubrimento de instancias", engada o escrito en NXSL (Linguaxe interna de NetXMS) script:

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

que filtrará a pegada digital:

Monitorización da data de caducidade do certificado en Windows en NetXMS

E para mostralo filtrado, na pestana Xeral no campo Descrición, cambie CertificateExpireDate: {instance} a CertificateExpireDate: {instance-name}:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Isto é todo, por fin a meta de KDPV:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Non é beleza?

Só queda configurar alertas para que cheguen por correo electrónico cando caduque o certificado.

1. Primeiro necesitamos crear un Modelo de Evento para activalo cando o valor do contador diminúe ata algún limiar que establezamos. EN Configuración de eventos imos crear dous novos modelos con nomes como CertificateExpireDate_Threshold_Activate con estado de aviso:

Monitorización da data de caducidade do certificado en Windows en NetXMS

e similares CertificateExpireDate_Threshold_Desactivate con estado normal.

2. A continuación, vai ás propiedades do contador e establece o limiar na pestana Limiares:

Monitorización da data de caducidade do certificado en Windows en NetXMS

onde seleccionamos os nosos eventos creados CertificateExpireDate_Threshold_Activate e CertificateExpireDate_Threshold_Deactivate, establecemos o número de mostras (Mostras) en 1 (específicamente para este contador non ten sentido configurar máis), o valor é 30 (días), por exemplo, e, o que é importante, establecemos o tempo de repetición do evento. Para os certificados en produción, púxeno unha vez ao día (86400 segundos), se non, pode afogarse nas notificacións (o que, por certo, pasou unha vez, tanto que a caixa de correo estaba chea durante a fin de semana). Para o tempo de depuración, ten sentido configuralo máis baixo, 60 segundos, por exemplo.

3. En Configuración da acción cree un modelo de carta de notificación, como este:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Todos estes %m, %S, etc. — macros nas que se substituirán os valores do noso parámetro. Descríbense con máis detalle en manual NetXMS.

4. E finalmente, combinando os puntos anteriores, en Política de procesamento de eventos crear unha regra segundo a cal se creará unha alarma e enviarase unha carta:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Gardamos a póliza, todo se pode probar. Imos establecer o limiar máis alto para comprobar. O meu certificado máis próximo caduca en 723 días, axusteino a 724 para comprobar. Como resultado, recibimos a seguinte alarma:

Monitorización da data de caducidade do certificado en Windows en NetXMS

e esta notificación por correo electrónico:

Monitorización da data de caducidade do certificado en Windows en NetXMS

Iso é todo seguro agora. Sería posible, por suposto, configurar un cadro de mando e construír gráficos, pero para os certificados estes serían liñas rectas un tanto sen sentido e aburridas, a diferenza dos gráficos de procesador ou carga de memoria, por exemplo. Pero, máis sobre isto noutro momento.

Fonte: www.habr.com

Engadir un comentario