Lista branca para flash USB usando udev

Lista branca para flash USB usando udev

Quero criar algo como uma "lista branca" para unidades flash USB. Quero dizer “negar tudo o que não é permitido”.

Eu sei que devo usar udevregras:

  1. Adicione a /etc/udev/rules.d/uma regra para negar todas as unidades flash USB
  2. Adicione outra regra com número maior para permitir o que desejo

Quero lidar apenas com unidades flash USB. As regras podem ser baseadas em qualquer informação da unidade USB. Quero dizer ID do fornecedor, número de série. Quer dizer, não tenho nenhum desejo neste caso. Qualquer solução.

Mas não sei o que devo escrever nos arquivos de regras. Você pode dar um exemplo?

Atualização. Eu crio um arquivo com o seguinte conteúdo:

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

Como eu sei, esta pasta é monitorada udevusando inotify, portanto as alterações devem entrar em vigor rapidamente. Mas nenhuma alteração foi aplicada.

Responder1

Você não disse se tinha outro software instalado que monta automaticamente todas as unidades. Minha solução abaixo pressupõe que você não. Se o fizer, então o seu problema é diferente: você deve especificar o que é para que alguém possa sugerir como desinstalá-lo ou controlá-lo.

Aqui está um exemplo de regras do udev para montar apenas unidades permitidas (não testadas, mas baseadas em regras semelhantes que eu 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"

O comando de montagem que você usa depende, obviamente, de sua preferência. O que mostrei é apenas um exemplo.

ATUALIZAÇÃO: deduzo de seus comentários que você tem algo instalado que faz montagem automática. No meu sistema (Debian Wheezy), não. Tentei o grep que você sugeriu e obtive um resultado diferente. Em /lib/udev/rules.d/80-udisks.rules, encontrei esta seção 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"

Isto sugere que,seEu tinha um software de montagem automática instalado, ele poderia ser controlado pela variável de ambiente UDISKS_PRESENTATION_NOPOLICY. Você não especificou sua distribuição, mas aparentemente é diferente.

Responder2

Você poderia tentarUSBGuard. Ele implementa uma lista negra/lista branca de dispositivos USB sobre o UDev e a estrutura de autorização USB do kernel Linux. Você poderia conseguir o mesmo usando o UDev conforme já proposto, mas o USBGuard é uma ferramenta dedicada para esse trabalho e possui umlinguagem de regrase um miniaplicativo GUI (opcional).

Como os discos flash USB geralmente têm um número de série, a lista de permissões usando VID:PID e um número de série seria assim no usbguard:

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

Isso permitiria (autorizar) conectar dois dispositivos USB com apenas uma interface de armazenamento em massa, VID:PID ou 1234:5678 e um valor iSerial de "123456" ou "abcdef". Todo o resto seria bloqueado.

Isenção de responsabilidade: sou o autor desse projeto.

informação relacionada