Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Pred kratkim smo se soočili z nalogo spremljanja obdobja veljavnosti certifikatov na Windows strežnikih. No, kako sem vstal potem, ko so se spričevala večkrat spremenila v bučo, in to ravno v času, ko je bil brkati kolega, odgovoren za njihovo podaljšanje, na dopustu. Po tistem sva z njim nekaj posumila in se odločila razmisliti o tem. Ker počasi uvajamo nadzorni sistem NetXMS, je postal glavni in načeloma edini kandidat za to nalogo.

Končno je bil rezultat dosežen v naslednji obliki:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

In sam proces se nadaljuje.

pojdi V NetXMS ni vgrajenega števca za potekla potrdila, zato morate ustvariti lastnega in uporabiti skripte, da mu zagotovite podatke. Seveda je to na Powershellu Windows. Skript bi moral prebrati vsa potrdila v operacijskem sistemu, od tam vzeti njihov datum poteka v dnevih in to številko posredovati NetXMS. Preko svojega agenta. Tam bomo začeli.

Možnost One, najbolj preprosto. Preprosto pridobite število dni do datuma poteka veljavnosti potrdila z najbližjim datumom.

Da bi strežnik NetXMS vedel za obstoj našega parametra po meri, ga mora prejeti od agenta. V nasprotnem primeru tega parametra ni mogoče dodati, ker ga ni. Zato v konfiguracijski datoteki agenta nxagentd.conf dodamo niz zunanjih parametrov, imenovan HTTPS.CertificateExpireDateSimple, v katerem registriramo zagon skripte:

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

Glede na to, da se skript zažene prek omrežja, se morate spomniti na Politika izvajanja, prav tako ne pozabite na drugi "-NoLogo -NoProfile -NonInteractive", ki sem ga zaradi boljše berljivosti kode izpustil.

Posledično je konfiguracija agenta videti nekako takole:

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

Po tem morate shraniti konfiguracijo in znova zagnati agenta. To lahko storite iz konzole NetXMS: odprite config (uredite konfiguracijsko datoteko agenta), jo uredite, zaženite Save&Apply, zaradi česar se bo dejansko zgodilo isto. Nato ponovno preberite konfiguracijo (Anketa > Konfiguracija), če sploh nimate moči čakati. Po teh korakih bi morali imeti možnost dodati naš parameter po meri.

V konzoli NetXMS pojdite na Konfiguracija zbiranja podatkov eksperimentalni strežnik, na katerem bomo spremljali certifikate in tam ustvarili nov parameter (v prihodnje ga je po konfiguraciji smiselno prenesti v predloge). Na seznamu izberite HTTPS.CertificateExpireDateSimple, vnesite opis z jasnim imenom, nastavite vrsto na Integer in konfigurirajte interval pozivanja. Za namene odpravljanja napak je smiselno, da je krajši, na primer 30 sekund. Vse je pripravljeno, za zdaj je dovolj.

Lahko preverite ... ne, prezgodaj je. Zdaj seveda ne bomo dobili ničesar. Preprosto zato, ker scenarij še ni bil napisan. Popravimo to opustitev. Skript bo preprosto prikazal številko, število preostalih dni do izteka potrdila. Najbolj minimalen od vseh na voljo. Primer skripta:

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
}

Izkazalo se je takole:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

723 dni, še skoraj dve leti do izteka certifikata. Logično, saj sem pred kratkim ponovno izdal certifikate za testno napravo Exchange.

To je bila enostavna možnost. Verjetno bo kdo s tem zadovoljen, mi pa smo želeli več. Zadali smo si nalogo, da pridobimo poimensko seznam vseh certifikatov na strežniku in za vsakega posebej vidimo, koliko dni je ostalo do izteka certifikata.

Druga možnost, nekoliko bolj zapleteno.

Ponovno uredimo konfiguracijo agenta in tam namesto vrstice z ExternalParameter napišemo dve drugi:

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

В Zunanji seznam dobimo samo seznam nizov. V našem primeru seznam nizov z imeni potrdil. S skriptom bomo prejeli seznam teh vrstic. Ime seznama - HTTPS.CertificateNames.

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

In že noter ZunanjiParameter Vnašamo vrstice iz seznama ExternalList, na izhodu pa za vsako dobimo enako število dni. Identifikator je Thumbprint potrdila. Upoštevajte, da HTTPS.CertificateExpireDate v tej različici vsebuje zvezdico (*). To je potrebno, da sprejme zunanje spremenljivke, samo naš CertificateId.

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

V konfiguraciji zbiranja podatkov strežnika ustvarimo nov parameter. V Parameter izberemo naše HTTPS.CertificateExpireDate(*) s seznama in (pozor!) spremenite zvezdico v {primer}. Ta pomembna točka vam bo omogočila, da ustvarite ločen števec za vsak primerek (certifikat). Ostalo se izpolni kot v prejšnji različici:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Da bi imeli iz česa ustvarjati števce, morate na zavihku Instance Discovery s seznama izbrati Agent List in v polje List Name vnesti ime našega ExternalList iz skripta - HTTPS.CertificateNames.

Skoraj pripravljeno, počakajte malo ali prisilite Anketa > Konfiguracija in Anketa > Odkrivanje primerkov, če je povsem nemogoče čakati. Kot rezultat, dobimo vse naše certifikate z roki veljavnosti:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

kaj potrebuješ No, ja, samo črv perfekcionizma z žalostnimi očmi gleda na ta nepotrebni Thumbprint v imenu števca in mi ne pusti dokončati članka. Če ga želite podati, znova odprite lastnosti števca in na zavihku Odkrivanje primerkov v polje »Skript filtra za odkrivanje primerkov« dodajte tistega, ki je napisan v NXSL (interni jezik NetXMS) skript:

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

ki bo filtriral Thumbprint:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Če ga želite prikazati filtriranega, na kartici Splošno v polju Opis spremenite CertificateExpireDate: {instance} v CertificateExpireDate: {instance-name}:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

To je to, končno ciljna črta iz KDPV:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Ali ni lepota?

Preostane le še nastavitev opozoril, da bodo po poteku potrdila prispela po elektronski pošti.

1. Najprej moramo ustvariti predlogo dogodka, da jo aktiviramo, ko se vrednost števca zmanjša na določen prag, ki smo ga nastavili. IN Konfiguracija dogodka ustvarimo dve novi predlogi z imeni, kot sta CertificateExpireDate_Threshold_Activate s statusom opozorila:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

in podobno CertificateExpireDate_Threshold_Deactivate z normalnim stanjem.

2. Nato pojdite na lastnosti števca in na zavihku Mejne vrednosti nastavite prag:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

kjer izberemo svoja ustvarjena dogodka CertificateExpireDate_Threshold_Activate in CertificateExpireDate_Threshold_Deactivate, nastavimo število vzorcev (Samples) na 1 (konkretno za ta števec nima smisla nastavljati več), vrednost je na primer 30 (dni) in, kar je pomembno, nastavimo čas ponovitve dogodka. Pri certifikatih v produkciji nastavim enkrat dnevno (86400 sekund), sicer se lahko utopiš v obvestilih (kar se je mimogrede zgodilo enkrat, toliko, da je bil nabiralnik čez vikend poln). Za čas odpravljanja napak je smiselno nastaviti nižje, na primer 60 sekund.

3. V Konfiguracija dejanja ustvarite predlogo obvestilnega pisma, kot je ta:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Vsi ti %m, %S itd. — makri, v katere bodo zamenjane vrednosti iz našega parametra. Podrobneje so opisani v priročnik NetXMS.

4. In končno, združevanje prejšnjih točk v Politika obdelave dogodkov ustvarite pravilo, po katerem bo ustvarjen alarm in poslano pismo:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

Polico shranimo, vse se da preizkusiti. Za preverjanje nastavimo prag višje. Moje najbližje potrdilo poteče čez 723 dni, za preverjanje sem ga nastavil na 724. Posledično dobimo naslednji alarm:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

in to e-poštno obvestilo:

Spremljanje datuma poteka potrdila v sistemu Windows na NetXMS

To je zdaj zagotovo vse. Seveda bi se dalo postaviti nadzorno ploščo in zgraditi grafe, a za certifikate bi bile to nekoliko nesmiselne in dolgočasne ravne črte, za razliko od na primer grafov obremenitve procesorja ali pomnilnika. A o tem več kdaj drugič.

Vir: www.habr.com

Dodaj komentar