Escrevendo imagens raw com segurança para pen drives USB

7

Experimentando muitas distribuições Linux diferentes em todos os tipos de hardware, eu me encontro digitando comandos como este com bastante frequência:

sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240

Escusado será dizer que, mais cedo ou mais tarde eu vou digitar errado o destino e limpe um disco rígido em vez do drive USB pretendido. Eu gostaria de não usar sudo toda vez aqui.

No meu sistema, um Ubuntu bastante moderno, as permissões em /dev/sdc são como: (quando um bastão está presente):

$ ls -al /dev/sdc*
brw-rw---- 1 root disk 8, 32 Apr  6 22:10 /dev/sdc

Como posso conceder ao meu usuário regular acesso de gravação a pen drives aleatórios, mas não a outros discos presentes no meu sistema?

    
por mogul 13.04.2014 / 14:51

1 resposta

11

Eu acho que você pode usar o UDEV para fazer o que quiser. Criar um arquivo de regras, como /etc/udev/rules.d/99-thumbdrives.rules , você simplesmente adicionaria uma regra que permitiria a um grupo Unix ou acesso de usuário a pen drives USB arbitrários.

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660"

Criaria o dispositivo usando o usuário <user> e o grupo <group> .

Exemplo

  1. Depois de adicionar esta linha ao meu sistema.

    KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660"
    
  2. E recarregando minhas regras:

    $ sudo udevadm control --reload-rules
    
  3. Se eu inserir um thumbdrive no meu sistema, meu /var/log/messages será exibido da seguinte forma:

    $ sudo tail -f /var/log/messages
    Apr 13 11:48:45 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
    Apr 13 11:51:18 greeneggs udisksd[2249]: Cleaning up mount point /run/media/saml/HOLA (device 8:17 is not mounted)
    Apr 13 11:51:18 greeneggs udisksd[2249]: Unmounted /dev/sdb1 on behalf of uid 1000
    Apr 13 11:51:18 greeneggs kernel: [171038.843969] sdb: detected capacity change from 32768000 to 0
    Apr 13 11:51:39 greeneggs kernel: [171058.964358] usb 2-1.2: USB disconnect, device number 15
    Apr 13 11:51:46 greeneggs kernel: [171066.053922] usb 2-1.2: new full-speed USB device number 16 using ehci-pci
    Apr 13 11:51:46 greeneggs kernel: [171066.134401] usb 2-1.2: New USB device found, idVendor=058f, idProduct=9380
    Apr 13 11:51:46 greeneggs kernel: [171066.134407] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    Apr 13 11:51:46 greeneggs kernel: [171066.134410] usb 2-1.2: Product: USBDrive
    Apr 13 11:51:46 greeneggs kernel: [171066.134412] usb 2-1.2: Manufacturer: JMTek
    Apr 13 11:51:46 greeneggs kernel: [171066.135470] usb-storage 2-1.2:1.0: USB Mass Storage device detected
    Apr 13 11:51:46 greeneggs kernel: [171066.136121] scsi17 : usb-storage 2-1.2:1.0
    Apr 13 11:51:46 greeneggs mtp-probe: checking bus 2, device 16: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
    Apr 13 11:51:46 greeneggs mtp-probe: bus: 2, device: 16 was not an MTP device
    Apr 13 11:51:47 greeneggs kernel: [171067.139462] scsi 17:0:0:0: Direct-Access     JMTek    USBDrive         7.77 PQ: 0 ANSI: 2
    Apr 13 11:51:47 greeneggs kernel: [171067.140251] sd 17:0:0:0: Attached scsi generic sg2 type 0
    Apr 13 11:51:47 greeneggs kernel: [171067.142105] sd 17:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
    Apr 13 11:51:47 greeneggs kernel: [171067.144236] sd 17:0:0:0: [sdb] Write Protect is off
    Apr 13 11:51:47 greeneggs kernel: [171067.145988] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.145998] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.153721] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.153728] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.159028]  sdb: sdb1
    Apr 13 11:51:47 greeneggs kernel: [171067.164760] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.164768] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.164775] sd 17:0:0:0: [sdb] Attached SCSI removable disk
    Apr 13 11:51:47 greeneggs kernel: [171067.635474] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
    Apr 13 11:51:47 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
    
  4. Agora, o check-out dos arquivos do dispositivo em /dev mostra o seguinte:

    $ ls -l /dev/sd*
    brw-rw----. 1 root disk 8,  0 Apr 13 09:17 /dev/sda
    brw-rw----. 1 root disk 8,  1 Apr 13 09:17 /dev/sda1
    brw-rw----. 1 root disk 8,  2 Apr 13 09:17 /dev/sda2
    brw-rw----. 1 saml saml 8, 16 Apr 13 11:51 /dev/sdb
    brw-rw----. 1 root disk 8, 17 Apr 13 11:51 /dev/sdb1
    

Então, parece que funcionou.

Sendo mais explícito

Os itens acima funcionarão, mas provavelmente essas regras serão aplicadas a todos os dispositivos de bloco, o que não é exatamente o que queremos. Para reduzir um pouco seu foco, você pode usar as regras de atributo ATTRS{..}==... para restringir o aplicativo a um hardware específico. No meu caso, eu só quero que seja aplicado a um único thumbdrive USB.

Etapa 1 - dispositivo de identificação exclusivo

Então, para começar, podemos usar este comando assim que montarmos o pen drive específico, para que possamos usar udevadm para examiná-lo, procurando por seus atributos particulares.

Aqui estou focando nos atributos "fabricante" e "produto".

$ udevadm info -a -p $(udevadm info -q path -n /dev/sdb)|grep -iE "manufacturer|product"
    ATTRS{manufacturer}=="JMTek"
    ATTRS{idProduct}=="9380"
    ATTRS{product}=="USBDrive"
    ATTRS{idProduct}=="0020"
    ATTRS{manufacturer}=="Linux 3.13.7-100.fc19.x86_64 ehci_hcd"
    ATTRS{idProduct}=="0002"
    ATTRS{product}=="EHCI Host Controller"

OBSERVAÇÃO: ATTRS{..}==.. atributos são atributos para dispositivos pai na hierarquia de onde o arquivo de dispositivo deste dispositivo é derivado. Portanto, no nosso caso, o dispositivo de bloco sendo adicionado, /dev/sdb é proveniente de um dispositivo pai USB, por isso, estamos procurando os atributos desse pai, ATTRS{manufacturer}=... , por exemplo.

Portanto, neste exemplo, estou selecionando o fabricante "JMTek" e o produto "USBDrive".

Etapa 2 - modificar .rules flie

Então, com esses bits adicionais na mão, vamos adicioná-los ao nosso arquivo .rules original.

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ATTRS{manufacturer}=="JMTek", ATTRS{product}=="USBDrive", OWNER="saml", GROUP="saml", MODE="0660"

Etapa 3 - Experimentando

Agora, quando recarregarmos nossas regras e desmontar / remover / reinserir nosso thumbdrive USB novamente, obteremos esta regra:

$ ls -l /dev/sdb*
brw-rw----. 1 saml saml 8, 16 Apr 13 12:29 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:29 /dev/sdb1

No entanto, se eu inserir um dispositivo completamente diferente:

$ ls -l /dev/sdb*
brw-rw----. 1 root disk 8, 16 Apr 13 12:41 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:41 /dev/sdb1

Referências

por 13.04.2014 / 16:07