NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Son zamanlarda Windows sunucularındaki sertifikaların geçerlilik süresini izleme göreviyle karşı karşıya kaldık. Peki, sertifikaların birkaç kez balkabağına dönüşmesinden sonra, tam da sertifikaların yenilenmesinden sorumlu sakallı meslektaşım tatildeyken nasıl kalktım. Bundan sonra o ve ben bir şeyden şüphelendik ve bu konu hakkında düşünmeye karar verdik. NetXMS izleme sistemini yavaş yavaş uygulamaya başladığımızdan beri, bu görev için ana ve prensip olarak tek aday haline geldi.

Sonuç nihayet aşağıdaki biçimde elde edildi:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Ve sürecin kendisi devam ediyor.

Gitmek. NetXMS'de süresi dolan sertifikalar için yerleşik bir sayaç yoktur, bu nedenle kendinizinkini oluşturmanız ve ona veri sağlamak için komut dosyaları kullanmanız gerekir. Elbette Powershell'de bu Windows. Komut dosyası, işletim sistemindeki tüm sertifikaları okumalı, son kullanma tarihlerini oradan gün cinsinden almalı ve bu numarayı NetXMS'e iletmelidir. Temsilcisi aracılığıyla. İşte burada başlayacağız.

Opsiyon One, en basit. En yakın tarihle birlikte sertifikanın sona erme tarihine kalan gün sayısını almanız yeterlidir.

NetXMS sunucusunun özel parametremizin varlığından haberdar olması için onu aracıdan alması gerekir. Aksi takdirde bu parametre bulunmadığından dolayı eklenemez. Bu nedenle, aracı yapılandırma dosyasında nxagentd.conf adı verilen harici bir parametre dizesi ekliyoruz HTTPS.CertificateExpireDateSimplebetiğin başlatılmasını kaydettiğimiz yer:

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

Komut dosyasının ağ üzerinden başlatıldığını göz önünde bulundurarak şunu hatırlamanız gerekir: Yürütme Politikasıve ayrıca kodun daha iyi okunabilirliği için atladığım diğer "-NoLogo -NoProfile -NonInteractive" öğesini de unutmayın.

Sonuç olarak, aracı yapılandırması şuna benzer:

#
# 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"

Bundan sonra yapılandırmayı kaydetmeniz ve aracıyı yeniden başlatmanız gerekir. Bunu NetXMS konsolundan yapabilirsiniz: yapılandırmayı açın (Aracının yapılandırma dosyasını düzenleyin), düzenleyin, Kaydet ve Uygula'yı çalıştırın, bunun sonucunda aslında aynı şey olacaktır. Daha sonra, bekleyecek gücünüz yoksa yapılandırmayı yeniden okuyun (Anket > Yapılandırma). Bu adımlardan sonra özel parametremizi ekleyebilmelisiniz.

NetXMS konsolunda şu adrese gidin: Veri Toplama Yapılandırması sertifikaları izleyeceğimiz ve orada yeni bir parametre oluşturacağımız deneysel sunucu (gelecekte konfigürasyondan sonra bunu şablonlara aktarmak mantıklı olacaktır). Listeden HTTPS.CertificateExpireDateSimple'ı seçin, anlaşılır bir adla bir Açıklama girin, türü Tamsayı olarak ayarlayın ve yoklama aralığını yapılandırın. Hata ayıklama amacıyla, örneğin 30 saniye gibi kısaltılması mantıklıdır. Her şey hazır, şimdilik bu kadar yeter.

Kontrol edebilirsiniz... hayır, henüz çok erken. Şimdi elbette hiçbir şey alamayacağız. Çünkü senaryo henüz yazılmadı. Bu ihmali düzeltelim. Komut dosyası, sertifikanın süresi dolana kadar kalan gün sayısını içeren bir sayı görüntüleyecektir. Mevcut olanların en minimal olanı. Örnek komut dosyası:

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
}

Bu şöyle çıkıyor:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Sertifikanın süresinin dolmasına 723 gün, yani neredeyse iki yıl kaldı. Bu mantıklı çünkü yakın zamanda Exchange test tezgahı için sertifikaları yeniden yayınladım.

Kolay bir seçenekti. Muhtemelen birileri bundan memnun kalacak ama biz daha fazlasını istedik. Kendimize, sunucudaki tüm sertifikaların adlarına göre bir listesini alma ve her birinin sertifikanın süresinin dolmasına kalan gün sayısını görme görevini belirledik.

İkinci seçenek, biraz daha karmaşık.

Yine aracı yapılandırmasını düzenliyoruz ve orada, HariciParametre satırı yerine iki tane daha yazıyoruz:

ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"

В Harici Liste sadece dizelerin bir listesini alıyoruz. Bizim durumumuzda sertifika adlarını içeren dizelerin listesi. Komut dosyasını kullanarak bu satırların bir listesini alacağız. Liste adı - HTTPS.Sertifika Adları.

NetXMS_CertNames.ps1 Komut Dosyası:

#Список возможных имен сертификатов
$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)"
    }
}

Ve zaten HariciParametre HariciList listesinden satırları giriyoruz ve çıktıda her biri için aynı sayıda gün alıyoruz. Tanımlayıcı, sertifikanın Parmak İzidir. HTTPS.CertificateExpireDate'in bu değişkende bir yıldız işareti (*) içerdiğini unutmayın. Bu, harici değişkenleri (sadece Sertifika Kimliğimizi) kabul etmesi için gereklidir.

NetXMS_CertExpireDate.ps1 Komut Dosyası:

#Определяем входящий параметр $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)"
}

Sunucunun Veri Toplama Konfigürasyonunda yeni bir parametre oluşturuyoruz. Parametrede bizim seçimimizi yapıyoruz HTTPS.CertificateExpireDate(*) listeden seçin ve (dikkat!) yıldız işaretini şu şekilde değiştirin: {misal}. Bu önemli nokta, her bir örnek (sertifika) için ayrı bir sayaç oluşturmanıza olanak sağlayacaktır. Gerisi önceki versiyondaki gibi doldurulur:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Sayaç oluşturacak bir şeye sahip olmak için, Örnek Keşfi sekmesinde listeden Aracı Listesi'ni seçmeniz ve Liste Adı alanına HariciListimizin adını HTTPS.CertificateNames komut dosyasından girmeniz gerekir.

Neredeyse hazır, biraz bekleyin veya beklemek tamamen imkansızsa Anket > Yapılandırma ve Anket > Örnek Keşfi'ni zorlayın. Sonuç olarak, tüm sertifikalarımızı geçerlilik süreleri ile alıyoruz:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Ne istiyorsun? Evet, sadece mükemmeliyetçilik solucanı tezgah adına bu gereksiz Parmak izine hüzünlü gözlerle bakıyor ve yazıyı bitirmeme izin vermiyor. Beslemek için sayaç özelliklerini tekrar açın ve Örnek Keşfi sekmesinde, "Örnek bulma filtresi komut dosyası" alanına, içinde yazılanı ekleyin. NXSL (NetXMS dahili dili) komut dosyası:

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

Parmak İzi'ni filtreleyecek olan:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Filtrelenmiş olarak görüntülemek için Açıklama alanındaki Genel sekmesinde, SertifikaExpireDate: {instance} değerini şu şekilde değiştirin: Sertifika Sona Erme Tarihi: {örnek-adı}:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

İşte bu kadar, sonunda KDPV'nin bitiş çizgisi:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

güzellik mi

Geriye kalan tek şey, sertifikanın süresi dolduğunda uyarıların e-postayla gelmesini sağlayacak şekilde ayarlamaktır.

1. Öncelikle sayaç değeri belirlediğimiz eşiğe düştüğünde onu etkinleştirmek için bir Etkinlik Şablonu oluşturmamız gerekir. İÇİNDE Etkinlik Yapılandırması gibi adlarla iki yeni şablon oluşturalım SertifikaExpireDate_Threshold_Activate Uyarı durumuyla:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

ve benzeri SertifikaExpireDate_Threshold_Deactivate Normal durumda.

2. Daha sonra sayaç özelliklerine gidin ve Eşikler sekmesinde eşiği ayarlayın:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

oluşturduğumuz EventExpireDate_Threshold_Activate ve CertifiedExpireDate_Threshold_Deactivate olaylarımızı seçtiğimizde, örnek sayısını (Örnekler) 1'e ayarlıyoruz (özellikle bu sayaç için daha fazlasını ayarlamanın bir anlamı yok), örneğin değer 30'dur (gün) ve daha da önemlisi, ayarlayın olayın tekrarlanma süresi. Üretimdeki sertifikalar için bunu günde bir kez (86400 saniye) ayarladım, aksi takdirde bildirimlerde boğulabilirsiniz (bu arada, bu bir kez oldu, o kadar ki hafta sonu posta kutusu doldu). Hata ayıklama süresi için, örneğin 60 saniyeye kadar daha düşük bir değere ayarlamak mantıklıdır.

3. Eylem Yapılandırması şöyle bir bildirim mektubu şablonu oluşturun:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Tüm bu %m, %S, vb. — parametremizdeki değerlerin değiştirileceği makrolar. Bunlar daha detaylı olarak şu adreste açıklanmaktadır: Manuel NetXMS.

4. Ve son olarak önceki noktaları birleştirerek Olay İşleme Politikası Bir Alarmın oluşturulacağı ve bir mektubun gönderileceği bir kural oluşturun:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Politikayı saklıyoruz, her şey test edilebilir. Kontrol etmek için eşiği daha yükseğe ayarlayalım. En yakın sertifikamın süresi 723 gün sonra doluyor, kontrol etmek için 724'e ayarladım, sonuç olarak aşağıdaki alarmı alıyoruz:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

ve bu e-posta bildirimi:

NetXMS üzerinde Windows'ta sertifika son kullanma tarihini izleme

Artık kesin olan bu. Elbette bir gösterge panosu oluşturmak ve grafikler oluşturmak mümkün olabilir, ancak sertifikalar için bunlar, örneğin işlemci veya bellek yükü grafiklerinin aksine, biraz anlamsız ve sıkıcı düz çizgiler olacaktır. Ancak bu konu hakkında daha fazla bilgiyi başka bir zaman.

Kaynak: habr.com

Yorum ekle