Lista branca para flash USB usando o udev

3

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

Eu sei que devo usar as regras udev :

  1. Adicione à regra /etc/udev/rules.d/ para negar todas as unidades flash USB
  2. Adicione outra regra com um número maior para permitir o que eu quero

Eu 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, eu não tenho nenhum desejo neste caso. Qualquer solução.

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

UPD. 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 é assistida por udev usando inotify , portanto as alterações devem entrar em vigor em um flash. Mas sem alterações aplicadas.

    
por Deck 02.12.2013 / 21:17

2 respostas

3

Você não disse se tinha outro software instalado que fosse a montagem automática de todas as unidades. Minha solução abaixo assume que você não faz. Se você fizer isso, entã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 somente discos permitidos (não testados, mas baseados em regras similares 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 é, naturalmente, de acordo com sua preferência. O que mostrei é apenas um exemplo.

UPDATE: Eu recebi de seus comentários que você tem algo instalado que faz automontagem. No meu sistema (Debian Wheezy), eu não sei. Eu tentei o grep que você sugeriu e consegui um resultado diferente. Em /lib/udev/rules.d/80-udisks.rules , encontrei esta seção do 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"

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

    
por 02.12.2013 / 22:01
1

Você pode tentar USBGuard . Ele implementa uma lista negra / whitelist de dispositivo USB no topo do UDev e a estrutura de autorização USB do kernel do Linux. Você pode conseguir o mesmo usando o UDev como já foi proposto, mas o USBGuard é uma ferramenta dedicada para esse trabalho e tem uma linguagem de regras e um applet GUI (opcional).

Como os discos flash USB geralmente têm um número de série, a lista de permissões que usa o VID: PID e um número de série gostaria disso 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 estaria bloqueado.

Aviso: sou o autor desse projeto.

    
por 07.04.2015 / 13:04