เมื่อเร็ว ๆ นี้เราต้องเผชิญกับงานตรวจสอบระยะเวลาที่ถูกต้องของใบรับรองบนเซิร์ฟเวอร์ Windows ฉันลุกขึ้นได้อย่างไรหลังจากใบรับรองกลายเป็นฟักทองหลายครั้งในเวลาเดียวกับที่เพื่อนร่วมงานมีหนวดมีเคราที่รับผิดชอบในการต่ออายุอยู่ในช่วงพักร้อน หลังจากนั้นเขากับฉันเกิดความสงสัยบางอย่างจึงตัดสินใจคิดดู เนื่องจากเรากำลังใช้ระบบตรวจสอบ NetXMS อย่างช้าๆ ระบบจึงกลายเป็นระบบหลักและโดยหลักการแล้ว เป็นเพียงตัวเลือกเดียวสำหรับงานนี้
ในที่สุดผลลัพธ์ก็ได้รับในรูปแบบต่อไปนี้:
และกระบวนการนี้ก็ดำเนินต่อไป
ไป. ไม่มีตัวนับในตัวสำหรับการหมดอายุใบรับรองใน NetXMS ดังนั้นคุณจึงต้องสร้างของคุณเองและใช้สคริปต์เพื่อจัดเตรียมข้อมูล แน่นอนบน Powershell นี่คือ Windows สคริปต์ควรอ่านใบรับรองทั้งหมดในระบบปฏิบัติการ จากนั้นใช้วันหมดอายุเป็นวันจากนั้นจึงส่งต่อหมายเลขนี้ไปยัง NetXMS ผ่านทางตัวแทนของเขา นั่นคือจุดที่เราจะเริ่มต้น
ตัวเลือกที่หนึ่ง, ง่ายที่สุด เพียงรับจำนวนวันจนถึงวันหมดอายุของใบรับรองพร้อมวันที่ที่ใกล้ที่สุด
เพื่อให้เซิร์ฟเวอร์ NetXMS ทราบเกี่ยวกับการมีอยู่ของพารามิเตอร์ที่กำหนดเองของเรา จะต้องได้รับจากตัวแทน มิฉะนั้นจะไม่สามารถเพิ่มพารามิเตอร์นี้ได้เนื่องจากไม่มีอยู่ ดังนั้นในไฟล์คอนฟิกูเรชันเอเจนต์ nxagentd.conf เราเพิ่มสตริงพารามิเตอร์ภายนอกที่เรียกว่า HTTPS.CertificateExpireDateSimpleซึ่งเราลงทะเบียนการเปิดตัวสคริปต์:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
เมื่อพิจารณาว่าสคริปต์เปิดตัวผ่านเครือข่าย คุณต้องจำไว้
ด้วยเหตุนี้ การกำหนดค่าตัวแทนจึงมีลักษณะดังนี้:
#
# 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"
หลังจากนี้ คุณจะต้องบันทึกการกำหนดค่าและรีสตาร์ทเอเจนต์ คุณสามารถทำได้จากคอนโซล NetXMS: เปิดการกำหนดค่า (แก้ไขไฟล์การกำหนดค่าของตัวแทน) แก้ไข ดำเนินการบันทึก&นำไปใช้ ซึ่งในความเป็นจริง สิ่งเดียวกันนี้จะเกิดขึ้น จากนั้นอ่านการกำหนดค่าอีกครั้ง (แบบสำรวจ > การกำหนดค่า) หากคุณไม่มีกำลังพอที่จะรอเลย หลังจากขั้นตอนเหล่านี้ คุณควรจะสามารถเพิ่มพารามิเตอร์ที่กำหนดเองของเราได้
ในคอนโซล NetXMS ให้ไปที่ การกำหนดค่าการรวบรวมข้อมูล เซิร์ฟเวอร์ทดลองที่เราจะตรวจสอบใบรับรองและสร้างพารามิเตอร์ใหม่ที่นั่น (ในอนาคตหลังจากการกำหนดค่า มันสมเหตุสมผลที่จะถ่ายโอนไปยังเทมเพลต) เลือก HTTPS.CertificateExpireDateSimple จากรายการ ป้อนคำอธิบายด้วยชื่อที่ชัดเจน ตั้งค่าประเภทเป็น Integer และกำหนดค่าช่วงเวลาการโพล เพื่อวัตถุประสงค์ในการแก้ไขจุดบกพร่อง ควรทำให้สั้นลง เช่น 30 วินาที เป็นต้น ทุกอย่างพร้อมแล้ว เพียงพอแล้วสำหรับตอนนี้
คุณสามารถตรวจสอบได้... ไม่ มันเร็วเกินไป แน่นอนว่าเราจะไม่ได้รับอะไรเลย เพียงเพราะยังไม่ได้เขียนบท มาแก้ไขการละเลยนี้กัน สคริปต์จะแสดงตัวเลข ซึ่งเป็นจำนวนวันที่เหลือจนกว่าใบรับรองจะหมดอายุ น้อยที่สุดที่มีอยู่ทั้งหมด สคริปต์ตัวอย่าง:
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
}
ปรากฎดังนี้:
เหลืออีก 723 วัน เกือบสองปีจนกว่าใบรับรองจะหมดอายุ เป็นเรื่องที่สมเหตุสมผล เนื่องจากเมื่อไม่นานมานี้ฉันได้ออกใบรับรองสำหรับม้านั่งทดสอบ Exchange อีกครั้ง
มันเป็นตัวเลือกที่ง่าย อาจมีคนพอใจกับสิ่งนี้ แต่เราต้องการมากกว่านี้ เรากำหนดหน้าที่ของตัวเองในการรับรายการใบรับรองทั้งหมดบนเซิร์ฟเวอร์ ตามชื่อ และให้แต่ละรายการดูจำนวนวันที่เหลือจนกว่าใบรับรองจะหมดอายุ
ตัวเลือกที่สองค่อนข้างซับซ้อนกว่าเล็กน้อย
เราแก้ไขการกำหนดค่าตัวแทนอีกครั้ง และที่นั่น แทนที่จะบรรทัดด้วย ExternalParameter เราเขียนอีกสองรายการ:
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
В รายการภายนอก เราเพิ่งได้รับรายการสตริง ในกรณีของเรา รายการสตริงที่มีชื่อใบรับรอง เราจะได้รับรายการบรรทัดเหล่านี้โดยใช้สคริปต์ รายชื่อ - HTTPS ชื่อใบรับรอง.
สคริปต์ 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)"
}
}
และเข้าแล้ว พารามิเตอร์ภายนอก เราป้อนแถวจากรายการ ExternalList และที่ผลลัพธ์ เราจะได้จำนวนวันเท่ากันสำหรับแต่ละรายการ ตัวระบุคือรหัสประจำตัวของใบรับรอง โปรดทราบว่า HTTPS.CertificateExpireDate มีเครื่องหมายดอกจัน (*) ในตัวแปรนี้ นี่เป็นสิ่งจำเป็นเพื่อให้สามารถยอมรับตัวแปรภายนอกได้ เพียงแค่ CertificateId ของเรา
สคริปต์ 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)"
}
ในการกำหนดค่าการรวบรวมข้อมูลของเซิร์ฟเวอร์ เราสร้างพารามิเตอร์ใหม่ ในพารามิเตอร์เราเลือกของเรา HTTPS.CertificateExpireDate(*) จากรายการ และ (โปรดทราบ!) เปลี่ยนเครื่องหมายดอกจันเป็น {ตัวอย่าง}. จุดสำคัญนี้จะช่วยให้คุณสร้างตัวนับแยกต่างหากสำหรับแต่ละอินสแตนซ์ (ใบรับรอง) ส่วนที่เหลือกรอกเหมือนในเวอร์ชันก่อนหน้า:
ในการที่จะมีสิ่งที่จะสร้างตัวนับ บนแท็บ Instance Discovery คุณต้องเลือก Agent List จากรายการ และในฟิลด์ List Name ให้ป้อนชื่อของ ExternalList ของเราจากสคริปต์ - HTTPS.CertificateNames
เกือบจะพร้อมแล้ว โปรดรอสักครู่หรือบังคับ Poll > Configuration and Poll > Instance Discovery หากเป็นไปไม่ได้เลยที่จะรอ ด้วยเหตุนี้ เราจึงได้รับใบรับรองทั้งหมดที่มีระยะเวลาใช้งานได้:
อะไรที่คุณต้องการ? ใช่แล้ว มีเพียงหนอนแห่งความสมบูรณ์แบบเท่านั้นที่มองรอยนิ้วหัวแม่มือที่ไม่จำเป็นนี้ในนามของเคาน์เตอร์ด้วยสายตาเศร้าโศกและไม่ยอมให้ฉันอ่านบทความให้จบ หากต้องการป้อนให้เปิดคุณสมบัติตัวนับอีกครั้งและบนแท็บ Instance Discovery ในช่อง "สคริปต์ตัวกรองการค้นพบอินสแตนซ์" ให้เพิ่มอันที่เขียนไว้
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
ซึ่งจะกรอง Thumbprint:
และหากต้องการแสดงตัวกรองนั้น บนแท็บทั่วไปในช่องคำอธิบาย ให้เปลี่ยน CertificateExpireDate: {instance} เป็น CertificateExpireDate: {ชื่ออินสแตนซ์}:
เพียงเท่านี้ก็ถึงเส้นชัยจาก KDPV แล้ว:
มันไม่สวยเหรอ?
สิ่งที่เหลืออยู่คือการตั้งค่าการแจ้งเตือนเพื่อให้มาถึงทางอีเมลเมื่อใบรับรองหมดอายุ
1. ก่อนอื่น เราต้องสร้างเทมเพลตเหตุการณ์เพื่อเปิดใช้งานเมื่อค่าตัวนับลดลงถึงเกณฑ์ที่เราตั้งไว้ ใน การกำหนดค่าเหตุการณ์ มาสร้างเทมเพลตใหม่สองเทมเพลตที่มีชื่อดังนี้ ใบรับรองExpireDate_Threshold_Activate พร้อมสถานะคำเตือน:
และที่คล้ายกัน ใบรับรองExpireDate_Threshold_Deactivate ด้วยสถานะปกติ
2. ถัดไป ไปที่คุณสมบัติตัวนับและตั้งค่าเกณฑ์บนแท็บ Tresholds:
โดยที่เราเลือกเหตุการณ์ที่เราสร้างไว้ CertificateExpireDate_Threshold_Activate และ CertificateExpireDate_Threshold_Deactivate กำหนดจำนวนตัวอย่าง (ตัวอย่าง) เป็น 1 (โดยเฉพาะสำหรับตัวนับนี้ไม่มีจุดในการตั้งค่าเพิ่มเติม) ค่าคือ 30 (วัน) เช่น และที่สำคัญคือตั้งค่า เวลาที่เกิดซ้ำของเหตุการณ์ สำหรับใบรับรองที่ใช้งานจริง ฉันตั้งค่าวันละครั้ง (86400 วินาที) มิฉะนั้นคุณอาจจมอยู่ในการแจ้งเตือน (ซึ่งบังเอิญเกิดขึ้นครั้งเดียวมากจนกล่องจดหมายเต็มในช่วงสุดสัปดาห์) สำหรับเวลาในการแก้ไขจุดบกพร่อง ควรตั้งค่าให้ต่ำลง เช่น 60 วินาที เป็นต้น
3.In การกำหนดค่าการดำเนินการ สร้างเทมเพลตจดหมายแจ้งเตือนดังนี้:
%m, %S และอื่นๆ ทั้งหมดเหล่านี้ — มาโครที่จะแทนที่ค่าจากพารามิเตอร์ของเรา พวกเขาจะอธิบายรายละเอียดเพิ่มเติมใน
4. และสุดท้ายก็รวมประเด็นก่อนหน้าเข้าด้วยกัน นโยบายการประมวลผลเหตุการณ์ สร้างกฎตามที่จะสร้างการเตือนและจดหมายจะถูกส่งไป:
เราบันทึกนโยบายไว้ ทุกอย่างสามารถทดสอบได้ มาตั้งเกณฑ์ให้สูงขึ้นเพื่อตรวจสอบกัน ใบรับรองที่ใกล้ที่สุดของฉันจะหมดอายุใน 723 วัน ฉันตั้งค่าเป็น 724 เพื่อตรวจสอบ ด้วยเหตุนี้ เราจึงได้รับการแจ้งเตือนต่อไปนี้:
และการแจ้งเตือนทางอีเมลนี้:
นั่นคือทั้งหมดที่แน่นอนตอนนี้ แน่นอนว่าเป็นไปได้ที่จะตั้งค่าแดชบอร์ดและสร้างกราฟ แต่สำหรับใบรับรอง สิ่งเหล่านี้อาจเป็นเส้นตรงที่ไม่มีความหมายและน่าเบื่อ ซึ่งแตกต่างจากกราฟของโปรเซสเซอร์หรือโหลดหน่วยความจำ เป็นต้น แต่เพิ่มเติมเกี่ยวกับเรื่องนี้ในบางครั้ง
ที่มา: will.com