Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Baru-baru ini kami dihadapkan pada tugas memantau masa berlaku sertifikat di server Windows. Nah, bagaimana saya bangun setelah sertifikat berubah menjadi labu beberapa kali, tepat pada saat rekan berjanggut yang bertanggung jawab atas perpanjangannya sedang berlibur. Setelah itu, dia dan saya mencurigai sesuatu dan memutuskan untuk memikirkannya. Karena kami secara perlahan menerapkan sistem pemantauan NetXMS, sistem ini telah menjadi yang utama dan, pada prinsipnya, satu-satunya kandidat untuk tugas ini.

Akhirnya diperoleh hasil berupa:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Dan prosesnya sendiri terus berlanjut.

Pergi. Tidak ada penghitung bawaan untuk sertifikat kedaluwarsa di NetXMS, jadi Anda perlu membuatnya sendiri dan menggunakan skrip untuk menyediakan data. Tentu saja, di Powershell, ini adalah Windows. Skrip harus membaca semua sertifikat di sistem operasi, mengambil tanggal kedaluwarsanya dalam hitungan hari dan meneruskan nomor ini ke NetXMS. Melalui agennya. Di situlah kita akan mulai.

Opsi Satu, paling sederhana. Cukup dapatkan jumlah hari hingga tanggal habis masa berlaku sertifikat dengan tanggal terdekat.

Agar server NetXMS mengetahui keberadaan parameter khusus kami, server tersebut harus menerimanya dari agen. Jika tidak, parameter ini tidak dapat ditambahkan karena tidak ada. Oleh karena itu, dalam file konfigurasi agen nxagentd.conf kami menambahkan string parameter eksternal yang disebut HTTPS.CertificateExpireDateSimple, di mana kami mendaftarkan peluncuran skrip:

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

Mengingat skrip diluncurkan melalui jaringan, Anda perlu mengingatnya Kebijakan Eksekusi, dan juga jangan lupa β€œ-NoLogo -NoProfile -NonInteractive” lainnya, yang saya hilangkan agar kode lebih mudah dibaca.

Hasilnya, konfigurasi agen terlihat seperti ini:

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

Setelah ini, Anda perlu menyimpan konfigurasi dan memulai ulang agen. Anda dapat melakukan ini dari konsol NetXMS: buka konfigurasi (Edit file konfigurasi agen), edit, jalankan Simpan&Terapkan, yang pada kenyataannya, hal yang sama akan terjadi. Kemudian baca kembali konfigurasinya (Poll > Configuration), jika Anda tidak mempunyai kekuatan untuk menunggu sama sekali. Setelah langkah-langkah ini, Anda seharusnya dapat menambahkan parameter khusus kami.

Di konsol NetXMS, buka Konfigurasi Pengumpulan Data server eksperimental tempat kita akan memantau sertifikat dan membuat parameter baru di sana (di masa mendatang, setelah konfigurasi, masuk akal untuk mentransfernya ke templat). Pilih HTTPS.CertificateExpireDateSimple dari daftar, masukkan Deskripsi dengan nama yang jelas, atur jenisnya ke Integer dan konfigurasikan interval polling. Untuk tujuan debugging, masuk akal untuk mempersingkatnya, misalnya 30 detik. Semuanya sudah siap, itu cukup untuk saat ini.

Anda dapat memeriksanya... tidak, ini masih terlalu dini. Sekarang, tentu saja, kita tidak akan mendapatkan apa pun. Hanya karena naskahnya belum ditulis. Mari kita perbaiki kelalaian ini. Script hanya akan menampilkan angka, jumlah hari yang tersisa hingga masa berlaku sertifikat habis. Yang paling minimal dari semua yang tersedia. Contoh skrip:

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
}

Ternyata seperti ini:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

723 hari, hampir dua tahun tersisa sampai masa berlaku sertifikatnya habis. Ini logis, karena saya baru saja menerbitkan kembali sertifikat untuk bangku tes Exchange.

Itu adalah pilihan yang mudah. Mungkin seseorang akan puas dengan ini, tetapi kami menginginkan lebih. Kami menetapkan tugas untuk mendapatkan daftar semua sertifikat di server, berdasarkan nama, dan untuk masing-masing sertifikat melihat jumlah hari yang tersisa hingga sertifikat kedaluwarsa.

Pilihan kedua, agak lebih rumit.

Sekali lagi kita mengedit konfigurasi agen dan di sana, alih-alih baris dengan ExternalParameter, kita menulis dua lainnya:

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

Π’ Daftar Eksternal kami hanya mendapatkan daftar string. Dalam kasus kami, daftar string dengan nama sertifikat. Kami akan menerima daftar baris ini menggunakan skrip. Daftar nama - HTTPS.Nama Sertifikat.

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

Dan sudah di Parameter Eksternal Kami memasukkan baris dari daftar ExternalList, dan pada output kami mendapatkan jumlah hari yang sama untuk setiap baris. Pengidentifikasinya adalah Sidik Jari sertifikat. Perhatikan bahwa HTTPS.CertificateExpireDate berisi tanda bintang (*) dalam varian ini. Ini diperlukan agar dapat menerima variabel eksternal, hanya CertificateId kami.

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

Dalam Konfigurasi Pengumpulan Data server, kami membuat parameter baru. Di Parameter kami memilih milik kami HTTPS.Tanggal Kedaluwarsa Sertifikat(*) dari daftar, dan (perhatian!) ubah tanda bintang menjadi {contoh}. Poin penting ini akan memungkinkan Anda membuat penghitung terpisah untuk setiap instance (sertifikat). Selebihnya diisi seperti pada versi sebelumnya:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Untuk mendapatkan sesuatu untuk membuat penghitung, pada tab Instance Discovery Anda perlu memilih Daftar Agen dari daftar dan di bidang Nama Daftar masukkan nama Daftar Eksternal kami dari skrip - HTTPS.CertificateNames.

Hampir siap, tunggu sebentar atau paksa Poll > Configuration dan Poll > Instance Discovery jika benar-benar tidak mungkin untuk menunggu. Hasilnya, kami mendapatkan semua sertifikat kami dengan masa berlaku:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Apa yang kamu butuhkan? Ya, hanya cacing perfeksionisme yang melihat Sidik Jari yang tidak perlu atas nama konter dengan mata sedih dan tidak membiarkan saya menyelesaikan artikelnya. Untuk memasukkannya, buka kembali properti penghitung dan pada tab Instance Discovery, di bidang β€œSkrip filter penemuan Instance”, tambahkan yang tertulis dalam NXSL Skrip (bahasa internal NetXMS):

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

yang akan memfilter Sidik Jari:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Dan untuk menampilkannya terfilter, pada tab General di kolom Description, ubah CertificateExpireDate: {instance} menjadi Tanggal Kedaluwarsa Sertifikat: {instance-name}:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Itu dia, akhirnya garis finis dari KDPV:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Apakah itu keindahan?

Yang tersisa hanyalah mengatur peringatan sehingga mereka tiba melalui email ketika sertifikat habis masa berlakunya.

1. Pertama kita perlu membuat Template Event untuk mengaktifkannya ketika nilai penghitung turun ke ambang batas tertentu yang kita tetapkan. DI DALAM Konfigurasi Acara mari buat dua template baru dengan nama seperti SertifikatExpireDate_Threshold_Activate dengan status Peringatan:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

dan serupa SertifikatExpireDate_Threshold_Deactivate dengan status Normal.

2. Selanjutnya, buka properti penghitung dan atur ambang batas pada tab Tresholds:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

dimana kita memilih event yang kita buat CertificateExpireDate_Threshold_Activate dan CertificateExpireDate_Threshold_Deactivate, atur jumlah sampel (Samples) menjadi 1 (khusus untuk counter ini tidak ada gunanya mengatur lebih banyak), nilainya 30 (hari), misalnya, dan, yang penting , kami mengatur waktu pengulangan acara. Untuk sertifikat dalam produksi, saya menyetelnya sekali sehari (86400 detik), jika tidak, Anda dapat tenggelam dalam notifikasi (yang, omong-omong, terjadi sekali, sedemikian rupa sehingga kotak surat penuh selama akhir pekan). Untuk waktu debugging, masuk akal untuk mengaturnya lebih rendah, misalnya 60 detik.

3. Masuk Konfigurasi Tindakan buat template surat pemberitahuan, seperti ini:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Semua ini %m, %S, dll. β€” makro yang akan menggantikan nilai dari parameter kita. Mereka dijelaskan secara lebih rinci di panduan NetXMS.

4. Dan terakhir, gabungkan poin-poin sebelumnya, menjadi Kebijakan Pemrosesan Acara buat aturan yang dengannya Alarm akan dibuat dan surat akan dikirim:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Kita simpan kebijakannya, semuanya bisa diuji. Mari kita tetapkan ambang batas lebih tinggi untuk memeriksanya. Sertifikat terdekat saya akan habis masa berlakunya dalam 723 hari, saya setel ke 724 untuk memeriksanya, Hasilnya, kami mendapatkan alarm berikut:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

dan pemberitahuan email ini:

Memantau tanggal kedaluwarsa sertifikat di Windows di NetXMS

Itu saja yang pasti sekarang. Tentu saja dimungkinkan untuk membuat dasbor dan membuat grafik, tetapi untuk sertifikat ini akan menjadi garis lurus yang tidak berarti dan membosankan, tidak seperti grafik beban prosesor atau memori, misalnya. Tapi, lebih lanjut tentang ini lain kali.

Sumber: www.habr.com

Tambah komentar