NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Жақында біз Windows серверлерінде сертификаттардың жарамдылық мерзімін бақылау міндетіне тап болдық. Жарайды, сертификаттар бірнеше рет асқабақ болып кеткеннен кейін, олардың жаңаруына жауапты сақалды әріптесім демалыста болған кезде қалай тұрдым. Осыдан кейін ол екеуміз бір нәрседен күдіктеніп, ойлануға бел будық. Біз NetXMS мониторинг жүйесін баяу енгізіп жатқандықтан, ол бұл тапсырманың негізгі және, негізінен, жалғыз үміткер болды.

Нәтиже келесі формада алынды:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Және процестің өзі жалғасуда.

Бар. 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 консолінен жасауға болады: конфигурацияны ашыңыз (агенттің конфигурация файлын өңдеу), оны өңдеңіз, Save&Apply орындаңыз, нәтижесінде іс жүзінде дәл солай болады. Содан кейін күтуге күшіңіз болмаса, конфигурацияны қайта оқыңыз (Сауалнама > Конфигурация). Осы қадамдардан кейін сіз біздің реттелетін параметрді қоса аласыз.

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"

В Сыртқы тізім біз тек жолдардың тізімін аламыз. Біздің жағдайда, сертификат атаулары бар жолдар тізімі. Біз сценарий арқылы осы жолдардың тізімін аламыз. Тізім атауы - 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.CertifateExpireDate осы нұсқада жұлдызша (*) бар екенін ескеріңіз. Бұл сыртқы айнымалыларды қабылдауы үшін қажет, тек біздің 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 жүйесінде сертификаттың жарамдылық мерзімін бақылау

Есептегіштерді жасау үшін бірдеңе болуы үшін «Даналарды табу» қойындысында тізімнен Агенттер тізімін таңдау керек және «Тізім аты» өрісіне сценарийден сыртқы тізіміміздің атын енгізіңіз - HTTPS.СертификатАттар.

Дайын дерлік, сәл күте тұрыңыз немесе күту мүлдем мүмкін болмаса, Сауалнама > Конфигурация және Сауалнама > Даналарды табуды күштеп таңдаңыз. Нәтижесінде біз жарамдылық мерзімі бар барлық сертификаттарымызды аламыз:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Саған не қажет? Иә, иә, тек перфекционизмнің құрты ғана есептегіштің атындағы бұл қажетсіз Басбармаққа мұңды көздерімен қарап, мақаланы аяқтауға мүмкіндік бермейді. Оны беру үшін есептегіш сипаттарды қайта ашыңыз және «Дананы табу сүзгісі сценарийі» өрісінде «Дананы табу» қойындысында жазылғанды ​​қосыңыз. NXSL (NetXMS ішкі тілі) сценарийі:

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

ол Басбармақ ізін сүзеді:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Оны сүзгіден өткізіп көрсету үшін Сипаттама өрісіндегі Жалпы қойындысында CertificateExpireDate: {данасы} мәнін өзгертіңіз. CertificateExpireDate: {instance-name}:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Міне, KDPV-дан мәре сызығы:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Бұл сұлулық емес пе?

Сертификат мерзімі біткен кезде олар электрондық пошта арқылы келетіндей етіп ескертулерді орнату ғана қалады.

1. Алдымен санауыш мәні біз орнатқан шекті мәнге дейін азайған кезде оны белсендіру үшін Оқиға үлгісін жасау керек. IN Оқиға конфигурациясы сияқты атаулары бар екі жаңа үлгіні жасайық CertificateExpireDate_threshold_Activate Ескерту күйімен:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Ryo Р ° РЅР ° Р »РѕРіРєС ‡ РЅС <Р№ CertificateExpireDate_threshold_Deactivate Қалыпты күйімен.

2. Содан кейін санауыш сипаттарына өтіп, «Табалдырықтар» қойындысында шекті мәнді орнатыңыз:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

мұнда біз жасалған оқиғаларымызды таңдаймыз CertificateExpireDate_Threshold_Activate және CertificateExpireDate_Threshold_Deactivate, үлгілер санын (үлгілер) 1-ге орнатыңыз (нақтырақ айтқанда, бұл есептегіш үшін артық орнатудың қажеті жоқ), мән 30 (күн), мысалы, және, ең бастысы, орнату оқиғаның қайталану уақыты. Өндірістегі сертификаттар үшін мен оны күніне бір рет қоямын (86400 секунд), әйтпесе сіз хабарландыруларға батып кете аласыз (айтпақшы, бұл бір рет болды, сондықтан демалыс күндері пошта жәшігі толы болды). Түзету уақыты үшін оны төменірек, мысалы, 60 секундқа орнату мағынасы бар.

3. В Әрекет конфигурациясы келесідей хабарлама хат үлгісін жасаңыз:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Осы %m, %S және т.б. — біздің параметрдегі мәндер ауыстырылатын макростар. Олар толығырақ бөлімде сипатталған нұсқаулық NetXMS.

4. Соңында, алдыңғы нүктелерді біріктіру, ішіне Оқиғаларды өңдеу саясаты Дабыл жасалатын және хат жіберілетін ережені жасаңыз:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

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

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

және мына электрондық пошта хабарламасы:

NetXMS жүйесінде Windows жүйесінде сертификаттың жарамдылық мерзімін бақылау

Мұның бәрі қазір анық. Әрине, бақылау тақтасын орнату және графиктерді құру мүмкін болар еді, бірақ сертификаттар үшін бұл процессордың немесе жад жүктемесінің графиктерінен айырмашылығы, біршама мағынасыз және жалықтыратын түзу сызықтар болар еді. Бірақ бұл туралы толығырақ басқа уақытта.

Ақпарат көзі: www.habr.com

пікір қалдыру