Yn ddiweddar, roeddem yn wynebu'r dasg o fonitro cyfnod dilysrwydd tystysgrifau ar weinyddion Windows. Wel, sut wnes i godi ar Γ΄l i'r tystysgrifau droi'n bwmpen sawl gwaith, ar yr union adeg pan oedd y cydweithiwr barfog a oedd yn gyfrifol am eu hadnewyddu ar wyliau. Ar Γ΄l hynny, roedd ef a minnau'n amau ββrhywbeth a phenderfynu meddwl amdano. Gan ein bod yn gweithredu system fonitro NetXMS yn araf, dyma'r brif ymgeisydd ac, mewn egwyddor, yr unig ymgeisydd ar gyfer y dasg hon.
Cafwyd y canlyniad o'r diwedd yn y ffurf ganlynol:
Ac mae'r broses ei hun yn parhau.
Ewch. Nid oes cownter adeiledig ar gyfer tystysgrifau sy'n dod i ben yn NetXMS, felly mae angen i chi greu eich un eich hun a defnyddio sgriptiau i ddarparu data iddo. Wrth gwrs, ar Powershell, Windows yw hwn. Dylai'r sgript ddarllen yr holl dystysgrifau yn y system weithredu, cymryd eu dyddiad dod i ben mewn dyddiau oddi yno a throsglwyddo'r rhif hwn i NetXMS. Trwy ei asiant. Dyna lle byddwn ni'n dechrau.
Opsiwn Un, symlaf. Yn syml, mynnwch nifer y dyddiau tan ddyddiad dod i ben y dystysgrif gyda'r dyddiad agosaf.
Er mwyn i weinydd NetXMS wybod am fodolaeth ein paramedr arferol, rhaid iddo ei dderbyn gan yr asiant. Fel arall, ni ellir ychwanegu'r paramedr hwn oherwydd ei absenoldeb. Felly, yn y ffeil ffurfweddu asiant nxagentd.conf rydym yn ychwanegu llinyn paramedr allanol o'r enw HTTPS.CertificateExpireDateSimple, lle rydym yn cofrestru lansiad y sgript:
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"
O ystyried bod y sgript yn cael ei lansio dros y rhwydwaith, mae angen i chi gofio am
O ganlyniad, mae'r ffurfwedd asiant yn edrych rhywbeth fel hyn:
#
# 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"
Ar Γ΄l hyn, mae angen i chi arbed y config ac ailgychwyn yr asiant. Gallwch chi wneud hyn o'r consol NetXMS: agorwch y ffurfwedd (Golygu ffeil cyfluniad asiant), ei olygu, gweithredu Save & Apply, ac o ganlyniad, mewn gwirionedd, bydd yr un peth yn digwydd. Yna ailddarllenwch y ffurfweddiad (PΓ΄l> Ffurfweddu), os nad oes gennych y cryfder i aros o gwbl. Ar Γ΄l y camau hyn, dylech allu ychwanegu ein paramedr arferol.
Yn y consol NetXMS ewch i Ffurfweddiad Casglu Data gweinydd arbrofol yr ydym yn mynd i fonitro tystysgrifau arno a chreu paramedr newydd yno (yn y dyfodol, ar Γ΄l cyfluniad, mae'n gwneud synnwyr ei drosglwyddo i dempledi). Dewiswch HTTPS.CertificateExpireDateSimple o'r rhestr, rhowch Ddisgrifiad gydag enw clir, gosodwch y math i Gyfanrif a ffurfweddwch y cyfwng pleidleisio. At ddibenion dadfygio, mae'n gwneud synnwyr i'w wneud yn fyrrach, 30 eiliad, er enghraifft. Popeth yn barod, dyna ddigon am y tro.
Gallwch wirio ... na, mae'n rhy gynnar. Nawr, wrth gwrs, ni chawn unrhyw beth. Yn syml oherwydd nad yw'r sgript wedi'i ysgrifennu eto. Gadewch i ni gywiro'r hepgoriad hwn. Yn syml, bydd y sgript yn dangos rhif, sef nifer y dyddiau sy'n weddill nes bod y dystysgrif yn dod i ben. Y lleiaf oll sydd ar gael. Sgript enghreifftiol:
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
}
Mae'n troi allan fel hyn:
723 diwrnod, bron i ddwy flynedd ar Γ΄l nes i'r dystysgrif ddod i ben. Mae'n rhesymegol, oherwydd fe wnes i ailgyhoeddi tystysgrifau ar gyfer mainc prawf Exchange yn eithaf diweddar.
Roedd yn opsiwn hawdd. Mae'n debyg y bydd rhywun yn fodlon Γ’ hyn, ond roedden ni eisiau mwy. Fe wnaethom osod y dasg i ni ein hunain o gael rhestr o'r holl dystysgrifau ar y gweinydd, yn Γ΄l enw, ac i bob un weld nifer y dyddiau sy'n weddill nes bod y dystysgrif yn dod i ben.
Yr ail opsiwn, ychydig yn fwy cymhleth.
Unwaith eto rydym yn golygu'r ffurfwedd asiant ac yno, yn lle'r llinell gyda ExternalParameter, rydym yn ysgrifennu dau arall:
ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"
Π Rhestr Allanol rydym yn unig yn cael rhestr o dannau. Yn ein hachos ni, rhestr o linynnau gydag enwau tystysgrifau. Byddwn yn derbyn rhestr o'r llinellau hyn gan ddefnyddio'r sgript. Enw rhestr - HTTPS.Enwau Tystysgrif.
Sgript 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)"
}
}
Ac eisoes i mewn Paramedr Allanol Rydyn ni'n mewnbynnu rhesi o'r rhestr ExternalList, ac yn yr allbwn rydyn ni'n cael yr un nifer o ddyddiau ar gyfer pob un. Y dynodwr yw Bawdlun y dystysgrif. Sylwch fod HTTPS.CertificateExpireDate yn cynnwys seren (*) yn yr amrywiad hwn. Mae hyn yn angenrheidiol fel ei fod yn derbyn newidynnau allanol, dim ond ein TystysgrifId.
Sgript 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)"
}
Yn Ffurfweddiad Casglu Data'r gweinydd, rydym yn creu paramedr newydd. Yn Paramedr rydym yn dewis ein Dyddiad Dod i Ben Tystysgrif HTTPS.(*) o'r rhestr, a (sylw!) newid y seren i {enghraifft}. Bydd y pwynt pwysig hwn yn caniatΓ‘u ichi greu rhifydd ar wahΓ’n ar gyfer pob achos (tystysgrif). Mae'r gweddill wedi'i lenwi fel yn y fersiwn flaenorol:
Er mwyn cael rhywbeth i greu rhifyddion ohono, ar y tab Instance Discovery mae angen i chi ddewis Rhestr Asiant o'r rhestr ac yn y maes Enw Rhestr rhowch enw ein ExternalList o'r sgript - HTTPS.CertificateNames.
Bron yn barod, arhoswch ychydig neu gorfodi PΓ΄l > Ffurfweddu a Phleidlais > Darganfod Enghreifftiol os yw'n gwbl amhosibl aros. O ganlyniad, rydym yn cael ein holl dystysgrifau gyda chyfnodau dilysrwydd:
Beth sydd ei angen arnoch chi? Wel, ie, dim ond mwydyn perffeithrwydd sy'n edrych ar y Bawdlun diangen hwn yn enw'r cownter gyda llygaid trist ac nid yw'n gadael i mi orffen yr erthygl. Er mwyn ei fwydo, agorwch briodweddau'r cownter eto ac ar y tab Instance Discovery, yn y maes "Sgript hidlo darganfod Instance", ychwanegwch yr un sydd wedi'i ysgrifennu yn
instance = $1;
if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
{
return %(true, instance, $1);
}
return true;
a fydd yn hidlo Thumbprint:
Ac i'w ddangos wedi'i hidlo, ar y tab Cyffredinol yn y maes Disgrifiad, newidiwch CertificateExpireDate: {instance} i Tystysgrif Dod i Ben: {instance-name}:
Dyna ni, yn olaf y llinell derfyn gan KDPV:
Onid yw'n harddwch?
Y cyfan sydd ar Γ΄l yw gosod rhybuddion fel eu bod yn cyrraedd trwy e-bost pan ddaw'r dystysgrif i ben.
1. Yn gyntaf mae angen i ni greu Templed Digwyddiad i'w actifadu pan fydd gwerth y cownter yn gostwng i ryw drothwy a osodwyd gennym. YN Ffurfweddu Digwyddiad gadewch i ni greu dau dempled newydd gydag enwau fel CertificateExpireDate_Threshold_Activate gyda statws rhybudd:
a chyffelyb TystysgrifExpireDate_Threshold_Analluogi gyda statws Normal.
2. Nesaf, ewch i briodweddau'r cownter a gosodwch y trothwy ar y tab Tresholds:
lle rydym yn dewis ein digwyddiadau a grΓ«wyd TystysgrifExpireDate_Threshold_Activate a CertificateExpireDate_Threshold_Deactivate, gosodwch nifer y samplau (Samplau) i 1 (yn benodol ar gyfer y rhifydd hwn nid oes unrhyw bwynt gosod mwy), y gwerth yw 30 (diwrnod), er enghraifft, ac, yn bwysig, gosod amser ailadrodd y digwyddiad. Ar gyfer tystysgrifau cynhyrchu, rwy'n ei osod unwaith y dydd (86400 eiliad), fel arall gallwch chi foddi mewn hysbysiadau (sydd, gyda llaw, wedi digwydd unwaith, cymaint fel bod y blwch post yn llawn dros y penwythnos). Ar gyfer amser dadfygio, mae'n gwneud synnwyr ei osod yn is, 60 eiliad, er enghraifft.
3. Yn Ffurfweddiad Gweithred creu templed llythyr hysbysu, fel hyn:
Mae'r rhain i gyd %m, %S, ac ati. β macros y bydd gwerthoedd o'n paramedr yn cael eu rhoi yn eu lle. Fe'u disgrifir yn fanylach yn
4. Ac yn olaf, gan gyfuno y pwyntiau blaenorol, yn Polisi Prosesu Digwyddiadau creu rheol ar gyfer creu Larwm ac anfon llythyr:
Rydym yn achub y polisi, gellir profi popeth. Gadewch i ni osod y trothwy yn uwch i'w wirio. Mae fy nhystysgrif agosaf yn dod i ben mewn 723 diwrnod, gosodais hi i 724 i'w gwirio. O ganlyniad, rydyn ni'n cael y larwm canlynol:
a'r hysbysiad e-bost hwn:
Dyna i gyd yn sicr nawr. Byddai'n bosibl, wrth gwrs, sefydlu dangosfwrdd ac adeiladu graffiau, ond ar gyfer tystysgrifau byddai'r rhain braidd yn ddiystyr a llinellau syth diflas, yn wahanol i graffiau o brosesydd neu lwyth cof, er enghraifft. Ond, mwy am hyn ryw dro arall.
Ffynhonnell: hab.com