ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

НСдавно Ρƒ нас встала Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° срока дСйствия сСртификатов Π½Π° сСрвСрах с Windows. Ну ΠΊΠ°ΠΊ встала, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сСртификаты нСсколько Ρ€Π°Π· ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ Π² Ρ‚Ρ‹ΠΊΠ²Ρƒ, Π² Ρ‚ΠΎ самоС врСмя, ΠΊΠΎΠ³Π΄Π° отвСтствСнный Π·Π° ΠΈΡ… ΠΏΡ€ΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡ€ΠΎΠ΄Π°Ρ‚Ρ‹ΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° находился Π² отпускС. ПослС этого ΠΌΡ‹ с Π½ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π°ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΠ»ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π°Π΄ этим Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас Π½Π΅ спСша внСдряСтся систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° NetXMS, ΠΎΠ½Π° ΠΈ стала Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΈ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, СдинствСнным ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ Π½Π° эту Π·Π°Π΄Π°Ρ‡Ρƒ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

А сам процСсс Π΄Π°Π»Π΅Π΅.

ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ. ВстроСнного счСтчика Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ срока сСртификатов Π² NetXMS Π½Π΅Ρ‚, поэтому Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свой ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрипты для обСспСчСния Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° Powershell, это ΠΆΠ΅ Windows. Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС сСртификаты Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС, Π²Π·ΡΡ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° срок ΠΈΡ… истСчСния Π² днях ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ это число Π² NetXMS. Π§Π΅Ρ€Π΅Π· Π΅Π³ΠΎ Π°Π³Π΅Π½Ρ‚Π°. Π’ΠΎΡ‚ с Π½Π΅Π³ΠΎ ΠΈ Π½Π°Ρ‡Π½Π΅ΠΌ.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, самый простой. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство Π΄Π½Π΅ΠΉ Π΄ΠΎ окончания срока дСйствия сСртификата с блиТайшСй Π΄Π°Ρ‚ΠΎΠΉ.

Π§Ρ‚ΠΎΠ±Ρ‹ сСрвСр NetXMS ΡƒΠ·Π½Π°Π» ΠΎ сущСствовании нашСго кастомного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ Π°Π³Π΅Π½Ρ‚Π°. Π˜Π½Π°Ρ‡Π΅ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π΅Π³ΠΎ отсутствия. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π°Π³Π΅Π½Ρ‚Π° nxagentd.conf ΠΌΡ‹ добавляСм строку внСшнСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ HTTPS.CertificateExpireDateSimple, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прописываСм запуск скрипта:

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

Учитывая, Ρ‡Ρ‚ΠΎ скрипт запускаСтся ΠΏΠΎ сСти, Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎ Execution Policy, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ «-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: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ (Edit agent’s confuguration file), ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Save&Apply, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ, собствСнно, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС. ΠŸΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ (Poll > Configuration), Ссли совсСм Π½Π΅Ρ‚ сил ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ. ПослС этих дСйствий Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ наш кастомный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

Π’ консоли NetXMS ΠΈΠ΄Π΅ΠΌ Π² Data Collection Configuration ΠΏΠΎΠ΄ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ сСрвСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΡΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ сСртификаты ΠΈ создаСм Ρ‚Π°ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (Π² дальнСйшСм, послС настройки, Π΅ΡΡ‚ΡŒ смысл пСрСнСсти Π΅Π³ΠΎ Π² ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹). Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ HTTPS.CertificateExpireDateSimple ΠΈΠ· списка, вписываСм Description с понятным ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‚ΠΈΠΏ ставим 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"

Π’ ExternalList ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ просто список строк. Π’ нашСм случаС, список строк с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ сСртификатов. Бписок этих строк ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ скриптом. Имя списка β€” HTTPS.CertificateNames.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ 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)"
    }
}

А ΡƒΠΆΠ΅ Π² ExternalParameter ΠΌΡ‹ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Π°Π΅ΠΌ строки ΠΈΠ· списка ExternalList, Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ всё Ρ‚ΠΎ ΠΆΠ΅ количСство Π΄Π½Π΅ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ слуТит Thumbprint сСртификата. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ 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)"
}

Π’ Data Collection Configuration сСрвСра создаСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π’ Parameter Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ наш HTTPS.CertificateExpireDate(*) ΠΈΠ· списка, ΠΈ, (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!) мСняСм Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΡƒ Π½Π° {instance}. Π­Ρ‚ΠΎΡ‚ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ счСтчик для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ инстанса (сСртификата). ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ заполняСтся, ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ счСтчики Π±Ρ‹Π»ΠΎ ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Instance Discovery Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Agent List ΠΈΠ· списка ΠΈ Π² ΠΏΠΎΠ»Π΅ List Name Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ имя нашСго ExternalList ΠΈΠ· скрипта β€” HTTPS.CertificateNames.

ΠŸΠΎΡ‡Ρ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Poll > Configuration ΠΈ Poll > Instance Discovery, Ссли совсСм Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС наши сСртификаты со сроками дСйствия:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ? Ну Π΄Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чСрвячок ΠΏΠ΅Ρ€Ρ„Π΅ΠΊΡ†ΠΈΠΎΠ½ΠΈΠ·ΠΌΠ° смотрит Π½Π° этот Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ Thumbprint Π² ΠΈΠΌΠ΅Π½ΠΈ счСтчика ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π³Π»Π°Π·Π°ΠΌΠΈ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π΄Π°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π½Π°ΠΊΠΎΡ€ΠΌΠΈΡ‚ΡŒ, снова ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ свойства счСтчика ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Instance Discovery Π² ΠΏΠΎΠ»Π΅ Β«Instance discovery filter scriptΒ» добавляСм написанный Π½Π° NXSL (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ языкС NetXMS) скрипт:

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

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Thumbprint:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

А Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ General Π² ΠΏΠΎΠ»Π΅ Description мСняСм CertificateExpireDate: {instance} Π½Π° CertificateExpireDate: {instance-name}:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

Всё, Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Ρ„ΠΈΠ½ΠΈΡˆ ΠΈΠ· ΠšΠ”ΠŸΠ’:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

ΠšΡ€Π°ΡΠΎΡ‚Π° ΠΆΠ΅?

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ оповСщСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΈ Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ, ΠΊΠΎΠ³Π΄Π° срок сСртификата ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ своСму логичСскому ΠΊΠΎΠ½Ρ†Ρƒ.

1. Π‘Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ шаблон события (Event Template) для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ значСния счСтчика Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΠΏΠΎΡ€ΠΎΠ³Π°. Π’ Event Configuration создаСм Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… шаблона с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, скаТСм CertificateExpireDate_Threshold_Activate со статусом Warning:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ CertificateExpireDate_Threshold_Deactivate со статусом Normal.

2. Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅ΠΌ Π² свойства счСтчика ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Tresholds настраиваСм ΠΏΠΎΡ€ΠΎΠ³:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

Π³Π΄Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ наши созданныС эвСнты CertificateExpireDate_Threshold_Activate ΠΈ CertificateExpireDate_Threshold_Deactivate, ставим количСство Π·Π°ΠΌΠ΅Ρ€ΠΎΠ² (Samples) 1 (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ для этого счСтчика большС ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ смысла Π½Π΅Ρ‚), Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² 30 (Π΄Π½Π΅ΠΉ), ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΈ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, настраиваСм врСмя повторСния эвСнта. Для сСртификатов Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ я ΡΡ‚Π°Π²Π»ΡŽ Ρ€Π°Π· Π² сутки (86400 сСкунд), ΠΈΠ½Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΠ½ΡƒΡ‚ΡŒ Π² оповСщСниях (Ρ‡Ρ‚ΠΎ, кстати ΠΈ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ пСрСполнился ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик Π·Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅). На врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π΅ΡΡ‚ΡŒ смысл ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ помСньшС, 60 сСкунд, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ.

3. Π’ Action Configuration создаСм шаблон письма оповСщСния, Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

ВсС эти %m, %S ΠΈ Ρ‚.ΠΏ. β€” макросы, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ подставлСны значСния ΠΈΠ· нашСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ½ΠΈ описаны Π² ΠΌΠ°Π½ΡƒΠ°Π»Π΅ NetXMS.

4. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, объСдиняя ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹, Π² Event Processing Policy создаСм ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Alarm ΠΈ ΠΎΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ письмо:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

БохраняСм ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ, всё, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΠΏΠΎΡ€ΠΎΠ³ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π£ мСня блиТайший сСртификат истСкаСт Ρ‡Π΅Ρ€Π΅Π· 723 дня, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ поставил 724. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠΉ Π°Π»Π°Ρ€ΠΌ:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока дСйствия сСртификатов Π² Windows Π½Π° NetXMS

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ всё. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄, ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π½ΠΎ для сСртификатов это Π±ΡƒΠ΄ΡƒΡ‚ нСсколько бСссмыслСнныС ΠΈ скучныС прямыС Π»ΠΈΠ½ΠΈΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ процСссора ΠΈΠ»ΠΈ памяти, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Но, ΠΎΠ± этом ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com