Protegendo Dispositivos dos Comandos dd e fdisk

7

Gostaria de saber se existe alguma maneira de impedir que certos dispositivos se tornem o arquivo de saída do comando dd e o destino do comando fdisk . Atualmente, estou usando as duas operações para configurar um gerenciador de inicialização, kernel e sistema de arquivos raiz em um cartão SD, que aparece como /dev/sdd . Estou sempre um pouco ansioso para mixar sdd com sdb ou sda , pois as letras A e D estão próximas no teclado e gostaria de encontrar uma maneira de evitar comandos com este formato:

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

ou

fdisk /dev/sd[ab]
    
por sj755 27.05.2013 / 20:26

4 respostas

5

Você pode tentar escrever uma regra do udev para dar ao (s) HDD (s) suplementar (s) nomes suficientemente únicos.

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

Você não pode bloqueá-lo no nível do DAC; caso contrário, você não conseguirá executar E / S no dispositivo (não necessariamente uma falha do DAC como modelo de segurança; é apenas uma política DAC atual baseada unicamente em identidade assim, todos os programas executados sob uma identidade específica obtêm direitos idênticos, sem a possibilidade de expressão administrativa adicional). Bloqueá-lo no nível MAC pode ser feito para que os componentes comuns do espaço do usuário não possam fazer nada com o arquivo de bloco, mas seus utilitários de raiz e certas partes da plataforma podem. No Fedora isso já é o caso dos dispositivos de bloco que aparecem com o tipo SELinux de fixed_disk_device_t e o grub com bootloader_exec_t veja o 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 dd tem um marcador 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 gravar em dispositivos de bloco, mas criar um novo tipo de contexto de arquivo para fdisk e dd e escrever uma regra de selinux para não permitir que o novo tipo acesse fixed_disk_device_t difícil. Você só precisaria fazer com que as funções de usuário regulares não pudessem fazer isso, mas os usuários com sysadm_t podem fazer isso, então lembre-se de apenas fazer um newrole -r root:sysadm_r antes de tentar reparticionar o disco ou fazer um dd sobre o dispositivo de bloco (o que não deve ser um grande problema, pois não é como você executa fdisk todos os dias durante todo o dia).

Provavelmente mais trabalho do que você procurava, mas o TE é o mecanismo que resolve o problema geral que você está enfrentando. Pessoalmente, a regra udev é provavelmente a sua aposta mais segura. Eu só mencionei as coisas da TE caso você esteja interessado em resolver um conjunto maior de problemas semelhantes a este.

    
por 27.05.2013 / 21:30
3

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

Por exemplo, meu leitor de cartões 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 HDD.

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

    
por 27.05.2013 / 20:54
2

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

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

Certifique-se de confirmar que o disco em que você vai atuar tem o conteúdo esperado, por exemplo, verifique fdisk -l /dev/whatever , file - </dev/sdz99 ,… No shell, Esc . para recuperar o argumento do comando anterior, nunca digite novamente o nome do dispositivo.

    
por 28.05.2013 / 01:19
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 foi restrito pelo SELinux, AppArmor ou algo semelhante.
por 27.05.2013 / 21:17