Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Gần đây, chúng tôi phải đối mặt với nhiệm vụ giám sát thời hạn hiệu lực của chứng chỉ trên máy chủ Windows. Chà, tôi đã đứng dậy như thế nào sau khi các chứng chỉ biến thành quả bí ngô nhiều lần, vào đúng thời điểm người đồng nghiệp có râu chịu trách nhiệm gia hạn cho họ đang đi nghỉ. Sau đó, tôi và anh ấy nghi ngờ điều gì đó và quyết định suy nghĩ về điều đó. Vì chúng tôi đang dần triển khai hệ thống giám sát NetXMS nên nó đã trở thành hệ thống chính và về nguyên tắc là ứng cử viên duy nhất cho nhiệm vụ này.

Kết quả cuối cùng thu được dưới dạng sau:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Và quá trình này vẫn tiếp tục.

Đi. Không có bộ đếm tích hợp sẵn cho các chứng chỉ hết hạn trong NetXMS, vì vậy bạn cần tạo tập lệnh của riêng mình và sử dụng các tập lệnh để cung cấp dữ liệu cho nó. Tất nhiên, trên Powershell thì đây là Windows. Tập lệnh sẽ đọc tất cả các chứng chỉ trong hệ điều hành, tính ngày hết hạn của chúng tính theo ngày kể từ đó và chuyển số này tới NetXMS. Thông qua người đại diện của mình. Đó là nơi chúng ta sẽ bắt đầu.

Lựa chọn một, đơn giản nhất. Đơn giản chỉ cần lấy số ngày cho đến ngày hết hạn của chứng chỉ với ngày gần nhất.

Để máy chủ NetXMS biết về sự tồn tại của tham số tùy chỉnh của chúng tôi, nó phải nhận nó từ tác nhân. Nếu không thì không thể thêm tham số này do thiếu nó. Vì vậy, trong tập tin cấu hình tác nhân nxagentd.conf chúng tôi thêm một chuỗi tham số bên ngoài được gọi là HTTPS.CertificateExpireDateĐơn giản, trong đó chúng tôi đăng ký khởi chạy tập lệnh:

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

Xem xét rằng tập lệnh được khởi chạy qua mạng, bạn cần nhớ về Chính sách thi hànhvà cũng đừng quên “-NoLogo -NoProfile -NonInteractive” khác mà tôi đã bỏ qua để mã dễ đọc hơn.

Kết quả là cấu hình tác nhân trông giống như thế này:

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

Sau đó, bạn cần lưu cấu hình và khởi động lại tác nhân. Bạn có thể thực hiện việc này từ bảng điều khiển NetXMS: mở cấu hình (Chỉnh sửa tệp cấu hình của tác nhân), chỉnh sửa nó, thực thi Lưu&Áp dụng, trên thực tế, điều tương tự sẽ xảy ra. Sau đó đọc lại cấu hình (Poll > Configuration), nếu bạn không đủ sức chờ đợi chút nào. Sau các bước này, bạn sẽ có thể thêm thông số tùy chỉnh của chúng tôi.

Trong bảng điều khiển NetXMS, hãy truy cập Cấu hình thu thập dữ liệu máy chủ thử nghiệm mà chúng tôi sẽ theo dõi các chứng chỉ trên đó và tạo một tham số mới ở đó (trong tương lai, sau khi cấu hình, việc chuyển nó sang các mẫu là điều hợp lý). Chọn HTTPS.CertificateExpireDateSimple từ danh sách, nhập Mô tả có tên rõ ràng, đặt loại thành Số nguyên và định cấu hình khoảng thời gian bỏ phiếu. Đối với mục đích gỡ lỗi, sẽ hợp lý hơn khi làm cho nó ngắn hơn, chẳng hạn như 30 giây. Mọi thứ đã sẵn sàng, bây giờ thế là đủ rồi.

Bạn có thể kiểm tra... không, còn quá sớm. Tất nhiên bây giờ chúng ta sẽ không nhận được gì cả. Đơn giản vì kịch bản vẫn chưa được viết. Hãy sửa chữa thiếu sót này. Tập lệnh sẽ chỉ hiển thị một số, số ngày còn lại cho đến khi chứng chỉ hết hạn. Tối thiểu nhất có sẵn. Kịch bản ví dụ:

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
}

Hóa ra như thế này:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

723 ngày, còn gần hai năm nữa là chứng chỉ hết hạn. Điều này hợp lý vì gần đây tôi đã cấp lại chứng chỉ cho nhóm thử nghiệm Exchange.

Đó là một lựa chọn dễ dàng. Có lẽ ai đó sẽ hài lòng với điều này, nhưng chúng tôi muốn nhiều hơn thế. Chúng tôi đặt cho mình nhiệm vụ lấy danh sách tất cả các chứng chỉ trên máy chủ, theo tên và để mỗi chứng chỉ xem số ngày còn lại cho đến khi chứng chỉ hết hạn.

Lựa chọn thứ hai, có phần phức tạp hơn.

Một lần nữa, chúng tôi chỉnh sửa cấu hình tác nhân và ở đó, thay vì dòng có externalParameter, chúng tôi viết hai dòng khác:

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

В Danh sách bên ngoài chúng tôi chỉ nhận được một danh sách các chuỗi. Trong trường hợp của chúng tôi, một danh sách các chuỗi có tên chứng chỉ. Chúng tôi sẽ nhận được danh sách các dòng này bằng cách sử dụng tập lệnh. Danh sách tên - HTTPS.CertificateNames.

Tập lệnh 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)"
    }
}

Và đã ở Thông số bên ngoài Chúng tôi nhập các hàng từ danh sách Danh sách bên ngoài và ở đầu ra, chúng tôi nhận được cùng số ngày cho mỗi hàng. Mã định danh là Dấu vân tay của chứng chỉ. Lưu ý rằng HTTPS.CertificateExpireDate chứa dấu hoa thị (*) trong biến thể này. Điều này là cần thiết để nó chấp nhận các biến bên ngoài, chỉ Chứng chỉId của chúng tôi.

Tập lệnh 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)"
}

Trong Cấu hình thu thập dữ liệu của máy chủ, chúng tôi tạo một tham số mới. Trong Tham số, chúng tôi chọn HTTPS.CertificateExpireDate(*) từ danh sách và (chú ý!) thay đổi dấu hoa thị thành {ví dụ}. Điểm quan trọng này sẽ cho phép bạn tạo một bộ đếm riêng cho từng phiên bản (chứng chỉ). Phần còn lại điền như ở phiên bản trước:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Để có thứ gì đó để tạo bộ đếm, trên tab Khám phá phiên bản, bạn cần chọn Danh sách đại lý từ danh sách và trong trường Tên danh sách, nhập tên Danh sách bên ngoài của chúng tôi từ tập lệnh - HTTPS.CertificateNames.

Gần như đã sẵn sàng, hãy đợi một chút hoặc buộc Thăm dò ý kiến ​​> Cấu hình và Thăm dò ý kiến ​​> Khám phá phiên bản nếu hoàn toàn không thể chờ được. Kết quả là chúng tôi nhận được tất cả các chứng chỉ có thời hạn hiệu lực:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Bạn cần gì? Vâng, vâng, chỉ có con sâu của chủ nghĩa hoàn hảo mới nhìn Dấu vân tay không cần thiết này nhân danh quầy tính tiền với đôi mắt buồn bã và không để tôi hoàn thành bài viết. Để cung cấp dữ liệu, hãy mở lại các thuộc tính bộ đếm và trên tab Khám phá phiên bản, trong trường “Tập lệnh bộ lọc khám phá phiên bản”, hãy thêm thuộc tính được viết bằng NXSL Tập lệnh (ngôn ngữ nội bộ NetXMS):

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

sẽ lọc Dấu vân tay:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Và để hiển thị nó đã được lọc, trên tab Chung trong trường Mô tả, hãy thay đổi Chứng chỉExpireDate: {instance} thành Chứng chỉNgày hết hạn: {tên phiên bản}:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Thế là xong, cuối cùng KDPV cũng về đích:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Nó có vẻ đẹp không?

Tất cả những gì còn lại là thiết lập cảnh báo để chúng đến qua email khi chứng chỉ hết hạn.

1. Trước tiên, chúng ta cần tạo Mẫu sự kiện để kích hoạt nó khi giá trị bộ đếm giảm xuống một số ngưỡng mà chúng ta đã đặt. TRONG Cấu hình sự kiện hãy tạo hai mẫu mới với tên như Chứng chỉ hết hạnDate_Threshold_Activate với trạng thái Cảnh báo:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

và tương tự Chứng chỉ hết hạnDate_Threshold_Deactivate với trạng thái Bình thường.

2. Tiếp theo, đi đến thuộc tính bộ đếm và đặt ngưỡng trên tab Ngưỡng:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

trong đó chúng tôi chọn các sự kiện đã tạo Chứng chỉExpireDate_Threshold_Activate và Chứng chỉExpireDate_Threshold_Deactivate, đặt số lượng mẫu (Mẫu) thành 1 (đặc biệt đối với bộ đếm này, không có ích gì khi cài đặt thêm), ví dụ: giá trị là 30 (ngày) và quan trọng là đặt thời gian lặp lại sự kiện. Đối với các chứng chỉ đang được sản xuất, tôi đặt nó mỗi ngày một lần (86400 giây), nếu không, bạn có thể chìm đắm trong các thông báo (nhân tiện, điều này đã xảy ra một lần, đến nỗi hộp thư đã đầy vào cuối tuần). Đối với thời gian gỡ lỗi, bạn nên đặt thời gian này thấp hơn, chẳng hạn như 60 giây.

3. Trong Cấu hình hành động tạo mẫu thư thông báo, như thế này:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Tất cả những %m, %S, v.v. — macro mà các giá trị từ tham số của chúng tôi sẽ được thay thế. Chúng được mô tả chi tiết hơn trong thủ công NetXMS.

4. Và cuối cùng, kết hợp các điểm trước đó thành Chính sách xử lý sự kiện tạo quy tắc theo đó Báo thức sẽ được tạo và một lá thư sẽ được gửi:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Chúng tôi lưu chính sách, mọi thứ đều có thể được kiểm tra. Hãy đặt ngưỡng cao hơn để kiểm tra. Chứng chỉ gần nhất của tôi sẽ hết hạn sau 723 ngày, tôi đặt thành 724 để kiểm tra. Kết quả là chúng tôi nhận được cảnh báo sau:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

và thông báo email này:

Theo dõi ngày hết hạn chứng chỉ trong Windows trên NetXMS

Đó là tất cả chắc chắn bây giờ. Tất nhiên, có thể thiết lập một bảng điều khiển và xây dựng các biểu đồ, nhưng đối với các chứng chỉ, đây sẽ là những đường thẳng vô nghĩa và nhàm chán, chẳng hạn như các biểu đồ về bộ xử lý hoặc tải bộ nhớ. Tuy nhiên, hãy nói thêm về điều này vào lúc khác.

Nguồn: www.habr.com

Thêm một lời nhận xét