Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Kamakailan ay nahaharap kami sa gawain ng pagsubaybay sa panahon ng bisa ng mga sertipiko sa mga server ng Windows. Buweno, kung paano ako bumangon matapos ang mga sertipiko ay naging kalabasa nang maraming beses, sa mismong oras na ang may balbas na kasamahan na responsable para sa kanilang pag-renew ay nasa bakasyon. Pagkatapos noon, siya at ako ay naghinala ng isang bagay at nagpasya na pag-isipan ito. Dahil dahan-dahan nating ipinapatupad ang NetXMS monitoring system, ito ang naging pangunahing at, sa prinsipyo, ang tanging kandidato para sa gawaing ito.

Ang resulta ay sa wakas ay nakuha sa sumusunod na anyo:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

At ang proseso mismo ay nagpapatuloy.

Pumunta ka. Walang built-in na counter para sa mga nag-e-expire na certificate sa NetXMS, kaya kailangan mong lumikha ng iyong sarili at gumamit ng mga script upang mabigyan ito ng data. Siyempre, sa Powershell, ito ay Windows. Dapat basahin ng script ang lahat ng mga sertipiko sa operating system, kunin ang kanilang expiration date sa mga araw mula doon at ipasa ang numerong ito sa NetXMS. Sa pamamagitan ng kanyang ahente. Doon na tayo magsisimula.

Pagpipilian Isa, pinakasimple. Kunin lamang ang bilang ng mga araw hanggang sa petsa ng pag-expire ng sertipiko na may pinakamalapit na petsa.

Para malaman ng NetXMS server ang tungkol sa pagkakaroon ng aming custom na parameter, dapat itong matanggap mula sa ahente. Kung hindi, hindi maidaragdag ang parameter na ito dahil sa kawalan nito. Samakatuwid, sa file ng pagsasaayos ng ahente nxagentd.conf nagdagdag kami ng panlabas na parameter string na tinatawag HTTPS.CertificateExpireDateSimple, kung saan inirehistro namin ang paglulunsad ng script:

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

Isinasaalang-alang na ang script ay inilunsad sa network, kailangan mong tandaan ang tungkol sa Patakaran sa Pagpapatupad, at huwag ding kalimutan ang iba pang "-NoLogo -NoProfile -NonInteractive", na tinanggal ko para sa mas mahusay na pagiging madaling mabasa ng code.

Bilang resulta, ganito ang hitsura ng config ng ahente:

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

Pagkatapos nito, kailangan mong i-save ang config at i-restart ang ahente. Magagawa mo ito mula sa NetXMS console: buksan ang config (I-edit ang configuration file ng ahente), i-edit ito, i-execute ang Save&Apply, bilang resulta kung saan, sa katunayan, ang parehong bagay ang mangyayari. Pagkatapos ay basahin muli ang configuration (Poll > Configuration), kung wala kang lakas na maghintay. Pagkatapos ng mga hakbang na ito, dapat mong maidagdag ang aming custom na parameter.

Sa NetXMS console pumunta sa Configuration ng Pagkolekta ng Data pang-eksperimentong server kung saan susubaybayan namin ang mga sertipiko at lumikha ng isang bagong parameter doon (sa hinaharap, pagkatapos ng pagsasaayos, makatuwirang ilipat ito sa mga template). Piliin ang HTTPS.CertificateExpireDateSimple mula sa listahan, magpasok ng Paglalarawan na may malinaw na pangalan, itakda ang uri sa Integer at i-configure ang pagitan ng botohan. Para sa mga layunin ng pag-debug, makatuwirang gawin itong mas maikli, 30 segundo, halimbawa. Handa na ang lahat, sapat na iyon sa ngayon.

Maaari mong suriin... hindi, masyadong maaga. Ngayon, siyempre, wala tayong makukuha. Dahil hindi pa nasusulat ang script. Itama natin ang pagkukulang na ito. Ang script ay magpapakita lamang ng isang numero, ang bilang ng mga araw na natitira hanggang sa mag-expire ang certificate. Ang pinaka-minimal sa lahat ng magagamit. Halimbawa ng 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
}

Ito ay tulad nito:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

723 araw, halos dalawang taon na lang bago mag-expire ang certificate. Lohikal ito, dahil nag-isyu ulit ako ng mga certificate para sa Exchange test bench kamakailan lang.

Ito ay isang madaling opsyon. Malamang, may makukuntento dito, pero gusto pa namin. Itinakda namin sa aming sarili ang gawain ng pagkuha ng isang listahan ng lahat ng mga sertipiko sa server, ayon sa pangalan, at para sa bawat isa upang makita ang bilang ng mga araw na natitira hanggang sa mag-expire ang sertipiko.

Ang ikalawang opsyon, medyo mas kumplikado.

Muli naming i-edit ang config ng ahente at doon, sa halip na linya na may ExternalParameter, sumulat kami ng dalawa pa:

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

Π’ ExternalList nakakakuha lang kami ng listahan ng mga string. Sa aming kaso, isang listahan ng mga string na may mga pangalan ng sertipiko. Makakatanggap kami ng listahan ng mga linyang ito gamit ang script. Pangalan ng listahan - 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)"
    }
}

At nakapasok na ExternalParameter Nag-input kami ng mga row mula sa listahan ng ExternalList, at sa output ay nakukuha namin ang parehong bilang ng mga araw para sa bawat isa. Ang identifier ay ang Thumbprint ng certificate. Tandaan na ang HTTPS.CertificateExpireDate ay naglalaman ng asterisk (*) sa variant na ito. Ito ay kinakailangan upang matanggap nito ang mga panlabas na variable, ang aming CertificateId lamang.

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

Sa Data Collection Configuration ng server, gumawa kami ng bagong parameter. Sa Parameter pipiliin namin ang aming HTTPS.CertificateExpireDate(*) mula sa listahan, at (pansin!) baguhin ang asterisk sa {instance}. Ang mahalagang puntong ito ay magbibigay-daan sa iyo na lumikha ng isang hiwalay na counter para sa bawat pagkakataon (sertipiko). Ang natitira ay napunan tulad ng sa nakaraang bersyon:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Upang magkaroon ng lilikha ng mga counter, sa tab na Pagtuklas ng Instance kailangan mong piliin ang Listahan ng Ahente mula sa listahan at sa field ng Pangalan ng Listahan ipasok ang pangalan ng aming ExternalList mula sa script - HTTPS.CertificateNames.

Halos handa na, maghintay ng kaunti o pilitin ang Poll > Configuration at Poll > Instance Discovery kung ganap na imposibleng maghintay. Bilang resulta, nakukuha namin ang lahat ng aming mga sertipiko na may mga panahon ng bisa:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Ano'ng kailangan mo? Well, oo, tanging ang uod ng pagiging perpekto ang tumitingin sa hindi kinakailangang Thumbprint na ito sa pangalan ng counter na may malungkot na mga mata at hindi ako hinahayaan na tapusin ang artikulo. Para pakainin ito, buksang muli ang mga counter property at sa tab na Pagtuklas ng Instance, sa field na "Script ng filter ng pagtuklas ng Instance," idagdag ang nakasulat sa NXSL (NetXMS panloob na wika) script:

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

na mag-filter ng Thumbprint:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

At para ipakita itong na-filter, sa tab na Pangkalahatan sa field ng Paglalarawan, baguhin ang CertificateExpireDate: {instance} sa CertificateExpireDate: {instance-name}:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Iyon lang, sa wakas ang linya ng pagtatapos mula sa KDPV:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Hindi ba kagandahan?

Ang natitira na lang ay mag-set up ng mga alerto upang makarating sila sa pamamagitan ng email kapag nag-expire ang certificate.

1. Una, kailangan naming gumawa ng Template ng Kaganapan upang i-activate ito kapag bumaba ang counter value sa ilang threshold na itinakda namin. SA Configuration ng Kaganapan gumawa tayo ng dalawang bagong template na may mga pangalan tulad ng CertificateExpireDate_Threshold_Activate na may status ng Babala:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

at katulad CertificateExpireDate_Threshold_Deactivate na may Normal na katayuan.

2. Susunod, pumunta sa mga counter property at itakda ang threshold sa tab na Mga Treshold:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

kung saan pipiliin namin ang aming ginawang mga kaganapan na CertificateExpireDate_Threshold_Activate at CertificateExpireDate_Threshold_Deactivate, itakda ang bilang ng mga sample (Mga Sample) sa 1 (partikular para sa counter na ito ay walang punto sa pagtatakda ng higit pa), ang halaga ay 30 (araw), halimbawa, at, mahalaga, itakda ang oras ng pag-uulit ng kaganapan. Para sa mga sertipiko sa produksyon, itinakda ko ito isang beses sa isang araw (86400 segundo), kung hindi, maaari kang malunod sa mga abiso (na, sa pamamagitan ng paraan, nangyari nang isang beses, kaya't ang mailbox ay puno sa katapusan ng linggo). Para sa oras ng pag-debug, makatuwirang itakda ito nang mas mababa, 60 segundo, halimbawa.

3. In Pagsasaayos ng Aksyon lumikha ng template ng sulat ng notification, tulad nito:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Lahat ng %m, %S, atbp. β€” mga macro kung saan ang mga halaga mula sa aming parameter ay papalitan. Ang mga ito ay inilarawan nang mas detalyado sa manwal NetXMS.

4. At sa wakas, pagsasama-sama ng mga nakaraang puntos, sa Patakaran sa Pagproseso ng Kaganapan lumikha ng isang panuntunan ayon sa kung saan ang isang Alarm ay gagawin at isang sulat ay ipapadala:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

I-save namin ang patakaran, lahat ay maaaring masuri. Let's set the threshold higher to check. Ang aking pinakamalapit na certificate ay mag-e-expire sa loob ng 723 araw, itinakda ko ito sa 724 upang suriin. Bilang resulta, nakuha namin ang sumusunod na alarma:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

at ang abiso sa email na ito:

Pagsubaybay sa petsa ng pag-expire ng certificate sa Windows sa NetXMS

Iyon lang ang sigurado ngayon. Posible, siyempre, na mag-set up ng isang dashboard at bumuo ng mga graph, ngunit para sa mga sertipiko ang mga ito ay medyo walang kahulugan at nakakainip na mga tuwid na linya, hindi tulad ng mga graph ng processor o memory load, halimbawa. Ngunit, higit pa tungkol dito sa ibang pagkakataon.

Pinagmulan: www.habr.com

Magdagdag ng komento