Yaqinda biz Windows serverlarida sertifikatlarning amal qilish muddatini kuzatish vazifasiga duch keldik. Xo'sh, sertifikatlar bir necha marta qovoqqa aylanganidan keyin qanday turdim, ularning yangilanishi uchun mas'ul bo'lgan soqolli hamkasbi ta'tilda bo'lgan paytda. Shundan so'ng u va men nimadandir shubhalanib, bu haqda o'ylashga qaror qildik. Biz NetXMS monitoring tizimini asta-sekin joriy etayotganimiz sababli, u bu vazifani bajarish uchun asosiy va, qoida tariqasida, yagona nomzodga aylandi.
Natija nihoyat quyidagi shaklda olingan:
Va jarayonning o'zi davom etadi.
Bor. NetXMS da muddati tugagan sertifikatlar uchun o'rnatilgan hisoblagich yo'q, shuning uchun siz o'zingizni yaratishingiz va uni ma'lumotlar bilan ta'minlash uchun skriptlardan foydalanishingiz kerak. Albatta, Powershell-da bu Windows. Skript operatsion tizimdagi barcha sertifikatlarni o'qishi, ularning amal qilish muddatini bir necha kun ichida olishi va bu raqamni NetXMS-ga o'tkazishi kerak. Uning agenti orqali. Bu erda biz boshlaymiz.
Bir variant, eng oddiy. Eng yaqin sana bilan sertifikatning amal qilish muddati tugagunga qadar qancha kunlar sonini olish kifoya.
NetXMS serveri bizning maxsus parametrimiz mavjudligi haqida bilishi uchun uni agentdan olishi kerak. Aks holda, bu parametr yo'qligi sababli qo'shilmaydi. Shuning uchun, agent konfiguratsiya faylida nxagentd.conf deb nomlangan tashqi parametr qatorini qo'shamiz HTTPS.CertificateExpireDateSimple, unda biz skript ishga tushirilishini ro'yxatdan o'tkazamiz:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
Skript tarmoq orqali ishga tushirilganligini hisobga olsak, siz eslab qolishingiz kerak
Natijada, agent konfiguratsiyasi quyidagicha ko'rinadi:
#
# 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"
Shundan so'ng siz konfiguratsiyani saqlashingiz va agentni qayta ishga tushirishingiz kerak. Buni NetXMS konsolidan qilishingiz mumkin: konfiguratsiyani oching (agentning konfiguratsiya faylini tahrirlash), uni tahrirlang, Saqlash va qo'llashni bajaring, buning natijasida aslida xuddi shu narsa sodir bo'ladi. Soβngra, umuman kutishga kuchingiz boβlmasa, konfiguratsiyani qayta oβqing (Soβrovnoma > Konfiguratsiya). Ushbu qadamlardan so'ng siz bizning shaxsiy parametrimizni qo'shishingiz kerak.
NetXMS konsolida ga o'ting Ma'lumotlarni yig'ish konfiguratsiyasi biz sertifikatlarni kuzatadigan va u erda yangi parametr yaratmoqchi bo'lgan eksperimental server (kelajakda konfiguratsiyadan so'ng uni shablonlarga o'tkazish mantiqiy). RoΚ»yxatdan HTTPS.CertificateExpireDateSimple ni tanlang, aniq nom bilan Tavsif kiriting, turini Integerga oΚ»rnating va soΚ»rovlar oraligΚ»ini sozlang. Nosozliklarni tuzatish uchun, masalan, 30 soniyani qisqartirish mantiqan to'g'ri keladi. Hammasi tayyor, hozircha yetarli.
Tekshirishingiz mumkin ... yo'q, juda erta. Endi, albatta, biz hech narsa olmaymiz. Shunchaki, ssenariy hali yozilmagan. Keling, bu kamchilikni tuzataylik. Skript shunchaki raqamni, sertifikatning amal qilish muddati tugaguniga qadar qolgan kunlar sonini ko'rsatadi. Mavjud bo'lganlarning eng minimali. Misol skript:
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
}
Bu shunday chiqadi:
Sertifikat muddati tugashiga 723 kun, deyarli ikki yil qoldi. Bu mantiqan to'g'ri, chunki men yaqinda Exchange test stoli uchun sertifikatlarni qayta chiqardim.
Bu oson variant edi. Ehtimol, kimdir bundan mamnun bo'ladi, lekin biz ko'proq narsani xohladik. Biz o'z oldimizga serverdagi barcha sertifikatlar ro'yxatini, nomi bo'yicha va sertifikatning amal qilish muddati tugaguniga qadar qolgan kunlar sonini ko'rish vazifasini qo'ydik.
Ikkinchi variant, biroz murakkabroq.
Biz yana agent konfiguratsiyasini tahrir qilamiz va u erda ExternalParameter qatori o'rniga yana ikkitasini yozamiz:
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
Π Tashqi ro'yxat biz faqat satrlar ro'yxatini olamiz. Bizning holatda, sertifikat nomlari bilan satrlar ro'yxati. Biz skript yordamida ushbu qatorlar ro'yxatini olamiz. Ro'yxat nomi - HTTPS. CertificateNames.
NetXMS_CertNames.ps1 skripti:
#Π‘ΠΏΠΈΡΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΈΠΌΠ΅Π½ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²
$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)"
}
}
Va allaqachon Tashqi parametr Biz ExternalList ro'yxatidan qatorlarni kiritamiz va chiqishda har biri uchun bir xil kunlar sonini olamiz. Identifikator sertifikatning bosh barmog'i hisoblanadi. Shuni yodda tutingki, HTTPS.CertificateExpireDate ushbu variantda yulduzcha (*) mavjud. Bu tashqi o'zgaruvchilarni qabul qilishi uchun zarur, faqat bizning CertificateId.
NetXMS_CertExpireDate.ps1 skripti:
#ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ $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)"
}
Serverning ma'lumotlar yig'ish konfiguratsiyasida biz yangi parametr yaratamiz. Parametrda biz o'zimizni tanlaymiz HTTPS.CertificateExpireDate(*) ro'yxatidan va (diqqat!) yulduzchani o'zgartiring {misol}. Ushbu muhim nuqta har bir misol (sertifikat) uchun alohida hisoblagich yaratishga imkon beradi. Qolganlari oldingi versiyadagi kabi to'ldiriladi:
Hisoblagichlarni yaratish uchun biror narsaga ega bo'lish uchun Instance Discovery yorlig'ida siz ro'yxatdan Agent ro'yxatini tanlashingiz kerak va Ro'yxat nomi maydoniga skriptdagi tashqi ro'yxatimizning nomini kiriting - HTTPS.CertificateNames.
Deyarli tayyor, biroz kuting yoki kutishning mutlaqo imkoni boΚ»lmasa, SoΚ»rovnoma > Konfiguratsiya va SoΚ»rovnoma > Namuna kashfiyotini majburlang. Natijada, biz barcha sertifikatlarimizni amal qilish muddati bilan olamiz:
Sizga nima kerak? Xo'sh, ha, faqat perfektsionizm qurti hisoblagich nomidagi bu keraksiz Bosh barmoq iziga g'amgin ko'zlari bilan qaraydi va maqolani tugatishimga imkon bermaydi. Uni ta'minlash uchun hisoblagich xususiyatlarini qayta oching va Instance Discovery yorlig'ida "Instance Discovery filter skript" maydonida yozilganini qo'shing.
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
Bosh barmoq izini filtrlaydigan:
Va uni filtrlangan holda ko'rsatish uchun Tavsif maydonidagi Umumiy yorlig'ida CertificateExpireDate: {instance} ni o'zgartiring. CertificateExpireDate: {instance-name}:
Va nihoyat, KDPV marrasi:
Bu go'zallik emasmi?
Sertifikat muddati tugagach, ular elektron pochta orqali kelishi uchun ogohlantirishlarni sozlash qoladi.
1. Avval hisoblagich qiymati biz o'rnatgan ba'zi chegaraga tushganda uni faollashtirish uchun Voqealar shablonini yaratishimiz kerak. IN Hodisa konfiguratsiyasi kabi nomlar bilan ikkita yangi shablon yarataylik CertificateExpireDate_threshold_activate Ogohlantirish holati bilan:
va shunga o'xshash CertificateExpireDate_threshold_O'chirish Oddiy holat bilan.
2. Keyin, hisoblagich xususiyatlariga o'ting va Eshiklar ko'rinishida chegarani o'rnating:
bu erda biz yaratilgan voqealarimizni tanlaymiz CertificateExpireDate_Threshold_Activate va CertificateExpireDate_Threshold_Deactivate, namunalar sonini (Namunalar) 1 ga qo'ying (ayniqsa, bu hisoblagich uchun ko'proq o'rnatishning ma'nosi yo'q), qiymat 30 (kun), masalan, va muhimi, o'rnatish hodisaning takrorlanish vaqti. Ishlab chiqarishdagi sertifikatlar uchun men uni kuniga bir marta (86400 soniya) o'rnatdim, aks holda siz bildirishnomalarga g'arq bo'lishingiz mumkin (aytmoqchi, bu bir marta sodir bo'lgan, shuning uchun pochta qutisi dam olish kunlari to'lgan edi). Nosozliklarni tuzatish vaqti uchun uni, masalan, 60 soniyadan pastroq qilib qo'yish mantiqan.
3. In Harakat konfiguratsiyasi quyidagi kabi bildirishnoma xati shablonini yarating:
Bularning barchasi %m, %S va boshqalar. β parametrimizdagi qiymatlar almashtiriladigan makroslar. Ular maqolada batafsil tavsiflangan
4. Va nihoyat, oldingi fikrlarni birlashtirib, ichiga Voqealarni qayta ishlash siyosati Qoida yarating, unga ko'ra Signal yaratiladi va xat yuboriladi:
Biz siyosatni saqlaymiz, hamma narsani sinab ko'rish mumkin. Tekshirish uchun chegarani yuqoriroq qilib belgilaymiz. Mening eng yaqin sertifikatimning amal qilish muddati 723 kundan keyin tugaydi, tekshirish uchun uni 724 ga qoΚ»ydim. Natijada biz quyidagi signalni olamiz:
va ushbu elektron pochta xabarnomasi:
Hozir hammasi aniq. Albatta, asboblar panelini o'rnatish va grafiklarni yaratish mumkin edi, lekin sertifikatlar uchun bu, masalan, protsessor yoki xotira yuki grafiklaridan farqli o'laroq, ma'nosiz va zerikarli to'g'ri chiziqlar bo'ladi. Ammo, bu haqda boshqa vaqt.
Manba: www.habr.com