четверг, 4 февраля 2016 г.

USB-носители. Часть 1.

Приветствую тебя, уважаемый читатель!

Тему сегодняшнего поста, я бы хотел посветить отображению подключенных 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 вы увидите следующий результат:


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


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

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