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:
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
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:
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:
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:
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
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
yang akan memfilter Sidik Jari:
Dan untuk menampilkannya terfilter, pada tab General di kolom Description, ubah CertificateExpireDate: {instance} menjadi Tanggal Kedaluwarsa Sertifikat: {instance-name}:
Itu dia, akhirnya garis finis dari KDPV:
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:
dan serupa SertifikatExpireDate_Threshold_Deactivate dengan status Normal.
2. Selanjutnya, buka properti penghitung dan atur ambang batas pada tab Tresholds:
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:
Semua ini %m, %S, dll. β makro yang akan menggantikan nilai dari parameter kita. Mereka dijelaskan secara lebih rinci di
4. Dan terakhir, gabungkan poin-poin sebelumnya, menjadi Kebijakan Pemrosesan Acara buat aturan yang dengannya Alarm akan dibuat dan surat akan dikirim:
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:
dan pemberitahuan email ini:
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