Overvågning af certifikatets udløbsdato i Windows på NetXMS

For nylig stod vi over for opgaven med at overvåge gyldighedsperioden for certifikater på Windows-servere. Nå, som jeg rejste mig, efter at certifikaterne blev til et græskar flere gange, netop på det tidspunkt, hvor den skæggede kollega, der var ansvarlig for deres fornyelse, var på ferie. Efter det havde han og jeg mistanke om noget og besluttede at tænke over det. Da vi langsomt implementerer NetXMS-overvågningssystemet, er det blevet hoved- og i princippet den eneste kandidat til denne opgave.

Resultatet blev endelig opnået i følgende form:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Og selve processen fortsætter.

Gå. Der er ingen indbygget tæller for udløbende certifikater i NetXMS, så du skal oprette dine egne og bruge scripts til at forsyne den med data. På Powershell er dette selvfølgelig Windows. Scriptet skal læse alle certifikaterne i operativsystemet, tage deres udløbsdato i dage derfra og videregive dette nummer til NetXMS. Gennem sin agent. Det er der, vi starter.

Option One, enklest. Du skal blot få antallet af dage indtil udløbsdatoen for certifikatet med den nærmeste dato.

For at NetXMS-serveren skal vide om eksistensen af ​​vores tilpassede parameter, skal den modtage den fra agenten. Ellers kan denne parameter ikke tilføjes på grund af dens fravær. Derfor i agentens konfigurationsfil nxagentd.conf vi tilføjer en ekstern parameterstreng kaldet HTTPS.CertificateExpireDateSimple, hvor vi registrerer lanceringen af ​​scriptet:

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

I betragtning af at scriptet er lanceret over netværket, skal du huske om Udførelsespolitik, og glem heller ikke den anden "-NoLogo -NoProfile -NonInteractive", som jeg undlod for bedre kodelæsbarhed.

Som et resultat ser agentkonfigurationen sådan her ud:

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

Herefter skal du gemme konfigurationen og genstarte agenten. Du kan gøre dette fra NetXMS-konsollen: åbn konfigurationen (Rediger agentens konfigurationsfil), rediger den, kør Save&Apply, hvilket resulterer i, at det samme vil ske. Læs derefter konfigurationen igen (Afstemning > Konfiguration), hvis du slet ikke har kræfter til at vente. Efter disse trin bør du være i stand til at tilføje vores tilpassede parameter.

Gå til i NetXMS-konsollen Konfiguration af dataindsamling eksperimentel server, hvor vi skal overvåge certifikater og oprette en ny parameter der (i fremtiden, efter konfiguration, giver det mening at overføre det til skabeloner). Vælg HTTPS.CertificateExpireDateSimple fra listen, indtast en beskrivelse med et klart navn, indstil typen til Integer og konfigurer pollingintervallet. Til debugging formål giver det mening at gøre det kortere, f.eks. 30 sekunder. Alt er klar, det er nok for nu.

Du kan tjekke ... nej, det er for tidligt. Nu får vi selvfølgelig ikke noget. Simpelthen fordi manuskriptet endnu ikke er skrevet. Lad os rette denne udeladelse. Scriptet vil blot vise et tal, antallet af dage tilbage, indtil certifikatet udløber. Den mest minimale af alle tilgængelige. Eksempel 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
}

Det bliver sådan her:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

723 dage, næsten to år tilbage til certifikatet udløber. Det er logisk, for jeg genudstedte certifikater til Exchange-testbænken for ganske nylig.

Det var en nem mulighed. Sandsynligvis vil nogen være tilfredse med dette, men vi ville have mere. Vi satte os til opgave at få en liste over alle certifikater på serveren, efter navn, og for hver enkelt at se antallet af dage tilbage, indtil certifikatet udløber.

Den anden valgmulighed, noget mere kompliceret.

Igen redigerer vi agentkonfigurationen, og der, i stedet for linjen med ExternalParameter, skriver vi to andre:

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

В Ekstern Liste vi får bare en liste over strenge. I vores tilfælde en liste over strenge med certifikatnavne. Vi vil modtage en liste over disse linjer ved hjælp af scriptet. Listenavn - 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)"
    }
}

Og allerede i Ekstern Parameter Vi indtaster rækker fra ExternalList-listen, og ved output får vi det samme antal dage for hver. Identifikationen er tommelfingeraftrykket af certifikatet. Bemærk, at HTTPS.CertificateExpireDate indeholder en stjerne (*) i denne variant. Dette er nødvendigt, så det accepterer eksterne variabler, kun vores 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)"
}

I serverens dataindsamlingskonfiguration opretter vi en ny parameter. I Parameter vælger vi vores HTTPS.CertificateExpireDate(*) fra listen, og (bemærk!) skift stjernen til {forekomst}. Dette vigtige punkt giver dig mulighed for at oprette en separat tæller for hver instans (certifikat). Resten er udfyldt som i forrige version:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

For at have noget at oprette tællere ud fra skal du på fanen Instance Discovery vælge Agent List fra listen og i feltet List Name indtaste navnet på vores ExternalList fra scriptet - HTTPS.CertificateNames.

Næsten klar, vent lidt eller gennemtving afstemning > Konfiguration og afstemning > Forekomstopdagelse, hvis det er fuldstændig umuligt at vente. Som et resultat får vi alle vores certifikater med gyldighedsperioder:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Hvad har du brug for? Nå, ja, kun perfektionismens orm ser på dette unødvendige tommelfingeraftryk i diskens navn med triste øjne og lader mig ikke afslutte artiklen. For at fodre den skal du åbne tælleregenskaberne igen og på fanen Instance Discovery i feltet "Instance discovery filter script" tilføje den, der er skrevet i NXSL (NetXMS internt sprog) script:

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

som vil filtrere Thumbprint:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Og for at vise det filtreret skal du på fanen Generelt i feltet Beskrivelse ændre CertificateExpireDate: {instance} til CertificateExpireDate: {instance-name}:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Det var det, endelig målstregen fra KDPV:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Er det ikke skønhed?

Tilbage er blot at opsætte alarmer, så de ankommer via e-mail, når certifikatet udløber.

1. Først skal vi oprette en hændelsesskabelon for at aktivere den, når tællerværdien falder til en tærskel, vi sætter. I Hændelseskonfiguration lad os oprette to nye skabeloner med navne som CertificateExpireDate_Threshold_Activate med advarselsstatus:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

og lignende CertificateExpireDate_Threshold_Deactivate med normal status.

2. Gå derefter til tælleregenskaberne og indstil tærsklen på fanen Tærskelværdier:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

hvor vi vælger vores oprettede hændelser CertificateExpireDate_Threshold_Activate og CertificateExpireDate_Threshold_Deactivate, indstiller antallet af prøver (Sampler) til 1 (specifikt for denne tæller er der ingen mening i at indstille flere), værdien er 30 (dage), for eksempel, og, hvad der er vigtigt, indstilles gentagelsestidspunktet for begivenheden. For certifikater i produktion sætter jeg det en gang om dagen (86400 sekunder), ellers kan man drukne i notifikationer (hvilket i øvrigt skete én gang, så meget at postkassen var fuld i weekenden). For fejlretningstiden giver det mening at sætte den lavere, f.eks. 60 sekunder.

3. In Handlingskonfiguration opret en meddelelsesbrevskabelon som denne:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Alle disse %m, %S osv. — makroer, hvor værdier fra vores parameter vil blive erstattet. De er beskrevet mere detaljeret i brugervejledning NetXMS.

4. Og endelig ved at kombinere de foregående punkter til Begivenhedsbehandlingspolitik opret en regel, hvorefter en alarm oprettes, og et brev vil blive sendt:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Vi gemmer politikken, alt kan testes. Lad os sætte tærsklen højere for at kontrollere. Mit nærmeste certifikat udløber om 723 dage, jeg indstillede det til 724 for at tjekke. Som et resultat får vi følgende alarm:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

og denne e-mail-meddelelse:

Overvågning af certifikatets udløbsdato i Windows på NetXMS

Det er alt sikkert nu. Det ville selvfølgelig være muligt at sætte et dashboard op og bygge grafer, men for certifikater ville disse være noget meningsløse og kedelige lige linjer, i modsætning til grafer for f.eks. processor- eller hukommelsesbelastning. Men mere om dette en anden gang.

Kilde: www.habr.com

Tilføj en kommentar