Уведомления о подключении USB
Личная безопасность: если кто-то воткнул флешку в ваш компьютер (или вы сами
подключили не тот накопитель), приятно узнать об этом мгновенно — с моделью,
производителем и серийным номером устройства. На Linux это делается штатным
udev, без сторонних демонов.
Linux: правило udev
Заголовок раздела «Linux: правило udev»Скрипт, который udev вызовет при подключении накопителя, кладём в
/usr/local/bin/notifly-usb:
#!/usr/bin/env bash# /usr/local/bin/notifly-usb — вызывается из udev при addset -euset -a; source /etc/notifly.env; set +a
# Атрибуты приходят из udev как переменные окружения.VENDOR="${ID_VENDOR:-неизвестно}"MODEL="${ID_MODEL:-неизвестно}"SERIAL="${ID_SERIAL_SHORT:-нет}"DEV="${DEVNAME:-?}"
curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ --data "$(jq -n \ --arg t "🔌 USB подключён: $VENDOR $MODEL" \ --arg m "Устройство: $DEVСерийный №: $SERIALХост: $(hostname)" \ --argjson p 7 \ '{title:$t, message:$m, priority:$p}')" >/dev/nullsudo chmod 755 /usr/local/bin/notifly-usbСамо правило — /etc/udev/rules.d/99-notifly-usb.rules. Реагируем только на
появление (add) USB-накопителей (block-устройства на шине usb):
ACTION=="add", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", ENV{DEVTYPE}=="disk", \ RUN+="/usr/local/bin/notifly-usb"Перечитываем правила — новое сработает при следующем подключении:
sudo udevadm control --reload-rulesПроверить, какие переменные приходят
Заголовок раздела «Проверить, какие переменные приходят»Чтобы посмотреть, что udev знает об устройстве (и подстроить сообщение):
udevadm info --query=property --name=/dev/sdbРеагировать вообще на любое USB-устройство
Заголовок раздела «Реагировать вообще на любое USB-устройство»Если нужны не только накопители, а мыши/клавиатуры/телефоны — правило по
подсистеме usb:
ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR}!="", \ RUN+="/usr/local/bin/notifly-usb"Windows: подписка на событие WMI
Заголовок раздела «Windows: подписка на событие WMI»В Windows подключение накопителя фиксируется в журнале и в WMI. Проще всего —
Task Scheduler на событие: источник Microsoft-Windows-Kernel-PnP,
Event ID 2003 (устройство сконфигурировано). Предполагается настроенная
функция Send-Notifly.
Скрипт-обработчик:
. $env:USERPROFILE\Documents\WindowsPowerShell\Notifly.ps1
# Берём последний подключённый USB-накопитель.$disk = Get-CimInstance Win32_DiskDrive | Where-Object { $_.InterfaceType -eq "USB" } | Sort-Object -Property Index -Descending | Select-Object -First 1
$model = if ($disk) { $disk.Model } else { "неизвестно" }$serial = if ($disk) { $disk.SerialNumber } else { "нет" }
Send-Notifly -Title "🔌 USB подключён: $model" ` -Message "Серийный №: $serial`nХост: $env:COMPUTERNAME" -Priority 7Привязываем к событию (одноразово, из PowerShell от администратора):
$Trigger = New-CimInstance -CimClass (Get-CimClass MSFT_TaskEventTrigger ` -Namespace Root/Microsoft/Windows/TaskScheduler) -ClientOnly$Trigger.Subscription = "<QueryList><Query Id='0'><Select Path='Microsoft-Windows-Kernel-PnP/Configuration'>" + "*[System[EventID=2003]]</Select></Query></QueryList>"$Trigger.Enabled = $true
$Action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\scripts\Notifly-Usb.ps1"Register-ScheduledTask -TaskName "Notifly USB Alert" -Action $Action -Trigger $TriggerАльтернатива без планировщика — постоянно висящая WMI-подписка через
Register-CimIndicationEvent на Win32_VolumeChangeEvent (тип 2 = прибытие).
- Физическая безопасность. Узнаёте о чужой флешке, даже если вас нет рядом.
- Серийник в кармане. По
ID_SERIAL_SHORTотличаете свою флешку от чужой. - Аудит. Каждый push — запись в истории: когда и что подключали к машине.
Что улучшить дальше
Заголовок раздела «Что улучшить дальше»- Вести белый список серийников — свои устройства слать тихо (приоритет 2), чужие громко (приоритет 8).
- На
removeслать «USB отключён» — видно, сколько устройство было воткнуто. - Для рабочих станций — централизовать через мониторинг.