Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Recentemente avemu statu affruntatu cù u compitu di monitorà u periodu di validità di i certificati in i servitori Windows. Ebbè, cumu aghju alzatu dopu chì i certificati sò diventati in una zucca parechje volte, à u mumentu stessu quandu u cullega barbutu rispunsevuli di a so rinnuvamentu era in vacanze. Dopu quì, ellu è aghju suspettatu qualcosa è decisu di pensà à questu. Siccomu implementemu lentamente u sistema di surviglianza NetXMS, hè diventatu u principale è, in principiu, l'unicu candidatu per questu compitu.

U risultatu hè stata finalmente ottenuta in a forma seguente:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

È u prucessu stessu cuntinueghja.

Vai. Ùn ci hè micca un contatore integratu per i certificati di scadenza in NetXMS, cusì avete bisognu di creà u vostru propiu è aduprà scripts per furnisce i dati. Di sicuru, nantu à Powershell, questu hè Windows. U script deve leghje tutti i certificati in u sistema operatore, piglià a so data di scadenza in ghjorni da quì è passà stu numeru à NetXMS. Per mezu di u so agente. Hè quì chì avemu da principià.

Opzione unu, u più simplice. Basta uttene u numeru di ghjorni finu à a data di scadenza di u certificatu cù a data più vicina.

Per chì u servitore NetXMS cunnosce l'esistenza di u nostru paràmetru persunalizatu, deve riceve da l'agente. Altrimenti, stu paràmetru ùn pò esse aghjuntu per via di a so assenza. Dunque, in u schedariu di cunfigurazione di l'agente nxagentd.conf aghjunghjemu una stringa di paràmetri esterni chjamata HTTPS.CertificateExpireDateSimple, in quale avemu registratu u lanciu di u script:

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

Cunsiderendu chì u script hè lanciatu nantu à a reta, avete bisognu di ricurdà Politica di Esecuzione, È ancu ùn vi scurdate di l'altru "-NoLogo -NoProfile -NonInteractive", chì aghju omessi per una megliu leghjibilità di u codice.

In u risultatu, a cunfigurazione di l'agente s'assumiglia à questu:

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

Dopu questu, avete bisognu di salvà a cunfigurazione è riavvia l'agente. Pudete fà questu da a cunsola NetXMS: apre a cunfigurazione (Edita u schedariu di cunfigurazione di l'agente), edità, eseguite Save & Apply, cum'è u risultatu di quale, in fattu, succederà a stessa cosa. Allora leghjite a cunfigurazione (Poll> Configurazione), sè ùn avete micca a forza di aspittà à tuttu. Dopu à sti passi, vi deve esse capaci di aghjunghje u nostru paràmetru persunalizatu.

In a cunsola NetXMS vai à Cunfigurazione di raccolta di dati servitore sperimentale nantu à quale andemu à monitorà i certificati è creà un novu paràmetru quì (in u futuru, dopu a cunfigurazione, hè sensu di trasfiriri à mudelli). Selezziunate HTTPS.CertificateExpireDateSimple da a lista, entre in una Description cù un nome chjaru, stabilisce u tipu à Integer è cunfigurà l'intervallu di polling. Per scopi di debugging, hè sensu per fà più corta, 30 seconde, per esempiu. Tuttu hè prontu, hè abbastanza per avà.

Pudete cuntrollà... nò, hè troppu prestu. Avà, sicuru, ùn averemu nunda. Simply perchè u script ùn hè ancu statu scrittu. Correggemu sta omissione. U script mostrarà simpricimenti un numeru, u numeru di ghjorni chì restanu finu à a scadenza di u certificatu. U più minimu di tutti i dispunibili. Esempiu di 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
}

Risulta cusì:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

723 ghjorni, mancanu quasi dui anni finu à a scadenza di u certificatu. Hè logicu, perchè aghju riisciutu i certificati per u bancu di prova di l'Exchange abbastanza recentemente.

Era una opzione faciule. Probabilmente, qualcunu serà cuntentu di questu, ma vulemu più. Avemu stabilitu u compitu di ottene una lista di tutti i certificati nantu à u servitore, per nome, è per ognunu di vede u numeru di ghjorni chì restanu finu à a scadenza di u certificatu.

A seconda opzione, un pocu più complicatu.

Di novu editemu a cunfigurazione di l'agente è quì, invece di a linea cù ExternalParameter, scrivemu dui altri:

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

В Lista Esterna avemu ghjustu una lista di strings. In u nostru casu, una lista di strings cù nomi di certificati. Riceveremu una lista di sti linii usendu u script. nome di 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)"
    }
}

È digià in Parametru esternu Intramu fila da a lista ExternalList, è à a pruduzzioni avemu u listessu numeru di ghjorni per ognunu. L'identificatore hè u Thumbprint di u certificatu. Nota chì HTTPS.CertificateExpireDate cuntene un asteriscu (*) in questa variante. Questu hè necessariu per chì accetta variabili esterni, solu u nostru 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)"
}

In a Configurazione di a Collezione di Dati di u servitore, creamu un novu paràmetru. In Parameter avemu sceltu u nostru HTTPS.CertificateExpireDate(*) da a lista, è (attenzione!) Cambia l'asteriscu à {istanza}. Stu puntu impurtante vi permetterà di creà un contatore separatu per ogni istanza (certificatu). U restu hè cumpletu cum'è in a versione precedente:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Per avè qualcosa da creà cuntatori, nantu à a tabulazione Instance Discovery avete bisognu di selezziunà Lista di l'Agenti da a lista è in u campu di u nome di a lista inserite u nome di u nostru ExternalList da u script - HTTPS.CertificateNames.

Quasi prontu, aspettate un pocu o forza Poll> Configurazione è Poll> Instance Discovery s'ellu hè cumplitamenti impussibile d'aspittà. In u risultatu, avemu tutti i nostri certificati cù periodi di validità:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Chì avete bisognu? Ebbè, iè, solu u vermu di u perfeccionismu guarda stu Thumbprint innecessariu in u nome di u contatore cù l'ochji tristi è ùn mi lascia micca finisce l'articulu. Per alimentallu, aprite di novu e proprietà di u contatore è nantu à a tabulazione Instance Discovery, in u campu "Script di filtru di scuperta di istanza", aghjunghje quellu scrittu in NXSL (Lingua interna NetXMS) script:

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

chì filtrerà Thumbprint:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

È per vede u filtratu, in a tabulazione Generale in u campu di Descrizzione, cambia CertificateExpireDate: {instance} à CertificateExpireDate: {instance-name}:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Eccu, infine a linea di finitura da KDPV:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Ùn hè micca bellezza?

Il ne reste plus qu'à configurer alertes pour qu'elles arrivent par e-mail lorsque le certificat expire.

1. Prima avemu bisognu di creà un Template di Eventu per attivà quandu u valore di u cuntrariu diminuite à qualchì limitu chì avemu stabilitu. IN Configurazione di l'avvenimentu criemu dui novi mudelli cù nomi cum'è CertificateExpireDate_Threshold_Activate cù statu di avvisu:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

è simili CertificateExpireDate_Threshold_Deactivate cù u statutu nurmale.

2. In seguitu, andate à e proprietà di u cuntatore è stabilisce u sogliu nantu à a tabulazione Tresholds:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

induve selezziunà i nostri avvenimenti creati CertificateExpireDate_Threshold_Activate è CertificateExpireDate_Threshold_Deactivate, stabilisce u numeru di campioni (Samples) à 1 (specificamente per questu contatore ùn hè micca puntu di stabilisce più), u valore hè 30 (ghjorni), per esempiu, è, più impurtante, stabilisce. u tempu di ripetizione di l'avvenimentu. Per i certificati in pruduzzione, aghju stabilitu una volta à ghjornu (86400 seconde), altrimente pudete affucà in notificazioni (chì, per via, hè accadutu una volta, tantu chì a cassetta postale era piena durante u weekend). Per u tempu di debugging, hè sensu per stabilisce più bassu, 60 seconde, per esempiu.

3. In Configurazione di l'azzione crea un mudellu di lettera di notificazione, cum'è questu:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Tutti questi %m, %S, ecc. - macros in quale i valori da u nostru paràmetru seranu sustituiti. Sò descritti in più detail in manuale NetXMS.

4. È infine, cumminendu i punti di prima, in Politica di Trattamentu di Eventi crea una regula secondu a quale un Alarm serà creatu è una lettera serà mandata:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Salvemu a pulitica, tuttu pò esse pruvatu. Fighjemu u sogliu più altu per verificà. U mo certificatu più vicinu scade in 723 ghjorni, aghju stabilitu à 724 per verificà. In u risultatu, avemu l'alarma seguente:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

è sta notificazione email:

Data di scadenza di u certificatu di monitorizazione in Windows nantu à NetXMS

Hè tuttu sicuru avà. Saria pussibile, sicuru, di stallà un dashboard è di custruisce grafici, ma per i certificati questi seranu linee dritte un pocu sensu è noiose, à u cuntrariu di i grafici di u processatore o di carica di memoria, per esempiu. Ma, più nantu à questu un altru tempu.

Source: www.habr.com

Add a comment