udev regras para permitir apenas um fornecedor e modelo de drive USB, mas nenhum outro

5

Então, estamos trabalhando para criar um ambiente aqui onde tenhamos uma configuração de armazenamento seguro em nossos laptops Linux, de modo que nossos laptops Linux só consigam conectar uma unidade USB específica: um Kingston DataTraveler 2.0. Fornecedor: o código do modelo é este (de lsusb ): Bus 003 Device 003: ID 0951:1665 Kingston Technology

Estou tentando fazer com que essas regras funcionem, mas em um ambiente 12.04 as regras não estão funcionando. (Observe que eu fiz comentários com as linhas preended # , mas eles não estão nos arquivos udev):

# If a device is NOT a Kingston drive, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device"

# If a device is a Kingston drive, but is NOT the model we have, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device"

# If a device is a Kingston drive and is the model we have, then run a script
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh"

O problema que tenho é que NENHUMA dessas regras está funcionando, e não tenho idéia se essa é a abordagem correta para isso.

Pensamentos?

    
por Thomas Ward 21.05.2015 / 23:18

2 respostas

6

Eu já enfrentei antes o mesmo problema com o ignore_device não eficaz. Eu não consegui descobrir porque então eu sempre vou com outras soluções.

  • Bem, ignore_device foi removido com a versão 148 do udev. Consulte a nota de lançamento ou changelog

    Se você percebeu, todos os tópicos que sugerem o uso dele são antigos (~ 2009).

  • Uma alternativa rápida é usar: ENV{UDISKS_PRESENTATION_HIDE}="1" (Ubuntu 12.04). Para lançamentos (> = 12.10) que incluem udisks2 use: ENV{UDISKS_IGNORE}="1" .

    Referência: Archlinux Wiki: Udisks

As outras soluções estão usando o SYSFS. device/authorized (como mencionado em solsTiCe), device/remove ou driver/unbind . Consulte Use somente dispositivos de armazenamento em massa em um dispositivo USB selecionado port - como?

A dificuldade vem em como negar todo o armazenamento, exceto apenas uma marca / modelo. Portanto, a condição de correspondência da regra deve filtrar um único nó de dispositivo, nem mais nem menos (nenhum dispositivo pai ou filho). É por isso que adicionei KERNELS=="[1-9]*-[0-9]*"

KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", ENV{UDISKS_PRESENTATION_HIDE}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", ENV{UDISKS_PRESENTATION_HIDE}="1"

Bem, o UDisks oculta apenas o gancho de montagem. Estes podem ser melhores usando o driver SYSFS unbind.

KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="125f", ENV{IF_STORAGE_REMOVE_ME}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="125f", ATTRS{idProduct}!="c96a", ENV{IF_STORAGE_REMOVE_ME}="1"
ENV{IF_STORAGE_REMOVE_ME}=="1", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"

Referência: regra do udev com poucos dispositivos pai atributos

    
por user.dz 24.05.2015 / 17:32
2
% bl0ck_qu0te%

Então, eu meio que resolvi isso, e foi uma DOR para fazer.

Eu reexaminei as restrições em minhas regras e alterei a funcionalidade. Aparentemente, o 12.04 não honra a opção ignore_device . Então, eu improvisei e escrevi um roteiro de desmontagem. Como há apenas uma porta USB funcional nesses sistemas, acabamos com o seguinte, que eu sei que pode quebrar outras coisas:

/etc/udev/rules.d/100-restrict-usb-devices.rules

# If a device is NOT a Kingston drive, ignore it.
ACTION=="add", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"

# If a device is a Kingston drive, but is NOT the model we have, ignore it.
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"

# If a device is a Kingston drive and is the model we have, then run a script
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh", RUN+="/usr/bin/logger AuthorizedUSBConnected"

/lib/udev/unmount.sh - Apenas um script que verifica primeiro os dispositivos existentes e verifica todos os outros dispositivos de unidade e desmonta se e somente se o script for executado. Como todos os dispositivos seriam sdb , sdc etc., há maneiras de fazer com que tudo funcione.

Moral da história: o sistema ignora a opção ignore_device em 12.04. Tenho que escrever tudo. : /

    
por Thomas Ward 22.05.2015 / 16:26