Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Anyar-anyar ieu kami disanghareupan tugas ngawaskeun periode validitas sertipikat dina server Windows. Nya, kumaha kuring gugah saatos sertipikat sababaraha kali janten waluh, dina waktosna nalika batur sapagawean janggut anu tanggung jawab pembaharuanna dina liburan. Sanggeus éta, anjeunna jeung kuring disangka hal sarta mutuskeun pikeun mikir ngeunaan eta. Kusabab urang lalaunan ngalaksanakeun sistem ngawaskeun NetXMS, éta janten anu utama sareng, prinsipna, hiji-hijina calon pikeun tugas ieu.

Hasilna tungtungna dicandak dina bentuk ieu:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Jeung prosés sorangan terus.

indit. Henteu aya konter anu diwangun pikeun sertipikat kadaluwarsa di NetXMS, janten anjeun kedah nyiptakeun sorangan sareng nganggo skrip pikeun nyayogikeun data. Tangtosna, dina Powershell, ieu Windows. Skrip kedah maca sadaya sertipikat dina sistem operasi, nyandak tanggal béakna dina sababaraha dinten ti dinya sareng lebetkeun nomer ieu ka NetXMS. Ngaliwatan agénna. Éta dimana urang bakal ngamimitian.

Pilihan Hiji, pangbasajanna. Kantun kéngingkeun jumlah dinten dugi ka tanggal béakna sertipikat sareng tanggal pangcaketna.

Pikeun pangladén NetXMS terang ngeunaan ayana parameter khusus urang, éta kedah nampi ti agén. Upami teu kitu, parameter ieu teu bisa ditambahkeun alatan henteuna. Ku alatan éta, dina file konfigurasi agén nxagentd.conf urang tambahkeun string parameter éksternal disebut HTTPS.CertificateExpireDateSimple, dimana urang ngadaptarkeun peluncuran naskah:

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

Tempo yén naskah dibuka ngaliwatan jaringan, Anjeun kudu inget ngeunaan Kawijakan palaksanaan, sarta ogé ulah poho nu séjén "-NoLogo -NoProfile -NonInteractive", nu kuring disingkahkeun pikeun readability kode hadé.

Hasilna, config agén kasampak kawas kieu:

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

Saatos ieu, anjeun kedah nyimpen konfigurasi sareng ngabalikan deui agén. Anjeun tiasa ngalakukeun ieu tina konsol NetXMS: buka config (Édit file konfigurasi agén), édit éta, laksana Simpen&Larapkeun, salaku hasilna, kanyataanna, hal anu sami bakal kajadian. Teras baca deui konfigurasi (Poll> Konfigurasi), upami anjeun henteu gaduh kakuatan pikeun ngantosan. Saatos léngkah ieu, anjeun kedah tiasa nambihan parameter khusus kami.

Dina konsol NetXMS buka Konfigurasi Ngumpulkeun Data server ékspérimén nu urang bade ngawas sertipikat sarta nyieun parameter anyar aya (dina mangsa nu bakal datang, sanggeus konfigurasi, ngajadikeun rasa nransper ka témplat). Pilih HTTPS.CertificateExpireDateSimple tina daptar, asupkeun Pedaran kalayan ngaran jelas, set tipe ka Integer jeung ngonpigurasikeun interval polling. Pikeun tujuan debugging, masuk akal pikeun ngajantenkeun langkung pondok, 30 detik, contona. Sagalana geus siap, éta cukup keur ayeuna.

Anjeun tiasa pariksa ... euweuh, éta teuing mimiti. Ayeuna, tangtosna, urang moal meunang nanaon. Cukup ku sabab naskahna can ditulis. Hayu urang ngabenerkeun kasalahan ieu. Skrip ngan saukur bakal nunjukkeun nomer, jumlah dinten sésana dugi ka sertipikat tamat. Paling minimal sadaya sadia. conto naskah:

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
}

Tétéla kieu:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

723 dinten, ampir dua taun deui dugi sertipikat tamat. Ieu logis, sabab kuring ngaluarkeun deui sertipikat pikeun bangku test Exchange rada anyar.

Éta mangrupikeun pilihan anu gampang. Meureun batur bakal wareg jeung ieu, tapi urang hayang leuwih. Kami netepkeun tugas pikeun kéngingkeun daptar sadaya sertipikat dina server, ku nami, sareng masing-masing ningali jumlah dinten sésana dugi ka sertipikat tamat.

Pilihan kadua, rada leuwih pajeulit.

Deui urang ngédit config agén tur aya, tinimbang garis kalawan ExternalParameter, urang nulis dua batur:

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

В Daptar Luar urang ngan meunang daptar string. Dina kasus urang, daptar string kalawan ngaran sertipikat. Kami bakal nampi daptar garis ieu nganggo naskah. Daptar ngaran - HTTPS.CertificateNames.

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

Jeung geus di Parameter éksternal Urang input baris ti daptar ExternalList, sarta dina kaluaran kami meunang jumlah poé anu sarua pikeun tiap. Identifier nyaéta sidik jempol sertipikat. Catet yén HTTPS.CertificateExpireDate ngandung tanda bintang (*) dina varian ieu. Ieu diperlukeun sangkan narima variabel éksternal, ngan CertificateId urang.

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

Dina Konfigurasi Koléksi Data tina server, urang nyiptakeun parameter énggal. Dina Parameter urang pilih urang HTTPS.CertificateExpireDate(*) ti daptar, jeung (perhatian!) Ngarobah tanda bintang ka {conto}. titik penting ieu bakal ngidinan Anjeun pikeun nyieun hiji counter misah pikeun tiap conto (sertipikat). Sésana dieusian sakumaha dina versi saméméhna:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Dina raraga mibanda hal pikeun nyieun counters ti, dina tab Instance Discovery anjeun kudu milih Daptar Agen tina daptar jeung dina widang Daptar Ngaran asupkeun ngaran ExternalList kami tina naskah - HTTPS.CertificateNames.

Ampir siap, antosan sakedik atanapi maksakeun Poll> Konfigurasi sareng Polling> Instance Discovery upami teu mungkin ngantosan. Hasilna, urang nampi sadaya sertipikat kami kalayan periode validitas:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Kunaon anjeun peryogi? Nya, enya, ngan ukur cacing perfeksionisme anu ningali sidik jempol anu teu perlu ieu dina nami konter kalayan panon hanjelu sareng henteu ngantep kuring ngabéréskeun tulisan. Pikeun eupan éta, buka deui sipat kontra sareng dina tab Instance Discovery, dina widang "Skrip saringan Instance Discovery", tambahkeun anu ditulis dina NXSL (Basa internal NetXMS) skrip:

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

nu bakal nyaring Thumbprint:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Sareng pikeun ningalikeunana disaring, dina tab Umum dina widang Katerangan, robih CertificateExpireDate: {instance} ka CertificateExpireDate: {instance-name}:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Nya kitu, tungtungna garis finish ti KDPV:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Sanes kaéndahan?

Sadaya anu tetep nyaéta nyetél panggeuing supados aranjeunna sumping ku email nalika sertipikat tamat.

1. Kahiji urang kudu nyieun hiji Citakan Acara pikeun Aktipkeun eta nalika nilai counter nurun ka sababaraha bangbarung kami nyetél. DI Konfigurasi Kajadian hayu urang nyieun dua template anyar kalawan ngaran kawas CertificateExpireDate_Threshold_Activate kalayan status Peringatan:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

jeung sarupa CertificateExpireDate_Threshold_Deactivate kalawan status Normal.

2. Salajengna, buka sipat counter tur nyetel bangbarung dina tab Tresholds:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

dimana urang milih acara dijieun kami CertificateExpireDate_Threshold_Activate na CertificateExpireDate_Threshold_Deactivate, Nyetél jumlah sampel (Sampel) ka 1 (husus pikeun counter ieu euweuh titik dina netepkeun deui), nilaina 30 (poé), contona, jeung, importantly, set. waktu pengulangan acara. Pikeun sertipikat dina produksi, abdi nyetel eta sakali sapoé (86400 detik), disebutkeun Anjeun bisa ngalelepkeun bewara (anu, ku jalan, kajadian sakali, jadi loba kotak surat nu pinuh dina sabtu minggu teh). Pikeun waktos debugging, masuk akal pikeun nyetél éta langkung handap, 60 detik, contona.

3. Di Konfigurasi Peta jieun template surat bewara, saperti kieu:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Sadaya ieu %m,%S, jsb. - makro dimana nilai tina parameter urang bakal diganti. Aranjeunna digambarkeun dina leuwih jéntré dina manual NetXMS.

4. Sarta pamustunganana, ngagabungkeun titik saméméhna, kana Kawijakan Processing Acara Jieun aturan numutkeun nu Alarm bakal dijieun jeung surat bakal dikirim:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Urang nyimpen kawijakan, sagalana bisa diuji. Hayu urang nyetel bangbarung nu leuwih luhur pikeun dipariksa. Sertipikat pangcaketna abdi kadaluwarsa dina 723 dinten, abdi disetel ka 724 pikeun pariksa. Hasilna, urang meunang alarm handap:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

sareng béwara email ieu:

Ngawaskeun tanggal béakna sertipikat dina Windows dina NetXMS

Éta sadayana pasti ayeuna. Ieu bakal mungkin, tangtosna, pikeun nyetél dasbor sarta ngawangun grafik, tapi pikeun sertipikat ieu bakal rada euweuh hartina jeung boring garis lempeng, kawas grafik tina processor atawa beban memori, contona. Tapi, langkung seueur ngeunaan ieu waktos sanés.

sumber: www.habr.com

Tambahkeun komentar