NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Жакында биз Windows серверлеринде сертификаттардын жарактуу мөөнөтүн көзөмөлдөө милдети менен бетме-бет келдик. Ооба, сертификаттар бир нече жолу ашкабакка айланып кеткенден кийин кантип турдум, дал ошол мезгилде алардын жаңылануусуна жооптуу сакалчан кесиптеш каникулда жүргөндө. Ошондон кийин ал экөөбүз бир нерседен шектенип, ойлонуп көрүүнү чечтик. Биз NetXMS мониторинг системасын акырындап ишке киргизип жаткандыктан, ал бул милдет үчүн негизги жана, негизинен, жалгыз талапкер болуп калды.

Жыйынтык акыры төмөнкү формада алынды:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Анан процесс өзү уланып жатат.

Go. NetXMSде мөөнөтү бүтүп жаткан сертификаттар үчүн орнотулган эсептегич жок, андыктан аны маалымат менен камсыз кылуу үчүн өзүңүздүн скриптиңизди түзүп, колдонушуңуз керек. Албетте, Powershellде бул Windows. Скрипт операциялык тутумдагы бардык сертификаттарды окуп, алардын жарактуулук мөөнөтүн ошол жерден бир нече күндө алып, бул номерди NetXMSге өткөрүп бериши керек. Анын агенти аркылуу. Мына ушундан баштайбыз.

параметр One, эң жөнөкөй. Жөн гана жакынкы датасы менен күбөлүктүн жарактуулук мөөнөтү аяктаганга чейин канча күндөрдү алыңыз.

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 тандаңыз, так аты менен Сыпаттаманы киргизиңиз, түрүн бүтүн санга коюңуз жана добуш берүү аралыгын конфигурациялаңыз. Мүчүлүштүктөрдү оңдоо максатында, мисалы, аны 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
}

Бул мындай болот:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

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 тизмесинен саптарды киргизебиз жана чыгарууда ар бири үчүн бирдей сандагы күндөрдү алабыз. Идентификатор бул сертификаттын бармак изи. 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(*) тизмеден жана (көңүл буруңуз!) жылдызчаны өзгөртүңүз {мисалы}. Бул маанилүү пункт ар бир инстанция (сертификат) үчүн өзүнчө эсептегич түзүүгө мүмкүндүк берет. Калгандары мурунку версиядагыдай толтурулган:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Эсептегичтерди түзө турган нерсеге ээ болуу үчүн, Instance Discovery өтмөгүндө тизмеден Агенттин тизмесин тандап, Тизме аты талаасына скрипттен тышкы тизмебиздин атын киргизишиңиз керек - HTTPS.CertificateNames.

Дээрлик даяр, бир аз күтө туруңуз же Сурамжылоо > Конфигурация жана Сурамжылоо > Instance Discovery, эгерде күтүүгө таптакыр мүмкүн болбосо, мажбурлаңыз. Натыйжада, биз жарактуу мөөнөтү менен бардык сертификаттарды алабыз:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

сага эмне керек? Ооба, ооба, перфекционизмдин курту гана эсептегичтин атындагы бул керексиз Бармак изине кайгылуу көздөрү менен карап, макаланы бүтүрүүгө жол бербейт. Аны берүү үчүн, эсептегич касиеттерин кайра ачып, Instance Discovery өтмөгүндөгү "Инстанцияны табуу чыпкасынын сценарийи" талаасында жазылганды кошуңуз. NXSL (NetXMS ички тили) скрипти:

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

бармак изи чыпкалайт:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Жана аны чыпкаланган көрсөтүү үчүн, Сүрөттөө талаасындагы Жалпы өтмөктө, CertificateExpireDate: {instance} деп өзгөртүңүз CertificateExpireDate: {instance-name}:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Мына, акыры KDPVден марага келди:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Бул сулуулук эмеспи?

Сертификаттын мөөнөтү аяктаганда алар электрондук почта аркылуу келип турушу үчүн эскертүүлөрдү орнотуу гана калды.

1. Адегенде эсептегичтин мааниси биз койгон кандайдыр бир босогого чейин азайганда, аны иштетүү үчүн Окуя шаблонун түзүшүбүз керек. IN Окуянын конфигурациясы сыяктуу аталыштар менен эки жаңы шаблон түзөлү CertificateExpireDate_Threshold_Activate Эскертүү статусу менен:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

жана окшош CertificateExpireDate_Threshold_Deactivate Кадимки абалы менен.

2. Андан кийин, эсептегичтин касиеттерине өтүп, босогону босого өтмөккө коюңуз:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

анда биз түзүлгөн окуяларыбызды тандайбыз CertificateExpireDate_Threshold_Activate жана CertificateExpireDate_Threshold_Deactivate, үлгүлөрдүн санын (Үлгүлөр) 1ге коюңуз (тактап айтканда, бул эсептегич үчүн көбүрөөк коюунун кереги жок), маани 30 (күн), мисалы, жана эң негизгиси, коюу окуяны кайталоо убактысы. Өндүрүштөгү сертификаттар үчүн мен аны күнүнө бир жолу койдум (86400 секунд), антпесе, сиз эскертмелерге чөгүп кете аласыз (айтмакчы, бул бир жолу болгон, ошондуктан дем алыш күндөрү почта кутучасы толуп калган). Мүчүлүштүктөрдү оңдоо убактысы үчүн, мисалы, аны 60 секунддан төмөн коюу мааниси бар.

3. The Аракет конфигурациясы төмөнкүдөй билдирүү кат үлгүсүн түзүү:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Мунун баары %m, %S ж.б. — биздин параметрдин маанилери алмаштырыла турган макростор. Алар кененирээк сүрөттөлөт колдонмо NetXMS.

4. Акыр-аягы, мурунку пункттарды бириктирүү, салып Окуяларды иштетүү саясаты Ойготкуч түзүлүп, кат жөнөтүлө турган эреже түзүңүз:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Биз саясатты сактайбыз, бардыгын текшерсе болот. Текшерүү үчүн босогону жогору коёлу. Менин эң жакын сертификатымдын мөөнөтү 723 күндөн кийин бүтөт, мен аны текшерүү үчүн 724 деп койдум. Натыйжада, төмөнкү сигналды алабыз:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

жана бул электрондук почта билдирүүсү:

NetXMS боюнча Windowsта сертификаттын жарактуулук мөөнөтүн көзөмөлдөө

Мунун баары азыр анык. Албетте, аспаптар тактасын орнотуп, графиктерди түзсө болмок, бирок, мисалы, процессордун же эс жүктөөнүн графиктеринен айырмаланып, сертификаттар үчүн бул бир аз маанисиз жана кызыксыз түз сызыктар болмок. Бирок, бул тууралуу башка жолу.

Source: www.habr.com

Комментарий кошуу