Lista blanca para flash USB usando udev

Lista blanca para flash USB usando udev

Quiero crear algo así como una "lista blanca" para unidades flash USB. Me refiero a "negar todo lo que no está permitido".

Sé que debería usar udevreglas:

  1. Agregar a /etc/udev/rules.d/una regla para rechazar todas las unidades flash USB
  2. Agregar otra regla con un número mayor para permitir lo que quiero

Quiero ocuparme únicamente de unidades flash USB. Las reglas pueden basarse en cualquier información de la unidad USB. Me refiero a la identificación del proveedor, al número de serie. Quiero decir que no tengo ningún deseo en este caso. Alguna solución.

Pero no sé qué debo escribir en los archivos de reglas. ¿Puedes dar un ejemplo?

UPD. Creo un archivo con el siguiente contenido:

deck@crunch /etc/udev/rules.d $ cat 90-deny-usbflash.rules 
BUS=="usb", OPTIONS+="ignore_device"

Como sé, esta carpeta se supervisa mediante udevel uso inotify, por lo que los cambios deberían surtir efecto en un instante. Pero no se aplicaron cambios.

Respuesta1

No dijo si tenía instalado otro software que monta automáticamente todas las unidades. Mi solución a continuación supone que no es así. Si lo hace, entonces su problema es diferente: debe especificar qué es para que alguien pueda sugerir cómo desinstalarlo o controlarlo.

Aquí hay un ejemplo de reglas de udev para montar solo unidades permitidas (no probadas pero basadas en reglas similares que uso):

#-- Skip if not an appropriate "sd" device
KERNEL!="sd[b-z]*", GOTO="99_exit"
SUBSYSTEM!="block", GOTO="99_exit"

#-- Handle 'remove' and 'change' events
SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/usr/bin/pumount /dev/%k", GOTO="99_exit"
ACTION=="remove|change", GOTO="99_exit"

#-- Create useful environment variables
SUBSYSTEMS=="usb", ENV{ID_SERIAL}!="?*", IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_FS_LABEL}!="?*", IMPORT{program}="/sbin/blkid -o udev -p %N"

#-- Skip if this is not a filesystem (e.g. if this is the whole drive, not a formatted partition)
ENV{ID_FS_USAGE}!="filesystem", GOTO="99_exit"

#-- Mount only allowed drives:
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="something_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/some_name"
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="other_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/other_name"

#-- Exit
LABEL="99_exit"

El comando de montaje que utilice depende, por supuesto, de sus preferencias. El que mostré es sólo un ejemplo.

ACTUALIZACIÓN: Deduzco de tus comentarios que tienes algo instalado que se monta automáticamente. En mi sistema (Debian Wheezy), no lo hago. Probé el grep que sugeriste y obtuve un resultado diferente. En /lib/udev/rules.d/80-udisks.rules, encontré esta sección de código:

# Mark devices that shouldn't be automounted / autoassembled etc.
#
# Deny all, then punch holes for what looks like physical drives
# (TODO: this heuristic might need some work)
#

ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{DISKS_PRESENTATION_NOPOLICY}="0"

Esto sugiere que,siTenía instalado un software de montaje automático que podía controlarse mediante la variable de entorno UDISKS_PRESENTATION_NOPOLICY. No has especificado tu distribución pero aparentemente es diferente.

Respuesta2

Tu podrías intentarUSBGuard. Implementa una lista negra/lista blanca de dispositivos USB además de UDev y el marco de autorización USB del kernel de Linux. Podría lograr lo mismo usando UDev como ya se propuso, pero USBGuard es una herramienta dedicada para ese trabajo y tiene unalenguaje de reglasy un subprograma GUI (opcional).

Dado que los discos flash USB generalmente tienen un número de serie, entonces incluya en la lista blanca usando VID:PID y un número de serie como este en usbguard:

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

Esto permitiría (autorizaría) conectar dos dispositivos USB con solo una interfaz de almacenamiento masivo, VID:PID o 1234:5678 y un valor iSerial de "123456" o "abcdef". Todo lo demás quedaría bloqueado.

Descargo de responsabilidad: soy el autor de ese proyecto.

información relacionada