Мониторинг сертификатов с помощью Operation Manager и Powershell


В доменной инфраструктуре удобно управлять сертификатами. Можно настроить внутренний CA, автоматическую выдачу сертификатов и перевыпуск при истечении срока их действия. В некоторых случаях это не работает. Например, для фермы терминальных серверов приходится выпускать, устанавливать и обновлять сертификаты вручную. И это не единственный случай, когда за сертификатами нужно следить, чтобы не пропустить момент, когда их необходимо заменить.

Поэтому возникает задача контроля за сертификатами.

Для этого можно использовать Powershell. Техника описана в статье Use PowerShell to Find Certificates that are About to Expire.

Для Powershell 3.0 получение просроченные сертификатов выглядит так:

Get-ChildItem -Path cert: -Recurse -ExpiringInDays 75

Для Powershell 2.0 тоже самое немного сложнее:

Get-ChildItem -Recurse | where { $_.notafter -le (get-date).AddDays(75) -AND $_.notafter -gt (get-date)} | select thumbprint, subject

Как настроить контроль сертификатов на множестве компьютеров? Для автоматизации удобнее всего применить Operation Manager, который может доставить скрипт на нужные компьютеры и сформировать алерт при необходимости. Как это сделать описано в статье OpsMgr: Monitoring Certificate Expiry with a Powershell-based Monitor.

Бонус статьи в том, что используемый Management Pack позволяет создавать произвольные мониторы на базе Powershell скриптов.

Так как мониторить нужно только «свои» сертификаты, а они установлены в контейнер Cert:\LocalMachine\My, то именно в этом контейнере будем проверять сертификаты. Если искать сертификаты от корня Cert:, то будет много алертов на корневые коммерческие сертификаты, а это нас совсем не интересует в рамках поставленной задачи.

Поэтому рабочий скрипт выглядит так:

$currentlocation = Get-Location

 

sl Cert:\LocalMachine\My

$thresholdindays = 90

 

$ExpiredCerts = Get-ChildItem -Recurse | where { $_.notafter -le (get-date).AddDays($thresholdindays)-AND $_.notafter -gt (get-date)} | select thumbprint, subject, notafter

 

$API = new-object -comObject «MOM.ScriptAPI»

$PropertyBag = $API.CreatePropertyBag()

 

if($ExpiredCerts.Length -gt 0) {

 

$OFS = «`r`n»

$result1 = [system.String]::Join($ofs, $ExpiredCerts)

$result2 = [string]$result1

$result2 = $result2 -replace «@{«, «»

$result2 = $result2 -replace «}», «»

$PropertyBag.AddValue(«State»,«ERROR»)

$PropertyBag.AddValue(«Description», «Expired Certificates: « + $result2)

}

 

else {

 

$PropertyBag.AddValue(«State»,«OK»)

$PropertyBag.AddValue(«Description», «ALL GOOD !!»)

}

sl $currentlocation

$PropertyBag

 

Теперь за три месяца (90 дней) до истечения срока действия сертификата вы получите в SCOM алерт, который будет висеть до замены сертификата или пока он не будет просрочен (или удалён).

Реклама

Exchange Server 2013 – чистим мусор. Дополнение.


Exchange Server 2013 – чистим мусор. Дополнение.

Недавно в статье Exchange Server 2013 – чистим мусор я опубликовал скрипт для удаления журналов IIS, которые копятся на серверах Exchange по пожирают место на диске. Этот скрипт универсальный: он сам находит расположения журналов IIS, даже если вы их переместили.

Сейчас обнаружил, что есть еще один журнал HTTPERR, который создает не сам IIS, а сервис HTTP.SYS. Этот журнал расположен по умолчанию по пути %systemroot%\System32\LogFiles. Его также можно переместить в другое место с помощью ключей реестра, как описано в документации Configuring HTTP.sys Error Logging. Поэтому делаем дополнение в скрипт.

Соответственно скрипт теперь выглядит так:

Скрипт перенесён И ещё раз про чистку мусора в папках Exchange Server 2013

Exchange Server 2013 – считаем количество подключений к серверу


При настройке балансировщика возникли проблемы с настройками его производительности –  настройка балансировщика, как говорится, другая история, но это породило частную задачу: определить число коннектов (подключений), которые создают клиенты Outlook к серверам CAS.

Для решения задачи можно поискать подходящие счётчики производительности – это первое, что приходит в голову. Либо использовать какую-либо утилиту.

Но есть еще один способ. Outlook использует подключение к серверу по протоколу OutlookAnyware, который работает поверх HTTPS. Поэтому можно просто подсчитать число подключений к серверу по порту 443. Если вы не запускаете никаких оснасток управления, которые подключаются к серверу Exchange по порту 443, то результат подсчёта будет достаточно точным. Сравнение со счётчиком производительности показало, что количество подключений по порту 443 превышает значение полученное из счётчика, но ненамного. Можно ещё учесть и отфильтровать подключения между серверами, но в данной конкретной ситуации это для меня не играло никакой роли.

Самый привычный способ подсчитать число TCP сессий (подключений) это команда netstat. Результат можно распарсить и обработать. И хочется сделать это в Powershell. Готовый скрипт уже есть в билиотеке Get-NetworkStat​istics — netstat -ano with filtering.

Мне же этот скрипт не пригодился, т.к. в Windows Server 2012/R2 есть командлет Get-NetTCPConnection, который реализует необходимую нам часть функциональности команды netstat.

Подсчёт количества подключений:

(Get-NetTCPConnection -State Established -LocalAddress «10.30.30.30» -LocalPort 443).count

 

Указание локального адреса немного отсеивает мусор, но при сотнях и более подключений клиентов это не искажает конечный результат, и этот параметр можно опустить.

Теперь хочется большего: давайте подсчитаем число клиентов, число подключений и среднее число подключений на одного клиента:

Get-NetTCPConnection -State Established -LocalAddress «10.30.30.30» -LocalPort 443 | Group-Object -Property RemoteAddress | Measure-Object -Property Count -Average -Sum

 

Получаем примерно такой результат:

Count    : 163

Average  : 1.99386503067485

Sum      : 325

Maximum  :

Minimum  :

Property : Count

 

Давайте ещё продвинемся: CAS серверов может быть несколько, и выполнять запрос локально на каждом не очень удобно. Поэтому сделаем это удаленно:

$s= «cas1»,«cas2»,«cas3» | % {New-CimSession $_}

 

$conn = $s | % { Get-NetTCPConnection -CimSession $_ -State Established -LocalPort 443 | Group-Object -Property RemoteAddress | Measure-Object -Property Count -Average -Sum }

 

$s | % { Remove-CimSession $_ }

 

 

Результаты можно сохранить в переменной и получить общий итог по клиентам и подключениям:

 

$conn | Measure-Object -Property Count -Sum

$conn | Measure-Object -Property Sum -Sum

 

 

 

Полученные результаты помогли мне объективно оценить нагрузку на балансировщик.