- PowerShell permet detectar connexions i desconnexions USB en temps real i enviar-les a un servidor central mitjançant una API.
- Habilitar canals d'esdeveniments i fer servir WEF aporta escala corporativa i context forense juntament amb SIEM.
- La posada en producció combina programador de tasques, seguretat de l'endpoint i enduriment del backend.

La connexió de memòries, discos i perifèrics per USB pot obrir més portes de les que sembla: des de fuites de dades a infeccions per codi maliciós sense que ningú se n'assabenti. Monitoritzar i registrar els dispositius USB que entren i surten dels equips és, per tant, una mesura clau de ciberseguretat que moltes organitzacions ja consideren bàsica.
La bona notícia és que l'ecosistema Windows ofereix diversos enfocaments, des d'eines comercials fins a mètodes nadius com ara PowerShell i Windows Event Forwarding (WEF). Amb un disseny ben pensat es pot detectar a temps real, registrar, enviar a un servidor central i correlacionar esdeveniments USB amb altres senyals de seguretat, tot sense fricció per a l'usuari.
Panorama i eines per rastrejar dispositius USB
A empreses regulades (finances, salut…) s'exigeix control i traçabilitat. L'objectiu és identificar ràpidament dispositius no autoritzats , prevenir exfiltracions i detectar intents d'introduir codi maliciós des de suports extraïbles.
Si busques alguna cosa llesta per utilitzar, hi ha utilitats específiques. USB Device Tracker facilita inventari i auditoria contínua , guardant identificadors, tipus de dispositiu i els moments de connexió/desconnexió, a més de reports útils per identificar patrons o amenaces.
També hi ha utilitats lleugeres. USBDeview (NirSoft) mostra dispositius USB presents i passats ; no envia dades a un servidor per si mateix, però s'integra bé amb scripts per automatitzar exportacions o notificacions a la teva infraestructura.
A escenaris a gran escala, les suites d'endpoint ajuden a consolidar. Microsoft Endpoint Manager, ManageEngine Endpoint Central o Ivanti permeten polítiques i registres de dispositius USB a nivell corporatiu, amb reports o enviament a repositoris centralitzats.
Per correlació i alertes, un SIEM com Splunk o Elastic Stack pot ingerir esdeveniments USB i disparar deteccions a temps real. Aquestes plataformes identifiquen comportaments sospitosos (connexions fora d'horari, dispositius no permesos, etc.) i encaixen de meravella amb un pipeline que alimenti dades des de PowerShell o WEF.

Detecció i resposta amb PowerShell: esdeveniments USB i enviament a servidor
Si prefereixes flexibilitat, un script propi a PowerShell és molt potent. Pots detectar connexions i desconnexions en temps real, enriquir amb metadades i publicar en una API REST pel teu backend.
Primer, llistar dispositius USB connectats en un moment donat. La classe Win32_DiskDrive amb InterfaceType USB és un bon punt de partida , encara que convé complementar amb dades PnP per al número de sèrie quan estigui disponible:
# Enumerar almacenamiento USB actual
$usb = Get-CimInstance Win32_DiskDrive | Where-Object { $_.InterfaceType -eq 'USB' }
$enriquecido = foreach ($d in $usb) {
$serial = (Get-CimInstance Win32_PhysicalMedia | Where-Object { $_.Tag -eq $d.DeviceID }).SerialNumber
[PSCustomObject]@{
DeviceID = $d.DeviceID
Model = $d.Model
Interface = $d.InterfaceType
Serial = ($serial -replace '\s+', '').Trim()
}
}
$enriquecido | Format-Table -AutoSize
A més a més de l'inventari, la clau és el temps real. PowerShell es pot subscriure a esdeveniments del sistema per reaccionar a l'instant quan es connecti o retiri un dispositiu:
# Monitorizar llegada y retirada de volúmenes (EventType 2=arrive, 3=remove)
Unregister-Event -SourceIdentifier USBMonitor -ErrorAction SilentlyContinue
$null = Register-WmiEvent -Class Win32_VolumeChangeEvent -Action {
$e = $Event.SourceEventArgs.NewEvent
$tipo = if ($e.EventType -eq 2) { 'Insert' } elseif ($e.EventType -eq 3) { 'Remove' } else { 'Other' }
$payload = [PSCustomObject]@{
Hostname = $env:COMPUTERNAME
TimeUtc = (Get-Date).ToUniversalTime().ToString('o')
Action = $tipo
Drive = $e.DriveName
}
try {
$json = $payload | ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri 'http://SERVIDOR_CENTRAL/api/usblog' -Method Post -Body $json -ContentType 'application/json'
} catch {
Write-Warning ("Error enviando evento USB: {0}" -f $_.Exception.Message)
}
} -SourceIdentifier USBMonitor
Si a més a més vols capturar detalls del maquinari del disc USB recentment inserit, combina Win32_VolumeChangeEvent amb un refresc de Win32_DiskDrive i creua per volum/lletra muntada segons correspongui. També pots monitoritzar Win32_DeviceChangeEvent per a esdeveniments genèrics de dispositiu:
# Alternativa: evento genérico de dispositivo
Unregister-Event -SourceIdentifier USBGeneric -ErrorAction SilentlyContinue
$null = Register-WmiEvent -Class Win32_DeviceChangeEvent -Action {
$e = $Event.SourceEventArgs.NewEvent
$payload = [PSCustomObject]@{
Hostname = $env:COMPUTERNAME
TimeUtc = (Get-Date).ToUniversalTime().ToString('o')
EventType= $e.EventType # 2 insert, 3 remove
}
try {
Invoke-RestMethod -Uri 'http://SERVIDOR_CENTRAL/api/usblog' -Method Post -Body ($payload|ConvertTo-Json) -ContentType 'application/json'
} catch {}
} -SourceIdentifier USBGeneric
Per a un bolcat puntual i enviament immediat a JSON al teu servidor, la canonada és directa. El patró següent recull discos USB actuals, els transforma a JSON i els publica en una API:
Get-CimInstance Win32_DiskDrive | Where-Object { $_.InterfaceType -eq 'USB' } |
ForEach-Object {
$serial = (Get-CimInstance Win32_PhysicalMedia | Where-Object { $_.Tag -eq $_.DeviceID }).SerialNumber
[PSCustomObject]@{ DeviceID = $_.DeviceID; Model = $_.Model; Serial = ($serial -replace '\s+', '').Trim() }
} |
ConvertTo-Json |
Invoke-RestMethod -Uri 'http://SERVIDOR_CENTRAL/api/usblog' -Method Post -ContentType 'application/json'
Més enllà de l'inventari i les insercions/retirs, Windows registra activitat de controladors d'usuari vinculada a USB. Habilita el canal Microsoft-Windows-DriverFrameworks-UserMode/Operational i revisa esdeveniments clau: connexió (p. ex., 2003, 2004, 2006, 2010) i desconnexió (2102, 2105, 2106), amb metadades útils com a fabricant, model o rutes.
API REST a Flask per centralitzar els registres
Necessites un receptor senzill per emmagatzemar i explotar les dades. Amb Flask pots aixecar un endpoint /api/usblog que validi, guardi i deixi llest el material per a posteriors anàlisis o enviament al SIEM:
from flask import Flask, request, jsonify
from datetime import datetime
app = Flask(__name__)
API_TOKEN = 'cambia-este-token-seguro'
@app.route('/api/usblog', methods=['POST'])
def log_usb():
if request.headers.get('X-Api-Token') != API_TOKEN:
return jsonify({'error': 'Unauthorized'}), 401
data = request.get_json(silent=True)
if not data:
return jsonify({'error': 'No payload'}), 400
line = f"{datetime.utcnow().isoformat()}Z\t{data}\n"
with open('usb_log.txt', 'a', encoding='utf-8') as f:
f.write(line)
return jsonify({'status': 'ok'}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Per posar-lo en marxa, instal·la Flask amb pip, desa l'script (per exemple, server.py) i executa'l. A partir d'aquí, el vostre script a PowerShell pot enviar esdeveniments a http://IP_SERVIDOR:5000/api/usblog afegint una capçalera X-Api-Token si ho heu activat.
Encara que aquí escrivim en un fitxer per simplificar, pots enviar a una base de dades o al teu SIEM , o fins i tot bifurcar: a SIEM per a analítica online ia un llac de dades (Hadoop/HDInsight) per a retenció perllongada i anàlisi forense de gran volum.
Posada en producció: arrencada automàtica, seguretat, WEF i analítica
Perquè no depengui de la mà de ningú després d'un reinici, automatitzeu l' arrencada de l'script de PowerShell amb el Programador de tasques o la carpeta Inici, i blindeu el desplegament amb bones pràctiques de seguretat.
Arrencada automàtica a Windows
Amb el Programador de tasques: crea una tasca amb privilegis màxims i desencadenador en iniciar sessió o en iniciar el sistema . Com a acció, executa powershell.exe amb NoProfile i ExecutionPolicy Bypass apuntant al teu .ps1.
Si preferiu la carpeta Inici: creeu un .bat que llanci l'script i col·loqueu-lo a %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup . És senzill i funciona bé en llocs dusuari.
Exemple de .bat: powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\ruta\script.ps1 , ajustant la ruta al teu entorn i assegurant que l'script estigui signat o provingui d'origen fiable.
Recomanacions de seguretat
Protegeix l'API: filtra per tallafocs, exigeix token o mTLS i aplica límits de taxa . Evita exposar l'endpoint més enllà de la xarxa necessària i enregistra amb detall el mínim de dades personals imprescindible.
Endureix el client: utilitza comptes de servei amb privilegis mínims , trenca el token, valida TLS on apliqui i controla l'ExecutionPolicy amb GPO si escau; si pots, signa l'script i valida integritat.
Fes auditories periòdiques: revisa els registres del servidor i del client , compara patrons inusuals i creua amb polítiques de control de dispositius per detectar desviaments o accessos no autoritzats.
Windows Event Forwarding (WEF) per a cobertura corporativa
Quan voleu escala i resiliència a Windows, WEF reenvia esdeveniments a un servidor Windows Event Collector (WEC) sense instal·lar agents addicionals. És passiu respecte al logging: no habilita canals ni canvia auditories; aquestes configuracions s'han d'aplicar via GPO.
Model de doble subscripció: línia base (per a tots els equips) i sospitosa (per a un subconjunt després d'una alerta) . La de sospitosos recull més senyals per a context forense i es pot actualitzar sense tocar la resta.
Destinació de dades recomanada: línia base a SEM/SIEM o SQL; sospitosa a MapReduce/HDInsight/Data Lake per volum i menor relació senyal/soroll. El SIEM correlaciona i alerta “a velocitat de màquina”; el llac reté anys i permet anàlisis complexes.
Escalabilitat orientativa: fins a 5.000 esdeveniments/sa SQL/SEM; 5.000-50.000 a SEM; per sobre, llac de dades . A servidors WEC estàndard, la xifra pràctica ronda 3.000 esdeveniments/s en total segons maquinari i discos.
Push vs Pull: el més flexible és subscripció iniciada per lorigen (push) configurada per GPO. Pull exigeix predefinir clients a WEC i permisos remots de lectura d'esdeveniments (afegir la credencial al grup Lectors de registre d'esdeveniments).
Xifratge i autenticació: en domini, Kerberos xifra per defecte (NTLM opcional) ; HTTPS es fa servir amb autenticació per certificats quan no hi ha Kerberos. L'autenticació és mútua en tots dos casos.
Format i freqüència: per defecte “Rendered Text”; alternatiu “Events” (binari XML) més compacte . Maneres de lliurament: Normal, Minimitzar amplada de banda (push, lots cada ~6h), Minimitzar latència (push, lots ~30s) o personalitzat mitjançant WECUTIL amb DeliveryMaxItems i DeliveryMaxLatencyTime.
Límits pràctics de WEC: disc de registre EVTX (E/S), connexions TCP simultànies i mida del registre (claus persistents per cada origen). Amb grans volums, wecutil.exe és preferible a la consola del visualitzador d'esdeveniments.
Habilitar canals clau i dimensionar logs : DriverFrameworks-UserMode/Operational (habilitar i ampliar a ~50 MB), CAPI2/Operational (100 MB i permisos per a Lectors de registre d'esdeveniments), AppLocker (EXE/DLL i MSI/Script, ~100 MB). Fes servir GPO amb wevtutil per scriptar:
%SystemRoot%\System32\wevtutil.exe sl Microsoft-Windows-DriverFrameworks-UserMode/Operational /e:true
%SystemRoot%\System32\wevtutil.exe sl "Microsoft-Windows-DriverFrameworks-UserMode/Operational" /ms:52432896
%SystemRoot%\System32\wevtutil.exe sl Microsoft-Windows-CAPI2/Operational /e:true
%SystemRoot%\System32\wevtutil.exe sl Microsoft-Windows-CAPI2/Operational /ms:102432768
%SystemRoot%\System32\wevtutil.exe sl Microsoft-Windows-CAPI2/Operational /ca:"O:BAG:SYD:(A;;0x7;;;BA)(A;;0x2;;;AU)(A;;0x1;;;S-1-5-32-573)"
%SystemRoot%\System32\wevtutil.exe sl "Microsoft-Windows-AppLocker/EXE and DLL" /ms:102432768
Esdeveniments rellevants per a USB i activitat de dispositiu: DriverFrameworks-UserMode: 2003, 2004, 2006, 2010, 2100, 2101, 2105, 2106 i 2102 (desconnexió) . Al canal de Seguretat i Sistema, amplia auditoria per a creació de processos (4688), canvis de registre (4657), sessions RDP (4778/4779), recursos compartits (5140, 5142, 5144), temps del sistema (4616), inicis/tancs en línia (12/13/1074) sospitosa.
Subscripcions WEF predefinides: “línia base” amb esdeveniments de seguretat, AppLocker, Sysmon/Operational (si s'aplica), SMBClient/Operational, Error Reporting, TaskScheduler/Operational , etc.; i “sospitosa” amb xarxa (logon tipus 3), DNS Client/Operational (3008, filtrant buits), CAPI2 (11/70/90), PowerShell/Operational (4103-4106) , DriverFrameworks-UserMode/Operational (2004) i més. Ajusta “llegir esdeveniments existents” a true a la de sospitosos per escombrar històric.
Opcions avançades: forçar format “Events” amb WECUTIL per doblegar capacitat i personalitzar latència/mida de lot:
wecutil ss "NombreSuscripcion" /cf:Events
wecutil ss "NombreSuscripcion" /cm:Custom
wecutil ss "NombreSuscripcion" /dmi:1
wecutil ss "NombreSuscripcion" /dmlt:10
Registre de PowerShell i anàlisi forense
PowerShell des de la v5.0 activa el registre de blocs de script (4104) per defecte , amb fragmentació en múltiples esdeveniments quan el contingut és gran. Això permet reconstruir scripts executats, clau en resposta a incidents.
Per a reconstruccions, filtra per ScriptBlock ID i ordena per seqüència per concatenar el contingut original, encara que només recuperes part per rotació de logs:
# Extraer eventos 4104 con un ScriptBlockID concreto
$evts = Get-WinEvent -FilterHashtable @{ Path='C:\Ruta\Microsoft-Windows-PowerShell%4Operational.evtx'; ProviderName='Microsoft-Windows-PowerShell'; Id=4104 } |
Where-Object { $_.Message -like '*51baf005-40a5-4878-ab90-5ecc51cab9af*' }
$sorted = $evts | Sort-Object { $_.Properties[0].Value }
$sorted | Select-Object TimeCreated, ActivityId, Id, Message
# Unir el contenido del script si tuvieras todos los segmentos
# ($sorted | ForEach-Object { $_.Properties[2].Value }) -join '' | Out-File script_reconstruido.ps1 -Encoding UTF8
Regla d'or: augmenta mides de logs i habilita canals que no vénen actius per evitar perdre artefactes per rotació. En entorns moderns, incrementar canals i mides de EVTX no sol impactar rendiment de manera apreciable.
ADAudit Plus i altres integracions
Per a una visió centrada en servidors de fitxers, ADAudit Plus inclou reports d'USB Storage Auditing amb detalls de “file read”, “file modified”, “copy/paste” i “removable device plug-in”. També ofereix cerca per servidor, ruta, autor del canvi i missatge.
En ecosistemes més amplis, Microsoft Endpoint Manager, ManageEngine Endpoint Central i Ivanti fixen polítiques i consoliden senyals de dispositius extraïbles, i un SIEM (Splunk/Elastic) recol·lecta esdeveniments i alerta segons regles i machine learning. Aquest encaix cobreix tant el compliment com la detecció primerenca.

Amb tot això, tens una ruta completa: inventari i esdeveniments en temps real amb PowerShell, API central amb Flask, automatització a l'arrencada, seguretat d'extrem a extrem i WEF per escalar . Si a més alimentes un SIEM i reforces auditoria de seguretat (línia base + sospitosa), obtindràs visibilitat granular, context forense i capacitat de reacció davant d'accessos no autoritzats o intents d'infecció per USB.

