Kamakailan ay nahaharap kami sa gawain ng pagsubaybay sa panahon ng bisa ng mga sertipiko sa mga server ng Windows. Buweno, kung paano ako bumangon matapos ang mga sertipiko ay naging kalabasa nang maraming beses, sa mismong oras na ang may balbas na kasamahan na responsable para sa kanilang pag-renew ay nasa bakasyon. Pagkatapos noon, siya at ako ay naghinala ng isang bagay at nagpasya na pag-isipan ito. Dahil dahan-dahan nating ipinapatupad ang NetXMS monitoring system, ito ang naging pangunahing at, sa prinsipyo, ang tanging kandidato para sa gawaing ito.
Ang resulta ay sa wakas ay nakuha sa sumusunod na anyo:
At ang proseso mismo ay nagpapatuloy.
Pumunta ka. Walang built-in na counter para sa mga nag-e-expire na certificate sa NetXMS, kaya kailangan mong lumikha ng iyong sarili at gumamit ng mga script upang mabigyan ito ng data. Siyempre, sa Powershell, ito ay Windows. Dapat basahin ng script ang lahat ng mga sertipiko sa operating system, kunin ang kanilang expiration date sa mga araw mula doon at ipasa ang numerong ito sa NetXMS. Sa pamamagitan ng kanyang ahente. Doon na tayo magsisimula.
Pagpipilian Isa, pinakasimple. Kunin lamang ang bilang ng mga araw hanggang sa petsa ng pag-expire ng sertipiko na may pinakamalapit na petsa.
Para malaman ng NetXMS server ang tungkol sa pagkakaroon ng aming custom na parameter, dapat itong matanggap mula sa ahente. Kung hindi, hindi maidaragdag ang parameter na ito dahil sa kawalan nito. Samakatuwid, sa file ng pagsasaayos ng ahente nxagentd.conf nagdagdag kami ng panlabas na parameter string na tinatawag HTTPS.CertificateExpireDateSimple, kung saan inirehistro namin ang paglulunsad ng script:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
Isinasaalang-alang na ang script ay inilunsad sa network, kailangan mong tandaan ang tungkol sa
Bilang resulta, ganito ang hitsura ng config ng ahente:
#
# 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"
Pagkatapos nito, kailangan mong i-save ang config at i-restart ang ahente. Magagawa mo ito mula sa NetXMS console: buksan ang config (I-edit ang configuration file ng ahente), i-edit ito, i-execute ang Save&Apply, bilang resulta kung saan, sa katunayan, ang parehong bagay ang mangyayari. Pagkatapos ay basahin muli ang configuration (Poll > Configuration), kung wala kang lakas na maghintay. Pagkatapos ng mga hakbang na ito, dapat mong maidagdag ang aming custom na parameter.
Sa NetXMS console pumunta sa Configuration ng Pagkolekta ng Data pang-eksperimentong server kung saan susubaybayan namin ang mga sertipiko at lumikha ng isang bagong parameter doon (sa hinaharap, pagkatapos ng pagsasaayos, makatuwirang ilipat ito sa mga template). Piliin ang HTTPS.CertificateExpireDateSimple mula sa listahan, magpasok ng Paglalarawan na may malinaw na pangalan, itakda ang uri sa Integer at i-configure ang pagitan ng botohan. Para sa mga layunin ng pag-debug, makatuwirang gawin itong mas maikli, 30 segundo, halimbawa. Handa na ang lahat, sapat na iyon sa ngayon.
Maaari mong suriin... hindi, masyadong maaga. Ngayon, siyempre, wala tayong makukuha. Dahil hindi pa nasusulat ang script. Itama natin ang pagkukulang na ito. Ang script ay magpapakita lamang ng isang numero, ang bilang ng mga araw na natitira hanggang sa mag-expire ang certificate. Ang pinaka-minimal sa lahat ng magagamit. Halimbawa ng script:
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
}
Ito ay tulad nito:
723 araw, halos dalawang taon na lang bago mag-expire ang certificate. Lohikal ito, dahil nag-isyu ulit ako ng mga certificate para sa Exchange test bench kamakailan lang.
Ito ay isang madaling opsyon. Malamang, may makukuntento dito, pero gusto pa namin. Itinakda namin sa aming sarili ang gawain ng pagkuha ng isang listahan ng lahat ng mga sertipiko sa server, ayon sa pangalan, at para sa bawat isa upang makita ang bilang ng mga araw na natitira hanggang sa mag-expire ang sertipiko.
Ang ikalawang opsyon, medyo mas kumplikado.
Muli naming i-edit ang config ng ahente at doon, sa halip na linya na may ExternalParameter, sumulat kami ng dalawa pa:
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
Π ExternalList nakakakuha lang kami ng listahan ng mga string. Sa aming kaso, isang listahan ng mga string na may mga pangalan ng sertipiko. Makakatanggap kami ng listahan ng mga linyang ito gamit ang script. Pangalan ng listahan - HTTPS.CertificateNames.
Script 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)"
}
}
At nakapasok na ExternalParameter Nag-input kami ng mga row mula sa listahan ng ExternalList, at sa output ay nakukuha namin ang parehong bilang ng mga araw para sa bawat isa. Ang identifier ay ang Thumbprint ng certificate. Tandaan na ang HTTPS.CertificateExpireDate ay naglalaman ng asterisk (*) sa variant na ito. Ito ay kinakailangan upang matanggap nito ang mga panlabas na variable, ang aming CertificateId lamang.
Script 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)"
}
Sa Data Collection Configuration ng server, gumawa kami ng bagong parameter. Sa Parameter pipiliin namin ang aming HTTPS.CertificateExpireDate(*) mula sa listahan, at (pansin!) baguhin ang asterisk sa {instance}. Ang mahalagang puntong ito ay magbibigay-daan sa iyo na lumikha ng isang hiwalay na counter para sa bawat pagkakataon (sertipiko). Ang natitira ay napunan tulad ng sa nakaraang bersyon:
Upang magkaroon ng lilikha ng mga counter, sa tab na Pagtuklas ng Instance kailangan mong piliin ang Listahan ng Ahente mula sa listahan at sa field ng Pangalan ng Listahan ipasok ang pangalan ng aming ExternalList mula sa script - HTTPS.CertificateNames.
Halos handa na, maghintay ng kaunti o pilitin ang Poll > Configuration at Poll > Instance Discovery kung ganap na imposibleng maghintay. Bilang resulta, nakukuha namin ang lahat ng aming mga sertipiko na may mga panahon ng bisa:
Ano'ng kailangan mo? Well, oo, tanging ang uod ng pagiging perpekto ang tumitingin sa hindi kinakailangang Thumbprint na ito sa pangalan ng counter na may malungkot na mga mata at hindi ako hinahayaan na tapusin ang artikulo. Para pakainin ito, buksang muli ang mga counter property at sa tab na Pagtuklas ng Instance, sa field na "Script ng filter ng pagtuklas ng Instance," idagdag ang nakasulat sa
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
na mag-filter ng Thumbprint:
At para ipakita itong na-filter, sa tab na Pangkalahatan sa field ng Paglalarawan, baguhin ang CertificateExpireDate: {instance} sa CertificateExpireDate: {instance-name}:
Iyon lang, sa wakas ang linya ng pagtatapos mula sa KDPV:
Hindi ba kagandahan?
Ang natitira na lang ay mag-set up ng mga alerto upang makarating sila sa pamamagitan ng email kapag nag-expire ang certificate.
1. Una, kailangan naming gumawa ng Template ng Kaganapan upang i-activate ito kapag bumaba ang counter value sa ilang threshold na itinakda namin. SA Configuration ng Kaganapan gumawa tayo ng dalawang bagong template na may mga pangalan tulad ng CertificateExpireDate_Threshold_Activate na may status ng Babala:
at katulad CertificateExpireDate_Threshold_Deactivate na may Normal na katayuan.
2. Susunod, pumunta sa mga counter property at itakda ang threshold sa tab na Mga Treshold:
kung saan pipiliin namin ang aming ginawang mga kaganapan na CertificateExpireDate_Threshold_Activate at CertificateExpireDate_Threshold_Deactivate, itakda ang bilang ng mga sample (Mga Sample) sa 1 (partikular para sa counter na ito ay walang punto sa pagtatakda ng higit pa), ang halaga ay 30 (araw), halimbawa, at, mahalaga, itakda ang oras ng pag-uulit ng kaganapan. Para sa mga sertipiko sa produksyon, itinakda ko ito isang beses sa isang araw (86400 segundo), kung hindi, maaari kang malunod sa mga abiso (na, sa pamamagitan ng paraan, nangyari nang isang beses, kaya't ang mailbox ay puno sa katapusan ng linggo). Para sa oras ng pag-debug, makatuwirang itakda ito nang mas mababa, 60 segundo, halimbawa.
3. In Pagsasaayos ng Aksyon lumikha ng template ng sulat ng notification, tulad nito:
Lahat ng %m, %S, atbp. β mga macro kung saan ang mga halaga mula sa aming parameter ay papalitan. Ang mga ito ay inilarawan nang mas detalyado sa
4. At sa wakas, pagsasama-sama ng mga nakaraang puntos, sa Patakaran sa Pagproseso ng Kaganapan lumikha ng isang panuntunan ayon sa kung saan ang isang Alarm ay gagawin at isang sulat ay ipapadala:
I-save namin ang patakaran, lahat ay maaaring masuri. Let's set the threshold higher to check. Ang aking pinakamalapit na certificate ay mag-e-expire sa loob ng 723 araw, itinakda ko ito sa 724 upang suriin. Bilang resulta, nakuha namin ang sumusunod na alarma:
at ang abiso sa email na ito:
Iyon lang ang sigurado ngayon. Posible, siyempre, na mag-set up ng isang dashboard at bumuo ng mga graph, ngunit para sa mga sertipiko ang mga ito ay medyo walang kahulugan at nakakainip na mga tuwid na linya, hindi tulad ng mga graph ng processor o memory load, halimbawa. Ngunit, higit pa tungkol dito sa ibang pagkakataon.
Pinagmulan: www.habr.com