Приветствую
тебя, уважаемый читатель!
Тему
сегодняшнего поста, я бы хотел посветить отображению подключенных USB-носителей
(флешек, внешних хардов, токенов и т.д.). Тема контроля носителей вообще
достаточно актуальная, особенно если в организации обрабатывается
конфиденциальная информация или есть регламенты ограничивающие свободное
использование носителей. Инструментом поиска подключенных носителей у нас будет
powershell, а результаты мы упакуем в JSON-структуру и отправим на splunk .
Кому интересно - жмём далее.
Итак, существует достаточно много ПО, которое умеет отображать
подключенные носители (я обычно пользовался USBDeview), но практически все они
ищут их в 2-х местах. Первое - специальные ветки реестра предназначенная для
регистрации информации о подключенных носителях, второе - один из системных
журналов Windows (setupapi.dev.log). Особо умные софтины комбинируют оба
варианта :)
Системный журнал можно найти по адресу - C:\Windows\inf\setupapi.dev.log
(в Win8 C:\Windows\inf\setupapi.setup.log). Основное его преимущество, что
можно проследить первое и последнее подключение конкретного носителя,основной
минус - много регулярок, которые надо написать, чтобы получить информацию.
Предположим,
что нам не важно время подключения, и остановимся на первом варианте. Основными
являются 2 ветки реестра:
HKLM:\SYSTEM\CurrentControlSet\Enum\USB\
HKLM:\SYSTEM\CurrentControlSet\Enum\USBSTOR\
Причем в ...\USB\ заносятся все
подключаемые носители, а в ...\USBSTOR\ заносятся только устройства
хранения данных. Посмотреть эти ветки можно с помощью инструмента встроенного в
любую версию Windows - Regedit. Для того чтобы получить список носителей
из powershell можно использовать командлет Get-ChildItem с указанием конкретной
ветки.
Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Enum\USB\ | Select Name
Получится результат как на скрине ниже:
Как видно,
в данном списке присутствуют записи всех подключенных носителей, содержащих два
очень ценных параметра: VID и PID, что соответственно является Vendor ID и
Product ID. За каждым производителем закреплен свой 4-х символьный
идентификатор компании, и он присваивает своим продуктам уникальные 4-х
символьные идентификаторы. Описание этих идентификаторов есть тут - http://www.linux-usb.org/usb.ids.
Список
устройств хранения выглядит победнее:
Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Enum\USBSTOR\ | Select Name
Но нас будет интересовать именно ветка ...\USB\, т.к. в ней
более полная информация по носителям.
Скрипт представленный ниже получает список флешек, формирует JSON-структуру и отправляет его на splunk в http-коллектор событий.
$host_name = $env:COMPUTERNAME
$time = (Get-Date).ToString("dd:MM:yy HH:mm:ss" )
$all_usb = Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Enum\USB\ | Select Name
foreach ($usb in $all_usb)
{
if ($usb -match "VID") {
$flash = $usb.Name .TrimStart("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB" ) -split "&" -replace "VID_", "" -replace "PID_" , ""
$USBVid = $flash[ 0]
$USBPid = $flash[ 1]
$JSONDoc = @"
{
"host": "http_host",
"index": "main",
"sourcetype": "usb",
"event": {
"CollectTime": "$time",
"Hostname": "$host_name",
"USBVendor": "$USBVid",
"USBProduct": "$USBPid"
}
}
"@
Invoke-WebRequest -uri "http://188.120.244.18:8088/services/collector" -Headers @{ "Authorization" ="Splunk D3E1D511-0BFC-4ACF-AEE1-B7879E581BA2"} -Method POST -Body $JSONDoc
}
}
Остановлюсь
на интересных моментах:
1) $flash = $usb.Name.TrimStart("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB" ) -split "&" -replace "VID_", "" -replace "PID_" , ""
Разбивает
строку с записью на 2 части, ID вендора и ID продукта, и выкидываем всё лишнее)
2) $JSONDoc = @"
{
"host": "http_host",
"index": "main",
"sourcetype": "usb",
"event": {
"CollectTime": "$time",
"Hostname": "$host_name",
"USBVendor": "$USBVid",
"USBProduct": "$USBPid"
}
}
"@
Собираем JSON-структуру,
которая будет улетать на splunk. Естественно помимо полезной нагрузки в виде
описания usb-носителя, описываем служебные поля (host, index, sourcetype)
3) Invoke-WebRequest -uri "http://188.120.244.18:8088/services/collector" -Headers @{ "Authorization" ="Splunk D3E1D511-0BFC-4ACF-AEE1-B7879E581BA2"} -Method POST -Body $JSONDoc
С помощью командлета Invoke-WebRequest создаём
HTTP POST-запрос для splunk. Важным тут является заголовок, содержащий
авторизационный токен.
Если всё получилось, в splunk вы увидите
следующий результат:
На этом
пока всё, в следующей части будем парсить журнал производителей и приводить его
в табличный вид.
Комментариев нет:
Отправить комментарий