Lista blanca para flash USB usando udev

3

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

Sé que debo usar udevreglas:

  1. Agregue a /etc/udev/rules.d/una regla para negar cada unidad flash USB
  2. Agregar otra regla con un número más alto para permitir lo que quiero

Solo quiero tratar con unidades flash USB. Las reglas pueden basarse en cualquier información de la unidad USB. Me refiero a la identificación del proveedor, 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 vigila mediante el udevuso inotifypara que los cambios surtan efecto en un instante. Pero no se aplicaron cambios.

Cubierta
fuente

Respuestas:

3

No dijo si tenía otro software instalado que esté montando automáticamente todas las unidades. Mi solución a continuación supone que no. 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 yo 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 utiliza depende, por supuesto, de su preferencia. El que mostré es solo un ejemplo.

ACTUALIZACIÓN: deduzco de sus comentarios que tiene 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, si tuviera instalado un software de montaje automático, podría ser controlado por la variable de entorno UDISKS_PRESENTATION_NOPOLICY. No ha especificado su distribución, pero aparentemente es diferente.

John1024
fuente
Entiendo tu solución. Solo pensé que podría ignorar el dispositivo conectado y mis reglas sobrescriben a los demás para que no monten nada
Deck
Por cierto cat /lib/udev/rules.d/* | grep mountno imprime nada
Mazo
@Deck, actualicé la respuesta con información de mi sistema (Debian) que aparentemente es diferente de la tuya. Además, según lo establecido man udev, es posible que desee ejecutar grep mountlos directorios /etc/udev/rules.d/y /run/udev/rules.d/.
John1024
1

Puedes probar USBGuard . Implementa una lista negra / lista blanca de dispositivos USB en la parte superior de UDev y el marco de autorización USB del kernel de Linux. Puede lograr lo mismo usando UDev como ya se propuso, pero USBGuard es una herramienta dedicada para ese trabajo y tiene un lenguaje de reglas y un applet GUI (opcional).

Dado que los discos flash USB generalmente tienen un número de serie, entonces la lista blanca usando VID: PID y un número de serie quisiera esto 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) conectar dos dispositivos USB con solo una interfaz de almacenamiento masivo, VID: PID o 1234: 5678 y un valor de iSerial de "123456" o "abcdef". Todo lo demás estaría bloqueado.

Descargo de responsabilidad: soy el autor de ese proyecto.

Daniel Kopeček
fuente