Мониторинг срока действия сертификатов в Windows

Started by Retif, October 31, 2017, 10:24:02 AM

Previous topic - Next topic

Retif

Добрый день.

Есть задача на каком-то количестве серверов Windows мониторить сертификаты на предмет истечения их срока. Т.е., если до конца срока осталось менее 30-и дней, например, то генерить алерт. Такое возможно в NetXMS?


Victor Kirhenshtein

Можно сделать external parameter на агенте с использованием команды openssl. Обсуждалось в английском форуме: https://www.netxms.org/forum/configuration/monitoring-ssl-certificate-expiry/

vadtish

Quote from: Retif on October 31, 2017, 10:24:02 AM
Добрый день.

Есть задача на каком-то количестве серверов Windows мониторить сертификаты на предмет истечения их срока. Т.е., если до конца срока осталось менее 30-и дней, например, то генерить алерт. Такое возможно в NetXMS?
Как вариант в "Scheduled Tasks" создавать расписание с сроком сертификатов

Retif

Quote from: Victor Kirhenshtein on July 17, 2018, 04:53:56 PM
Можно сделать external parameter на агенте с использованием команды openssl. Обсуждалось в английском форуме: https://www.netxms.org/forum/configuration/monitoring-ssl-certificate-expiry/
Прочитал, не не понял, если честно, про этот external parameter, как его подружить с NetXMS.
То, что мы вытаскиваем оттуда дату, это понял. Количество секунд, понятно. Но сделать, чтобы при определеном условии (меньше 30-и дней) из этого создался алерт в NetXMS, что-то не могу понять.


Tatjana Dubrovica

Сделать threshold (меньше 30-и дней в секндах или наоборот в скрипте трансформации переводить в дни) в DCI (HTTPS.CertificateExpireDate(netxms.org)) со своим кастомным Event и в EPP просисать что на этот Event нужно генерить Alarm с правильным сообщением.

Retif

Quote from: Tatjana Dubrovica on March 20, 2019, 04:05:25 PM
Сделать threshold (меньше 30-и дней в секндах или наоборот в скрипте трансформации переводить в дни) в DCI (HTTPS.CertificateExpireDate(netxms.org)) со своим кастомным Event и в EPP просисать что на этот Event нужно генерить Alarm с правильным сообщением.
Вот это как раз мне понятно.

Я наверно не совсем корректно написал, попробую еще раз.

1. Про external parameter. Если я правильно понял, в конфиге агента c:\NetXMS\etc\nxagentd.conf я должен прописать строчку с
ExternalParameter = "что-то"
Вот синтаксис этого "что-то" я не могу понять. Я честно прочитал в мануале раздел 6.9 несколько раз, но что-то никак не могу уразуметь это, в голове каша какая-то.

Вот openssl у меня на винде нет, ставить его везде как-то не очень правильно, зато есть повершелл. Я могу запустить скрипт на повершелле, прочитать сертификаты, найти истекший и вернуть что-то. Цифру или строку или еще что-нибудь. Вопрос, как это передать в NetXMS.
Что-то типа того должно быть?
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -file "\\Scripts\test.ps1"

Но что-то оттуда передать, из скрипта этого, в NetXMS? Не могу понять.

2. Допустим, с пунктом 1 я справился, вопрос, как добавить счетчик? Нужно создавать новый параметр?
Вот при создании нового параметра, в поле "Origin" что я должен выбрать? NetXMS Agent? Или что-то другое?
Или просто в Parameter прописать имя своего созданного External Parameter? HTTPS.CertificateExpireDate(*) - вот это имя внешнего параметра? Так и писать с этой звездочкой?


Tatjana Dubrovica

Читать нужно тут: https://www.netxms.org/documentation/adminguide/agent-management.html#agent-external-metrics
Про раздел 6.9 неочень поняла где это.

В вашем случает вы пишите в основной части агентского конфига:
ExternalParameter = HTTPS.CertificateExpireDate: powershell.exe -file "\\Scripts\test.ps1"

Без звёздочки так как параметры вы не подаёте. Перезапускаете агент, делаете Configuration poll и дальше метрикак "HTTPS.CertificateExpireDate"  доблжна быть доступна на этой ноде просто среди других метрик под "Select..."

"Origin" -> "NetXMS Agent"

Retif

Quote from: Tatjana Dubrovica on March 25, 2019, 01:38:25 PM
Читать нужно тут: https://www.netxms.org/documentation/adminguide/agent-management.html#agent-external-metrics
Про раздел 6.9 неочень поняла где это.
Это он и есть, просто в pdf-ном варианте.

Quote from: Tatjana Dubrovica on March 25, 2019, 01:38:25 PM
В вашем случает вы пишите в основной части агентского конфига:
ExternalParameter = HTTPS.CertificateExpireDate: powershell.exe -file "\\Scripts\test.ps1"
А своим скриптом test.ps1 я просто возвращаю одну цифру? А если сертификатов несколько?

Victor Kirhenshtein

Можно сертификат передавать как параметр:


ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -file "\\Scripts\test.ps1" -cert "$1"


и в скрипте имя сертификата получать из переменной.

На стороне сервера будет что-то вроде

HTTPS.CertificateExpireDate(cert1)

filimonic

Спасибо.
Получилось сделать вот такой мониторинг: Выбрать все сертификаты в хранилище ОС (LocalMachine\My), выбрать среди них тот, которых протухает ближе всего, выдать мониторингу цифру "дней до истечения сертификата".
Недостатком является то, что я не вижу, какой именно сертификат протухает.

Что бы хотелось:
Хотелось бы получить информацию по каждому сертификату отдельно,при этом NetXMS не должен ничего заранее знать о конкретных сертификатах, он должен получить наименования сертификатов при опросе агента.

Я предположил что это можно сделать с помощью ExternalTable. Верно ли?
Вывод скрипта, судя по инструкции, должен быть таким:
CertificateName|CertificateTTLDays
*.site111.com|200
*.site222.com|120
_ALL_CERTS_|120


И ожидаю что в NetXMS будут видны все сертификаты для конкретного сервера.

К сожалению из документации строка ExternalTable совершенно мне не понятна
ExternalTable=dciName:instanceColumns=columnName;description=description;separator=|:command
А "живых" примеров использования у меня найти не получилось.
Что в этой строке есть что - вообще не понятно. Прошу как-то помочь.

Спасибо за вашу работу.




Victor Kirhenshtein

В ExternalTable идет три поля, разделенных : - имя таблицы, параметры, и команда. Параметры разделяются ; и могут быть такими:

separator= символ - разделитель, по умолчанию запятая.
instanceColumns= колонка/колонки в которых содержится уникальный идентификатор для строки.
description= описание таблицы.

Второй вариант - это использовать instance discovery. Тогда остается параметр для получения срока действия сертификата, и делается ExternalList который выдает список всех сертификатов в системе, и используется для instance discovery. Тогда для каждого сертификата будет создан отдельный DCI, на котором уже могут быть трешолды как обычно.

Retif

Quote from: Victor Kirhenshtein on April 04, 2019, 06:33:41 PM
Второй вариант - это использовать instance discovery. Тогда остается параметр для получения срока действия сертификата, и делается ExternalList который выдает список всех сертификатов в системе, и используется для instance discovery. Тогда для каждого сертификата будет создан отдельный DCI, на котором уже могут быть трешолды как обычно.

Вот этот вариант мне нравится. Только полностью разобраться не могу что-то все равно.

Что я хочу. Чтобы эти отдельные DCI создались с именем (Description?), в котором будет присутствовать имя сертификата (например friendly name). Ну а значением будет количество дней, то же самое, что сейчас скриптом отдается. И дальше уже всё как с ExternalParameter.

Реализация не очень понятна.

1. Я создаю параметр CertificateExpireDate, в нем указываю в качестве параметра HTTPS.CertificateExpireDate(*) со звездочкой в скобках - это значит с инстансами?

2. На вкладке Instance Discovery я выбираю в качестве метода Agent List? А в List Name что писать, HTTPS.CertificateExpireDate?

3. В конфиге агента, я вместо
ExternalParameter = HTTPS.CertificateExpireDate: powershell.exe -file "\\server\Scripts\test.ps1"

пишу
ExternalList = HTTPS.CertificateExpireDate(*): powershell.exe -file "\\server\Scripts\test.ps1"

4. А в скрипте... тут не очень понятно. Я получаю все имена сертификатов и для каждого количество дней. А как возвращать это для NetXMS, чтобы оно преобразовалось в  имена и значения этих DCI?

З.Ы.  И можно какой-нибудь живой пример не для сертификатов, а для чего угодно с этими инстансами и ExternalList?

Victor Kirhenshtein

Здесь понадобится два скрипта. Делается примерно так:

1. Делаем список HTTPS.Certificates

ExternalList = HTTPS.Certificates:script1.cmd


Скрипт должен выдавать список сертификатов, каждый в своей строчке.

2. Изменяем параметр HTTPS.CertificateExpireDate чтобы он принимал имя сертификата:

ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -file "\\server\Scripts\test.ps1" -certname $1


Насколько я знаю power shell можно будет в скрипте получить имя сертификата в переменной certname. Дальше в скрипте все как сейчас.

3. Делаем DCI на сервере:
Параметр

HTTPS.CertificateExpireDate({instance})


Instance discovery method: agent list
Имя списка: HTTPS.Certificates

Retif

Супер, всё получилось! Спасибо! Я почему-то думал, что ExternalList, он вместо ExternalParameter, а они вместе, оказывается.

Как-то так вышло:


Пара вопросов возникла еще:
1. Сейчас ExternalList отвечает в формате "(Название) - (Идентификатор)", соответственно, в ExternalParameter этот текст передается в таком же виде и в интерфейсе отображается в таком же виде.
Это неудобно визуально, потому что идентификатор (THUMBPRINT) большой и бесполезный для отображения.
Можно ли как-то через ExternalList получить отдельно две части - название и идентификатор, в ExternalParameter передавать только идентификатор, а отображать только название?

2. Нужно изменить конфиг агента на группе серверов. Не для всех, а только для каких-то, например для находящихся в контейнере. Для этого нужно использовать Agent configuration policy? Прочитал документацию про это, но что-то не понял, можно ли сделать на группу серверов. Или правильней для всех серверов одинаковый мастер-конфиг с netxms подтягивать, просто не использовать потом, что не нужно?

3. В макросах для Event Processing не смог получить количество дней, которое выдается в Value DCI-инстанса. %<currentValue> и %<dciValue> что-то пустоту выдают.