Protegendo dispositivos dos comandos dd e fdisk


8

Gostaria de saber se existe alguma maneira de impedir que certos dispositivos se tornem o arquivo de saída do ddcomando e o destino do fdiskcomando. Atualmente, estou usando as duas operações para configurar uma gravação de um carregador de inicialização, kernel e sistema de arquivos raiz em um cartão SD, que aparece como /dev/sdd. Estou sempre um pouco ansioso que eu vou misturar-se sddcom sdb, ou sdadesde as letras Ae Destão perto do teclado, e eu gostaria de encontrar uma maneira de impedir que os comandos com este formato:

dd if=/dev/sd[a-zA-Z0-9]* of=/dev/sd[ab]

ou

fdisk /dev/sd[ab]

1
Uma solução possível é configurar as permissões para que você tenha acesso direto à gravação no cartão SD, mas não em nenhum outro dispositivo de armazenamento.
Sampo Sarrala - codidact.org

Respostas:


5

Você pode tentar escrever uma regra do udev para fornecer nomes suficientes ao HDD suplementar.

Outra idéia: sempre que você pode definir um requisito de segurança como "Não é quem está fazendo, é como está fazendo", você está falando sobre imposição de tipos e, na maioria das distros do Linux, a TE é feita no nível MAC. A maior parte da minha experiência com MAC é com "SELinux"

Você não pode bloqueá-lo no nível do DAC, caso contrário, não seria capaz de executar E / S no dispositivo (não necessariamente uma falha do DAC como modelo de segurança, é apenas uma política atual do DAC que é baseada apenas na identidade, para todos os programas a execução sob uma identidade específica obtém direitos idênticos sem expressão administrativa adicional possível). O bloqueio no nível do MAC pode ser feito para que os componentes regulares do espaço do usuário não possam fazer nada com o arquivo de bloqueio, mas seus utilitários raiz e certas partes da plataforma. No Fedora, esse já é o caso dos dispositivos de bloco aparecendo com o tipo SELinux de fixed_disk_device_te grub, tendo bootloader_exec_to seguinte exemplo:

[root@localhost ~]# ls -lhZ $(which grub2-install)
-rwxr-xr-x. root root system_u:object_r:bootloader_exec_t:s0 /sbin/grub2-install
[root@localhost ~]# ls -lhZ /dev/sda
brw-rw----+ root disk system_u:object_r:fixed_disk_device_t:s0 /dev/sda
[root@localhost ~]# sesearch --allow | egrep bootloader | grep fixed
   allow bootloader_t fixed_disk_device_t : lnk_file { read getattr } ; 
   allow bootloader_t fixed_disk_device_t : chr_file { ioctl read write getattr lock append open } ; 
   allow bootloader_t fixed_disk_device_t : blk_file { ioctl read write getattr lock append open } ; 
[root@localhost ~]# 

Considerando que ddpossui um rótulo bin_t regular:

[root@localhost ~]# ls -lhZ $(which dd)
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /bin/dd

bin_t(aparentemente) ainda pode escrever para dispositivos de bloco, mas a criação de um novo tipo de contexto de arquivo para fdiske dde escrever uma regra selinux para não permitir o novo tipo de acessar fixed_disk_device_tnão deve ser muito difícil. Você só precisaria fazê-lo para que as funções de usuário regulares não possam fazê-lo, mas os usuários com o sysadm_tpodem fazê-lo; lembre-se de fazer um newrole -r root:sysadm_rantes de tentar re-particionar o disco ou executar um dddispositivo over-block (o que não deve ser ' Não é um grande negócio, já que não é como se você corresse fdisktodos os dias o dia inteiro).

Provavelmente mais trabalho do que você procurava, mas o TE é o mecanismo que resolve o problema geral em que você está se deparando. Pessoalmente, a udevregra é provavelmente a sua aposta mais segura. Menciono apenas o material da TE, caso você esteja interessado em resolver um conjunto maior de problemas semelhantes a este.


4

Se não tiver certeza /dev/sdx, use os nomes de dispositivos alternativos que você pode encontrar /dev/disk/.

Por exemplo, meu leitor de cartão SD é /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Isso é um pouco detalhado, com certeza, mas pelo menos não há como confundi-lo com um disco rígido.

Como alternativa, um hdparm -i /dev/sdxpode mostrar informações úteis se for um disco rígido e ajudar a evitar acidentes infelizes ...


É possível criar um link com nome exclusivo para um dispositivo?
Sj755

1
Com as regras do udev, ele funcionará apenas nas caixas que as usam (e não ao inicializar um Live CD ou similar), enquanto /dev/disk/*está disponível em qualquer sistema Linux.
Frostschutz 27/05

As regras do udev conseguirão isso, mas é mais fácil usar links simbólicos (desde que o link "from" não esteja em / dev, / proc ou / run) OU simplesmente faça uma variável (como em bash / zsh): mysdcard=/dev/sdde, é claro, você pode usar $mysdcardcomo argumento sempre que precisar.
tgm1024 - Monica foi maltratada em

3

Existem nomes mais longos e significativos em /dev/disk/by-*. Para um disco inteiro, /dev/disk/by-idcontém um link simbólico para o dispositivo de disco que contém o modelo e o número de série do disco.

Para obter proteção adicional, dê a si mesmo a permissão para acessar o dispositivo (por exemplo sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H) e faça o resto com seu próprio usuário, em vez de com o root.

Verifique se o disco em que você irá atuar possui o conteúdo esperado, por exemplo fdisk -l /dev/whatever, verifique file - </dev/sdz99, ... No shell, Esc .para recuperar o argumento do comando anterior, nunca digite novamente o nome do dispositivo.


1

Eu vejo duas maneiras de conseguir isso:

  1. Escreva um wrapper (função shell) e verifique os argumentos antes de passá-los para o programa real.
  2. Faça essas operações a partir de um shell que tenha sido restringido pelo SELinux, AppArmor ou similar.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.