Protección de dispositivos de los comandos dd y fdisk

8

Me pregunto si hay alguna manera de evitar que ciertos dispositivos se conviertan en el archivo de salida del ddcomando y el objetivo del fdiskcomando. Actualmente estoy usando las dos operaciones para configurar escribir un gestor de arranque, kernel y sistema de archivos raíz en una tarjeta SD, que aparece como /dev/sdd. Siempre estoy un poco ansioso de que me mezclo sddcon sdb, o sdaya que las letras Ay Destán cerca en el teclado, y me gustaría encontrar una manera de prevenir los comandos con este formato:

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

o

fdisk /dev/sd[ab]
sj755
fuente
1
Una posible solución es configurar los permisos para que solo tenga acceso de escritura directa a la tarjeta SD pero no a ningún otro dispositivo de almacenamiento.
Sampo Sarrala - codidact.org

Respuestas:

5

Puede intentar escribir una regla udev para dar a los HDD suplementarios nombres suficientemente únicos.

Otra idea: cada vez que puede expresar un requisito de seguridad como "No es quién lo está haciendo, sino cómo lo están haciendo", está hablando de la aplicación de tipo, y en la mayoría de las distribuciones de Linux, TE se realiza a nivel MAC. La mayor parte de mi experiencia MAC es con "SELinux"

No puede bloquearlo en el nivel DAC; de lo contrario, no podría realizar E / S en el dispositivo (no necesariamente una falla de DAC como modelo de seguridad, es solo que la política actual de DAC se basa únicamente en la identidad, por lo que todos los programas ejecutar bajo una identidad particular obtener derechos idénticos sin posible expresión administrativa adicional). Se puede bloquearlo en el nivel MAC para que los componentes del espacio de usuario normal no puedan hacer nada con el archivo de bloqueo, pero sus utilidades raíz y ciertas partes de la plataforma sí. En Fedora, este ya es el caso de los dispositivos de bloque que se muestran con el tipo SELinux de fixed_disk_device_ty grub que bootloader_exec_tven el siguiente ejemplo:

[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 ~]# 

Mientras que ddtiene una etiqueta bin_t normal:

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

bin_t(aparentemente) todavía se puede escribir en dispositivos de bloque pero la creación de un nuevo tipo de contexto de archivos para fdisky ddy escribir una regla de SELinux para no permitir el nuevo tipo accedan fixed_disk_device_tno debe ser demasiado difícil. Solo necesitaría hacerlo de modo que los roles de usuario normales no puedan hacerlo, pero los usuarios con el sysadm_tsí pueden hacerlo, luego recuerde hacer solo una newrole -r root:sysadm_rantes de intentar volver a particionar el disco o hacer un dddispositivo sobre el bloque (que no debería ' No será un gran problema ya que no es como si corrieras fdisktodos los días durante todo el día).

Probablemente más trabajo del que estaba buscando, pero TE es el mecanismo que resuelve el problema general con el que se encuentra. Personalmente, la udevregla es probablemente tu apuesta más segura. Solo menciono las cosas de TE en caso de que esté interesado en resolver un conjunto más amplio de problemas similares a este.

Bratchley
fuente
4

Si no está seguro /dev/sdx, use los nombres de dispositivos alternativos que puede encontrar /dev/disk/.

Por ejemplo, mi lector de tarjetas SD es /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Eso es un poco detallado, seguro, pero al menos no hay forma de confundirlo con un HDD.

Alternativamente, hdparm -i /dev/sdxpuede mostrar información útil si es un disco duro y ayudar a evitar accidentes desafortunados ...

Frostschutz
fuente
¿Es posible crear un enlace con un nombre único para un dispositivo?
sj755
1
Con las reglas de udev, pero solo funcionará en cajas que usan esas reglas (y no cuando se inicia un Live CD o similar), mientras que /dev/disk/*está disponible en cualquier sistema Linux.
frostschutz
Las reglas de udev lograrán esto, pero es más fácil usar enlaces simbólicos (siempre que el enlace "desde" no esté en / dev, / proc o / run) O simplemente haga una variable (como en bash / zsh): mysdcard=/dev/sdd, y luego, por supuesto, solo lo usa $mysdcardcomo argumento donde lo necesite.
tgm1024 - Mónica fue maltratada
3

Hay nombres más largos y significativos en /dev/disk/by-*. Para un disco completo, /dev/disk/by-idcontiene un enlace simbólico al dispositivo de disco que contiene el modelo de disco y el número de serie.

Para obtener protección adicional, concédase el permiso para acceder al dispositivo (por ejemplo sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), luego haga el resto bajo su propio usuario en lugar de root.

Asegúrese de verificar que el disco en el que va a actuar tenga el contenido esperado, por ejemplo fdisk -l /dev/whatever, verificar file - </dev/sdz99, ... En el shell, Esc .para recuperar el argumento del comando anterior, nunca vuelva a escribir el nombre del dispositivo.

Gilles 'SO- deja de ser malvado'
fuente
1

Veo dos formas de lograr eso:

  1. Escriba un contenedor (función de shell) y verifique los argumentos allí antes de pasarlos al programa real.
  2. Realice estas operaciones desde un shell que ha sido restringido por SELinux, AppArmor o similares.
Hauke ​​Laging
fuente