суббота, 11 декабря 2021 г.

Анализируем логи Windows NPS сервера. Извлекаем статистику всех сессий

  Продолжаем тему об извлечении информации из логов Windows NPS - Radius сервера начатую в статье  как посмотреть активные Радиус сессии на NPS сервере.

 Теперь нам нужен powershell - скрипт который из логов извлекает всю возможную информацию о каждой радиус-сессии

  Далее чтобы не придумывать дважды просто приведу файл ReadMe с github.

Парсер логов NPS-Radius сервера Windows
Скрипт NPSLogParser2 анализируя логи Windows NPS-Radius сервера и показывает информацию о Radius-сессиях и общую сумму по пользователям. Логи Radius-сервера должны быть в DTS-формате.
Скрипту для работы достаточно права на чтения лог-файлов.
На входе скрипт получает от одного до бесконечности лог-файлов, можно задать временнюй диапазон.
В результате работы скрипта создаются папка вида Result_YYYY_MM_DD_HH_mm_ss и в ней два файла.
В файле ResultSessions.csv кидается информация о каждой Radius-сессии
В файл ResultUsage.csv сохраняется суммарная информация для каждого пользователя. Берутся данные из первого файла и подсчитываются суммарное время всех сессий для пользователя
Кроме того в выходной поток кидается та же информация что в файле ResultSessions.csv. С помощью входного параметра StatType это можно поменять на ResultUsage.csv . Описание входных параметров смотри ниже
Скрипт работает долго. Для примера у меня данные за месяц он анализирует от 1 часа до 4. Это зависит от количества сессий
В ходе работы скрипт по IP адресу пытается получить геопозицию пользователя. Если интернета нет отображается ошибка и скрипт нормально продолжает работу. Отключить поиск геопозиции можно в теле скрипта найдите строку [bool]$Global:isIPGeoLocationEnable = $True и поменяйте на $False

----- Примеры использования -----

Пример 1
.\NPSLogParser2.ps1 -LogFiles "\\192.168.0.10\c$\Windows\System32\LogFiles\IN2107.log"
Указывается один лог-файл NPS сервера IN2107.log. Создается папка примерно с таким именем Result_2021_08_02_08_15_01 и в ней два CSV-файла с результатами

Пример 2
.\NPSLogParser2.ps1 -LogFiles "\\192.168.0.10\c$\Windows\System32\LogFiles\IN2107.log,\\192.168.0.11\c$\Windows\System32\LogFiles\IN2107.log"
анализирует два лог-файла и результаты кидаются в то же место, что и в примере 1.

Пример 3
.\NPSLogParser2.ps1 -LogFiles "\\192.168.0.10\c$\Windows\System32\LogFiles\IN2107.log,\\192.168.0.11\c$\Windows\System32\LogFiles\IN2107.log" -MinYear 2021 -MinMonth 7 -MinDay 28 -MaxYear 2021 -MaxMonth 7 -MaxDay 30
То же что и пример 2, но выбираются сессии только с первой секунды 28 мая 2021г до последней секунды 30 мая 2021г

----- Входные параметры -----

ResultPath - Папка куда записываются файлы ResultSessions.csv и ResultUsage.csv с результатами работы скрипта. Если папки нет, она создается.
LogFiles - лог-файлы NPS-Radius сервера Windows. Файлы должны быть формата DTS-XML. Можно указать один файл, можно несколько файлов, разделенных запятыми, можно одну папку, где скрипт возьмет все файлы in*.log.
StatType - скрипт кидает в выходной поток содержимое одного из файлов с результатами. По умолчанию выводится содержимое ResultSessions.csv. Тут можно указать параметр "Sessions" чтобы выводить ResultSessions.csv. или "Users" если надо вывести содержимое ResultUsage.csv
MinYear MinMonth MinDay MinHour MinMin MinSec MinMSec - Эти параметры показывают нижнюю границу времени начиная с которой анализируются сессии
MaxYear MaxMonth MaxDay MaxHour MaxMin MaxSec MaxMSec - Эти параметры показывают верхнюю границу времени до которой анализируются сессии
Последние параметры включают год, месяц, день, час, минута, секунда, миллисекунда

Кроме того в теле скрипта есть уже упоминавшийся параметр $Global:isIPGeoLocationEnable который определяет будет ли по IP адресу искать географическую позицию. Если параметр равен "истина", то скрипт проверит доступность интернета и если он есть будет искать геопозицию. Если интернета нет, от появится сообщение об ошибке, которое можно проигнорировать.
Тот сайт через который ищется геопозиция бесплатно допускает решить только 10 000 адресов в месяц.

----- Описание полей в CSV-файлах -----

Сначала хочу признаться, что для меня термин NAS-сервер и Radius-клиент относятся к одному устройству, поэтому если кто-то считает иначе, учитывайте это.

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

Также есть несколько полей с постфиксом в названии "...FromBeginTime", а есть поля с таким же именем, где "...FromBeginTime" отсутствует. Например DurationSec и DurationSecFromBeginTime. Разница между ними в том, что поле DurationSec берется из записи в логах, которую подсчитывает NAS-сервер. А поле DurationSecFromBeginTime подсчитывает сам скрипт из разницы между соответствующими полями в первой записью Accounting-сессии и последней. Это помогает в двух случаях:
1. Начало сессии не попало в лог-файлы. Например это бывает если сессия началась 31 марта 2021г, а скрипт имеет данные только начиная с 1 апреля 2021г
2. Я заметил, что при проблемах у нашего провайдера наш NAS-сервер начинает выдавать запредельно огромные значения времени сессии, входящих и исходящих байт и пакетов. Чтобы в такой ситуации вытянуть реальный цифры я добавил поля "...FromBeginTime"

UserName - имя пользователя
UserDevName - имя устройства с которого зашел пользователь
DurationSec - длительность сессии в секундах. Берется из NAS-сервера
DurationSecFromBeginTime - длительность сессии в секундах. Берется из разницы между первой найденным Accounting-записью сессии и последней
DurationHourMinSec - длительность сессии в часах:минутах:секундах. Считается скриптом из параметра DurationSec
DurationHourMinSecFromBeginTime - длительность сессии в часах:минутах:секундах. Считается скриптом из параметра DurationSecFromBeginTime
isFirstPacket - "Истина" если удалось найти первую запись Accounting-этапа. "Ложь" если сессия обнаружилась в середине Accounting-этапа
isLastPacket - "Истина" если удалось найти последнюю запись Accounting-этапа. "Ложь" если в логах не удалось найти последнюю запись Accounting-этапа. Лог-файл закончился раньше, чем прервалась сессия
DateTimeStart - строку с временем начала сессии вида "07/19/2021 16:08:53.991"
DateTimeEnd - строка со временем конца сессии вида "07/19/2021 16:23:15.384"
RadiusServerName - radius-сервер
AuthenticationType - Поле типа "PAP", "CHAP", "MSHAP"
TunnelType - Поле типа "l2tp"
UserExternalIP - Наружный IP адрес пользователя в интернете
NASServerExternalIP - Наружный IP адрес NAS-сервера
UserExternalIPGeolocation - если удалось найти геопозиицю, то она пишется тут, иначе пустое поле
TunnelClientIP - IP адрес пользователя внутри туннеля
NASServerInternalIP - внутренний IP адрес NAS-сервера
InputOctets - количество входящих байт за сессию по данным NAS-сервера
InputOctetsFromBeginTime - количество входящих байт за сессию. Считается по разнице между первой найденным Accounting-записью сессии и последней
InputPackets - количество входящих пакетов за сессию по данным NAS-сервера
InputPacketsFromBeginTime - количество входящих пакетов за сессию. Считается по разнице между первой найденным Accounting-записью сессии и последней
OutputOctets - количество исходящих байт за сессию по данным NAS-сервера
OutputOctetsFromBeginTime - количество исходящих байт за сессию. Считается по разнице между первой найденным Accounting-записью сессии и последней
OutputPackets - количество исходящих пакетов за сессию по данным NAS-сервера
OutputPacketsFromBeginTime - количество исходящих пакетов за сессию. Считается по разнице между первой найденным Accounting-записью сессии и последней
Class - уникально для всех пакетов одной сессии и НЕ может никогда повторяться в других сессиях
SessionID - уникально для всех пакетов одной сессии может повторяется в других сессиях. точно не скажу для чего оно
TerminateCause - причина прекращения сессии. Кажется тут где-то 16 значений вида "8 Port Error", "1 User Request"
isAccounting - Если содержит "true". т в этой сессии присутствует этап Accounting. Помогает быстро отследить сессии где имя и/или пароль ошибочны.

Комментариев нет:

Отправить комментарий