การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

เมื่อเร็ว ๆ นี้เราต้องเผชิญกับงานตรวจสอบระยะเวลาที่ถูกต้องของใบรับรองบนเซิร์ฟเวอร์ Windows ฉันลุกขึ้นได้อย่างไรหลังจากใบรับรองกลายเป็นฟักทองหลายครั้งในเวลาเดียวกับที่เพื่อนร่วมงานมีหนวดมีเคราที่รับผิดชอบในการต่ออายุอยู่ในช่วงพักร้อน หลังจากนั้นเขากับฉันเกิดความสงสัยบางอย่างจึงตัดสินใจคิดดู เนื่องจากเรากำลังใช้ระบบตรวจสอบ NetXMS อย่างช้าๆ ระบบจึงกลายเป็นระบบหลักและโดยหลักการแล้ว เป็นเพียงตัวเลือกเดียวสำหรับงานนี้

ในที่สุดผลลัพธ์ก็ได้รับในรูปแบบต่อไปนี้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

และกระบวนการนี้ก็ดำเนินต่อไป

ไป. ไม่มีตัวนับในตัวสำหรับการหมดอายุใบรับรองใน NetXMS ดังนั้นคุณจึงต้องสร้างของคุณเองและใช้สคริปต์เพื่อจัดเตรียมข้อมูล แน่นอนบน Powershell นี่คือ Windows สคริปต์ควรอ่านใบรับรองทั้งหมดในระบบปฏิบัติการ จากนั้นใช้วันหมดอายุเป็นวันจากนั้นจึงส่งต่อหมายเลขนี้ไปยัง NetXMS ผ่านทางตัวแทนของเขา นั่นคือจุดที่เราจะเริ่มต้น

ตัวเลือกที่หนึ่ง, ง่ายที่สุด เพียงรับจำนวนวันจนถึงวันหมดอายุของใบรับรองพร้อมวันที่ที่ใกล้ที่สุด

เพื่อให้เซิร์ฟเวอร์ NetXMS ทราบเกี่ยวกับการมีอยู่ของพารามิเตอร์ที่กำหนดเองของเรา จะต้องได้รับจากตัวแทน มิฉะนั้นจะไม่สามารถเพิ่มพารามิเตอร์นี้ได้เนื่องจากไม่มีอยู่ ดังนั้นในไฟล์คอนฟิกูเรชันเอเจนต์ nxagentd.conf เราเพิ่มสตริงพารามิเตอร์ภายนอกที่เรียกว่า HTTPS.CertificateExpireDateSimpleซึ่งเราลงทะเบียนการเปิดตัวสคริปต์:

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

เมื่อพิจารณาว่าสคริปต์เปิดตัวผ่านเครือข่าย คุณต้องจำไว้ นโยบายการดำเนินการและอย่าลืมอีกอันหนึ่ง “-NoLogo -NoProfile -NonInteractive” ซึ่งฉันละไว้เพื่อให้อ่านโค้ดได้ดีขึ้น

ด้วยเหตุนี้ การกำหนดค่าตัวแทนจึงมีลักษณะดังนี้:

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

ปรากฎดังนี้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

เหลืออีก 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(*) จากรายการ และ (โปรดทราบ!) เปลี่ยนเครื่องหมายดอกจันเป็น {ตัวอย่าง}. จุดสำคัญนี้จะช่วยให้คุณสร้างตัวนับแยกต่างหากสำหรับแต่ละอินสแตนซ์ (ใบรับรอง) ส่วนที่เหลือกรอกเหมือนในเวอร์ชันก่อนหน้า:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

ในการที่จะมีสิ่งที่จะสร้างตัวนับ บนแท็บ Instance Discovery คุณต้องเลือก Agent List จากรายการ และในฟิลด์ List Name ให้ป้อนชื่อของ ExternalList ของเราจากสคริปต์ - HTTPS.CertificateNames

เกือบจะพร้อมแล้ว โปรดรอสักครู่หรือบังคับ Poll > Configuration and Poll > Instance Discovery หากเป็นไปไม่ได้เลยที่จะรอ ด้วยเหตุนี้ เราจึงได้รับใบรับรองทั้งหมดที่มีระยะเวลาใช้งานได้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

อะไรที่คุณต้องการ? ใช่แล้ว มีเพียงหนอนแห่งความสมบูรณ์แบบเท่านั้นที่มองรอยนิ้วหัวแม่มือที่ไม่จำเป็นนี้ในนามของเคาน์เตอร์ด้วยสายตาเศร้าโศกและไม่ยอมให้ฉันอ่านบทความให้จบ หากต้องการป้อนให้เปิดคุณสมบัติตัวนับอีกครั้งและบนแท็บ Instance Discovery ในช่อง "สคริปต์ตัวกรองการค้นพบอินสแตนซ์" ให้เพิ่มอันที่เขียนไว้ NXSL สคริปต์ (ภาษาภายใน NetXMS):

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

ซึ่งจะกรอง Thumbprint:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

และหากต้องการแสดงตัวกรองนั้น บนแท็บทั่วไปในช่องคำอธิบาย ให้เปลี่ยน CertificateExpireDate: {instance} เป็น CertificateExpireDate: {ชื่ออินสแตนซ์}:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

เพียงเท่านี้ก็ถึงเส้นชัยจาก KDPV แล้ว:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

มันไม่สวยเหรอ?

สิ่งที่เหลืออยู่คือการตั้งค่าการแจ้งเตือนเพื่อให้มาถึงทางอีเมลเมื่อใบรับรองหมดอายุ

1. ก่อนอื่น เราต้องสร้างเทมเพลตเหตุการณ์เพื่อเปิดใช้งานเมื่อค่าตัวนับลดลงถึงเกณฑ์ที่เราตั้งไว้ ใน การกำหนดค่าเหตุการณ์ มาสร้างเทมเพลตใหม่สองเทมเพลตที่มีชื่อดังนี้ ใบรับรองExpireDate_Threshold_Activate พร้อมสถานะคำเตือน:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

และที่คล้ายกัน ใบรับรองExpireDate_Threshold_Deactivate ด้วยสถานะปกติ

2. ถัดไป ไปที่คุณสมบัติตัวนับและตั้งค่าเกณฑ์บนแท็บ Tresholds:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

โดยที่เราเลือกเหตุการณ์ที่เราสร้างไว้ CertificateExpireDate_Threshold_Activate และ CertificateExpireDate_Threshold_Deactivate กำหนดจำนวนตัวอย่าง (ตัวอย่าง) เป็น 1 (โดยเฉพาะสำหรับตัวนับนี้ไม่มีจุดในการตั้งค่าเพิ่มเติม) ค่าคือ 30 (วัน) เช่น และที่สำคัญคือตั้งค่า เวลาที่เกิดซ้ำของเหตุการณ์ สำหรับใบรับรองที่ใช้งานจริง ฉันตั้งค่าวันละครั้ง (86400 วินาที) มิฉะนั้นคุณอาจจมอยู่ในการแจ้งเตือน (ซึ่งบังเอิญเกิดขึ้นครั้งเดียวมากจนกล่องจดหมายเต็มในช่วงสุดสัปดาห์) สำหรับเวลาในการแก้ไขจุดบกพร่อง ควรตั้งค่าให้ต่ำลง เช่น 60 วินาที เป็นต้น

3.In การกำหนดค่าการดำเนินการ สร้างเทมเพลตจดหมายแจ้งเตือนดังนี้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

%m, %S และอื่นๆ ทั้งหมดเหล่านี้ — มาโครที่จะแทนที่ค่าจากพารามิเตอร์ของเรา พวกเขาจะอธิบายรายละเอียดเพิ่มเติมใน คู่มือ NetXMS.

4. และสุดท้ายก็รวมประเด็นก่อนหน้าเข้าด้วยกัน นโยบายการประมวลผลเหตุการณ์ สร้างกฎตามที่จะสร้างการเตือนและจดหมายจะถูกส่งไป:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

เราบันทึกนโยบายไว้ ทุกอย่างสามารถทดสอบได้ มาตั้งเกณฑ์ให้สูงขึ้นเพื่อตรวจสอบกัน ใบรับรองที่ใกล้ที่สุดของฉันจะหมดอายุใน 723 วัน ฉันตั้งค่าเป็น 724 เพื่อตรวจสอบ ด้วยเหตุนี้ เราจึงได้รับการแจ้งเตือนต่อไปนี้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

และการแจ้งเตือนทางอีเมลนี้:

การตรวจสอบวันหมดอายุของใบรับรองใน Windows บน NetXMS

นั่นคือทั้งหมดที่แน่นอนตอนนี้ แน่นอนว่าเป็นไปได้ที่จะตั้งค่าแดชบอร์ดและสร้างกราฟ แต่สำหรับใบรับรอง สิ่งเหล่านี้อาจเป็นเส้นตรงที่ไม่มีความหมายและน่าเบื่อ ซึ่งแตกต่างจากกราฟของโปรเซสเซอร์หรือโหลดหน่วยความจำ เป็นต้น แต่เพิ่มเติมเกี่ยวกับเรื่องนี้ในบางครั้ง

ที่มา: will.com

เพิ่มความคิดเห็น