Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Nesen mēs saskārāmies ar uzdevumu uzraudzīt sertifikātu derīguma termiņu Windows serveros. Nu kā es piecēlos pēc tam, kad sertifikāti vairākas reizes pārvērtās par ķirbi, tieši tajā laikā, kad par to atjaunošanu atbildīgais bārdainais kolēģis bija atvaļinājumā. Pēc tam mēs ar viņu kaut ko aizdomājāmies un nolēmām par to padomāt. Tā kā mēs lēnām ieviešam NetXMS uzraudzības sistēmu, tā ir kļuvusi par galveno un principā vienīgo kandidātu šim uzdevumam.

Rezultāts beidzot tika iegūts šādā formā:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Un pats process turpinās.

Aiziet. Programmā NetXMS nav iebūvēts skaitītājs sertifikātiem, kuriem beidzas derīguma termiņš, tāpēc jums ir jāizveido savs un jāizmanto skripti, lai nodrošinātu to ar datiem. Protams, programmā Powershell tas ir Windows. Skriptam ir jāizlasa visi operētājsistēmas sertifikāti, jānoņem to derīguma termiņš dienās un jānosūta šis numurs NetXMS. Ar viņa aģenta starpniecību. Ar to mēs sāksim.

Variants viens, vienkāršākais. Vienkārši iegūstiet dienu skaitu līdz sertifikāta derīguma termiņa beigām ar tuvāko datumu.

Lai NetXMS serveris zinātu par mūsu pielāgotā parametra esamību, tas jāsaņem no aģenta. Pretējā gadījumā šo parametru nevar pievienot tā trūkuma dēļ. Tāpēc aģenta konfigurācijas failā nxagentd.conf mēs pievienojam ārējo parametru virkni, ko sauc HTTPS.CertificateExpireDateSimple, kurā mēs reģistrējam skripta palaišanu:

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

Ņemot vērā, ka skripts tiek palaists tīklā, jums jāatceras par Izpildes politika, un neaizmirstiet arī otru “-NoLogo -NoProfile -NonInteractive”, kuru es izlaidu, lai nodrošinātu labāku koda lasāmību.

Rezultātā aģenta konfigurācija izskatās apmēram šādi:

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

Pēc tam jums ir jāsaglabā konfigurācija un jārestartē aģents. To var izdarīt no NetXMS konsoles: atveriet konfigurāciju (Edit agent's configuration file), rediģējiet to, izpildiet Save&Apply, kā rezultātā faktiski notiks tas pats. Pēc tam atkārtoti izlasiet konfigurāciju (Aptauja > Konfigurācija), ja jums vispār nav spēka gaidīt. Pēc šīm darbībām jums vajadzētu būt iespējai pievienot mūsu pielāgoto parametru.

NetXMS konsolē dodieties uz Datu vākšanas konfigurācija eksperimentāls serveris, kurā mēs uzraudzīsim sertifikātus un izveidosim tur jaunu parametru (nākotnē pēc konfigurācijas ir jēga to pārsūtīt uz veidnēm). Sarakstā atlasiet HTTPS.CertificateExpireDateSimple, ievadiet aprakstu ar skaidru nosaukumu, iestatiet veidu uz Integer un konfigurējiet aptaujas intervālu. Atkļūdošanas nolūkos ir lietderīgi to padarīt īsāku, piemēram, 30 sekundes. Viss ir gatavs, pagaidām pietiek.

Jūs varat pārbaudīt... nē, ir par agru. Tagad mēs, protams, neko neiegūsim. Vienkārši tāpēc, ka scenārijs vēl nav uzrakstīts. Labosim šo izlaidumu. Skripts vienkārši parādīs skaitli, dienu skaitu, kas atlikušas līdz sertifikāta derīguma termiņa beigām. Visminimālākais no visiem pieejamajiem. Skripta piemērs:

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
}

Tas izrādās šādi:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

723 dienas, līdz sertifikāta derīguma termiņa beigām atlikuši gandrīz divi gadi. Tas ir loģiski, jo es pavisam nesen atkārtoti izsniedzu sertifikātus Exchange testēšanas stendam.

Tas bija viegls variants. Iespējams, kāds ar to būs apmierināts, bet mēs gribējām vairāk. Mēs uzstādījām sev uzdevumu iegūt visu serverī esošo sertifikātu sarakstu pēc nosaukuma un katram redzēt, cik dienu ir atlikušas līdz sertifikāta derīguma termiņa beigām.

Otrā iespēja, nedaudz sarežģītāk.

Atkal mēs rediģējam aģenta konfigurāciju un tur, nevis rindas ar ExternalParameter, mēs ierakstām divus citus:

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

В Ārējais saraksts mēs vienkārši iegūstam virkņu sarakstu. Mūsu gadījumā virkņu saraksts ar sertifikātu nosaukumiem. Mēs saņemsim šo rindu sarakstu, izmantojot skriptu. Saraksta nosaukums - HTTPS.CertificateNames.

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

Un jau iekšā Ārējais parametrs Mēs ievadām rindas no ExternalList saraksta, un izvadē katrai saņemam vienādu dienu skaitu. Identifikators ir sertifikāta īkšķa nospiedums. Ņemiet vērā, ka HTTPS.CertificateExpireDate šajā variantā satur zvaigznīti (*). Tas ir nepieciešams, lai tas pieņemtu ārējos mainīgos, tikai mūsu CertificateId.

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

Servera datu vākšanas konfigurācijā mēs izveidojam jaunu parametru. Parametrā mēs izvēlamies mūsu HTTPS.CertificateExpireDate(*) no saraksta un (uzmanību!) mainiet zvaigznīti uz {instance}. Šis svarīgais punkts ļaus jums izveidot atsevišķu skaitītāju katrai instancei (sertifikātam). Pārējais tiek aizpildīts tāpat kā iepriekšējā versijā:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Lai būtu no kā izveidot skaitītājus, cilnē Instance Discovery no saraksta jāatlasa Agent List un laukā List Name jāievada mūsu ExternalList nosaukums no skripta - HTTPS.CertificateNames.

Gandrīz gatavs, nedaudz uzgaidiet vai piespiediet Aptauja > Konfigurācija un aptauja > Instanču atklāšana, ja gaidīt nav iespējams. Rezultātā mēs saņemam visus mūsu sertifikātus ar derīguma termiņiem:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Ko tev vajag? Nu jā, tikai perfekcionisma tārps skumjām acīm skatās uz šo nevajadzīgo Īkšķa nospiedumu letes vārdā un neļauj man pabeigt rakstu. Lai to ievadītu, vēlreiz atveriet skaitītāja rekvizītus un cilnes Instance Discovery laukā “Instances atklāšanas filtra skripts” pievienojiet to, kas rakstīts NXSL (NetXMS iekšējā valoda) skripts:

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

kas filtrēs īkšķa nospiedumu:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Un, lai to rādītu filtrētu, cilnes Vispārīgi laukā Apraksts mainiet CertificateExpireDate: {instance} uz Sertifikāta derīguma termiņš: {instance-name}:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Tas arī viss, beidzot finiša līnija no KDPV:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Vai tas nav skaistums?

Atliek tikai iestatīt brīdinājumus, lai tie saņemtu pa e-pastu, kad sertifikāta derīguma termiņš beidzas.

1. Vispirms mums ir jāizveido notikumu veidne, lai to aktivizētu, kad skaitītāja vērtība samazinās līdz noteiktam slieksnim. IN Pasākuma konfigurācija izveidosim divas jaunas veidnes ar tādiem nosaukumiem kā CertificateExpireDate_Threshold_Activate ar brīdinājuma statusu:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

un tamlīdzīgi CertificateExpireDate_Threshold_Deaktivizēt ar normālu statusu.

2. Pēc tam atveriet skaitītāja rekvizītus un cilnē Sliekšņi iestatiet slieksni:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

kur mēs atlasām mūsu izveidotos notikumus CertificateExpireDate_Threshold_Activate un CertificateExpireDate_Threshold_Deactivate, iestatām paraugu skaitu (Paraugi) uz 1 (konkrēti šim skaitītājam nav jēgas iestatīt vairāk), vērtība ir, piemēram, 30 (dienas), un, galvenais, iestatīt pasākuma atkārtošanās laiks. Sertifikātiem ražošanā es to iestatīju vienu reizi dienā (86400 sekundes), pretējā gadījumā jūs varat noslīkt paziņojumos (kas, starp citu, notika vienu reizi, tik ļoti, ka pastkaste bija pilna nedēļas nogalē). Atkļūdošanas laikam ir lietderīgi to iestatīt mazāku, piemēram, 60 sekundes.

3. Uz Darbības konfigurācija izveidojiet paziņojuma vēstules veidni, piemēram:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Visi šie %m, %S utt. — makro, kuros tiks aizstātas vērtības no mūsu parametra. Tie ir sīkāk aprakstīti rakstā rokasgrāmata NetXMS.

4. Un visbeidzot, apvienojot iepriekšējos punktus, uz Pasākumu apstrādes politika izveidot noteikumu, saskaņā ar kuru tiks izveidots trauksmes signāls un nosūtīta vēstule:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Saglabājam polisi, visu var pārbaudīt. Iestatīsim augstāku slieksni, lai pārbaudītu. Manam tuvākajam sertifikātam beidzas derīguma termiņš pēc 723 dienām, lai pārbaudītu, iestatīju uz 724. Rezultātā saņemam šādu trauksmi:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

un šo e-pasta paziņojumu:

Sertifikāta derīguma termiņa uzraudzība operētājsistēmā Windows NetXMS

Tagad tas viss ir skaidrs. Protams, būtu iespējams izveidot informācijas paneli un izveidot grafikus, taču sertifikātiem tās būtu nedaudz bezjēdzīgas un garlaicīgas taisnas līnijas, atšķirībā no, piemēram, procesora vai atmiņas slodzes grafikiem. Bet par to vairāk citreiz.

Avots: www.habr.com

Pievieno komentāru