Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Äskettäin kohtasimme tehtävän valvoa Windows-palvelimien varmenteiden voimassaoloaikaa. No, kuinka nousin ylös sen jälkeen, kun todistukset muuttuivat kurpitsaksi useaan otteeseen, juuri siihen aikaan kun niiden uusimisesta vastaava parrakas kollega oli lomalla. Sen jälkeen hän ja minä epäilimme jotain ja päätimme miettiä sitä. Koska otamme hitaasti käyttöön NetXMS-valvontajärjestelmää, siitä on tullut tärkein ja periaatteessa ainoa ehdokas tähän tehtävään.

Tulos saatiin lopulta seuraavassa muodossa:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Ja itse prosessi jatkuu.

Mennä. NetXMS:ssä ei ole sisäänrakennettua laskuria vanhentuville sertifikaateille, joten sinun on luotava oma ja käytettävä komentosarjoja tietojen toimittamiseen. Tietysti Powershellissä tämä on Windows. Komentosarjan tulee lukea kaikki käyttöjärjestelmän varmenteet, ottaa niiden viimeinen voimassaolopäivä päivissä sieltä ja välittää tämä numero NetXMS:lle. Hänen agenttinsa kautta. Siitä aloitamme.

Vaihtoehto yksi, yksinkertaisin. Hanki vain päivien määrä varmenteen viimeiseen voimassaolopäivään lähimmän päivämäärän kanssa.

Jotta NetXMS-palvelin tietää mukautetun parametrimme olemassaolosta, sen on saatava se agentilta. Muuten tätä parametria ei voi lisätä sen puuttumisen vuoksi. Siksi agentin määritystiedostossa nxagentd.conf lisäämme ulkoisen parametrijonon nimeltä HTTPS.CertificateExpireDateSimple, jossa rekisteröimme skriptin käynnistyksen:

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

Ottaen huomioon, että komentosarja käynnistetään verkon kautta, sinun on muistettava Toteutuspolitiikka, ja älä myöskään unohda toista "-NoLogo -NoProfile -NonInteractive", jonka jätin pois koodin paremman luettavuuden vuoksi.

Tämän seurauksena agentin kokoonpano näyttää tältä:

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

Tämän jälkeen sinun on tallennettava asetukset ja käynnistettävä agentti uudelleen. Voit tehdä tämän NetXMS-konsolista: avaa konfiguraatio (Edit agentin asetustiedosto), muokkaa sitä, suorita Save&Apply, jonka seurauksena itse asiassa tapahtuu sama. Lue sitten asetukset uudelleen (Kysely > Määritykset), jos sinulla ei ole voimia odottaa ollenkaan. Näiden vaiheiden jälkeen sinun pitäisi pystyä lisäämään mukautettu parametrimme.

Siirry NetXMS-konsolissa kohtaan Tiedonkeruun asetukset kokeellinen palvelin, jolla aiomme valvoa varmenteita ja luoda sinne uuden parametrin (tulevaisuudessa konfiguroinnin jälkeen on järkevää siirtää se malleihin). Valitse luettelosta HTTPS.CertificateExpireDateSimple, kirjoita kuvaus selkeällä nimellä, aseta tyypiksi Kokonaisluku ja määritä kyselyväli. Virheenkorjaustarkoituksiin on järkevää lyhentää, esimerkiksi 30 sekuntia. Kaikki on valmista, nyt riittää.

Voit tarkistaa... ei, se on liian aikaista. Nyt emme tietenkään saa mitään. Yksinkertaisesti siksi, että käsikirjoitusta ei ole vielä kirjoitettu. Korjataan tämä puute. Skripti näyttää yksinkertaisesti numeron, päivien määrän, joka on jäljellä varmenteen vanhenemiseen. Minimaalisin kaikista saatavilla olevista. Esimerkki skriptistä:

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
}

Se osoittautuu näin:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

723 päivää, lähes kaksi vuotta jäljellä varmenteen vanhenemiseen. Se on loogista, koska myönsin uudelleen varmenteita Exchange-testipenkkiin melko äskettäin.

Se oli helppo vaihtoehto. Todennäköisesti joku on tyytyväinen tähän, mutta halusimme enemmän. Asetimme itsellemme tehtäväksi hankkia luettelon kaikista palvelimella olevista varmenteista nimen mukaan ja jokaiselle nähdä, kuinka monta päivää on jäljellä varmenteen vanhenemiseen.

Toinen vaihtoehto, hieman monimutkaisempi.

Muokkaamme jälleen agentin konfiguraatiota ja kirjoitamme sinne ExternalParameter-rivin sijaan kaksi muuta:

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

В Ulkoinen lista saamme vain luettelon merkkijonoista. Meidän tapauksessamme luettelo merkkijonoista varmenteiden nimillä. Saamme luettelon näistä riveistä käsikirjoituksen avulla. Listanimi - HTTPS.CertificateNames.

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

Ja jo sisään Ulkoinen parametri Syötetään rivit ExternalList-luettelosta, ja tulosteessa saamme kullekin saman määrän päiviä. Tunniste on varmenteen peukalonjälki. Huomaa, että HTTPS.CertificateExpireDate sisältää tähden (*) tässä versiossa. Tämä on välttämätöntä, jotta se hyväksyy ulkoiset muuttujat, vain meidän CertificateId.

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

Luomme uuden parametrin palvelimen tiedonkeruukonfiguraatiossa. Parametrissa valitsemme omamme HTTPS.CertificateExpireDate(*) luettelosta ja (huomio!) muuta tähdeksi {ilmentymä}. Tämän tärkeän kohdan avulla voit luoda erillisen laskurin jokaiselle esiintymälle (sertifikaatille). Loput täytetään kuten edellisessä versiossa:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Jotta sinulla olisi mistä luoda laskureita, Instance Discovery -välilehdellä sinun on valittava luettelosta Agent List ja kirjoitettava Listan nimi -kenttään ExternalList-ohjelman nimi komentosarjasta - HTTPS.CertificateNames.

Melkein valmis, odota vähän tai pakota Poll > Configuration and Poll > Instance Discovery, jos odottaminen on täysin mahdotonta. Tämän seurauksena saamme kaikki sertifikaattimme voimassaoloaikoina:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Mitä tarvitset? No joo, vain perfektionismin mato katsoo tätä turhaa Peukalonjälkeä tiskin nimessä surullisin silmin eikä anna minun lopettaa artikkelia. Syöttääksesi sen avaamalla laskurin ominaisuudet uudelleen ja lisäämällä Instanssien etsintä -välilehden "Instanssien etsintäsuodatinkomentosarja" -kenttään se, joka on kirjoitettu NXSL (NetXMS:n sisäinen kieli) komentosarja:

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

joka suodattaa peukalonjäljen:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Ja jos haluat näyttää sen suodatettuna, muuta Yleiset-välilehden Kuvaus-kentässä CertificateExpireDate: {instance} arvoksi Varmenteen vanhenemispäivämäärä: {instanssi-nimi}:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Siinä se, vihdoin maaliviiva KDPV:ltä:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Onko se kauneutta?

Jäljelle jää vain hälytteiden asettaminen niin, että ne saapuvat sähköpostitse, kun varmenne vanhenee.

1. Ensin meidän on luotava tapahtumamalli, jotta se aktivoituu, kun laskurin arvo laskee johonkin asettamamme kynnykseen. SISÄÄN Tapahtuman konfigurointi luodaan kaksi uutta mallia, joiden nimet ovat kuten CertificateExpireDate_Threshold_Activate Varoitustilalla:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

ja vastaavia CertificateExpireDate_Threshold_Deactivate normaalitilassa.

2. Siirry seuraavaksi laskurin ominaisuuksiin ja aseta kynnys Kynnykset-välilehdelle:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

jossa valitsemme luomamme tapahtumat CertificateExpireDate_Threshold_Activate ja CertificateExpireDate_Threshold_Deactivate, asetamme näytteiden (Samples) määräksi 1 (erityisesti tälle laskurille ei ole mitään järkeä asettaa enempää), arvo on esimerkiksi 30 (päivää), ja mikä tärkeintä, aseta tapahtuman toistoaika. Tuotannossa oleville varmenteille asetan sen kerran päivässä (86400 sekuntia), muuten voit hukkua ilmoituksiin (mikä muuten tapahtui kerran, niin paljon, että postilaatikko oli täynnä viikonloppuna). Virheenkorjausaikaa varten on järkevää asettaa se pienemmäksi, esimerkiksi 60 sekunniksi.

3. Toiminnon määritys luo ilmoituskirjemalli, kuten tämä:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Kaikki nämä %m, %S jne. — makrot, joihin parametrimme arvot korvataan. Niitä kuvataan tarkemmin kohdassa manuaalinen NetXMS.

4. Ja lopuksi yhdistämällä edelliset kohdat osaksi Tapahtuman käsittelykäytäntö luo sääntö, jonka mukaan luodaan hälytys ja lähetetään kirje:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Tallennamme politiikan, kaikki voidaan testata. Asetetaan kynnys korkeammalle tarkistaaksesi. Lähin varmenteeni vanhenee 723 päivän kuluttua, tarkistan sen arvoksi 724. Tämän seurauksena saamme seuraavan hälytyksen:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

ja tämä sähköposti-ilmoitus:

Varmenteen vanhenemispäivän valvonta Windowsissa NetXMS:ssä

Siinä nyt kaikki varmaa. Olisi tietysti mahdollista perustaa kojelauta ja rakentaa kaavioita, mutta varmenteille nämä olisivat jokseenkin merkityksettömiä ja tylsiä suoria viivoja, toisin kuin esimerkiksi prosessorin tai muistin kuormituksen kuvaajat. Mutta tästä lisää joskus joskus.

Lähde: will.com

Lisää kommentti