Protezione dei dispositivi dai comandi dd e fdisk


8

Mi chiedo se esiste un modo per impedire ad alcuni dispositivi di diventare il file di output del ddcomando e la destinazione del fdiskcomando. Attualmente sto usando le due operazioni per impostare una scrittura di un bootloader, un kernel e un filesystem di root su una scheda SD, che appare come /dev/sdd. Sono sempre un po 'ansioso che io si mescolano sddcon sdb, o sdain quanto le lettere Ae Dsono vicini sulla tastiera, e mi piacerebbe trovare un modo per evitare che i comandi con questo formato:

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

o

fdisk /dev/sd[ab]

1
Una possibile soluzione consiste nell'impostare le autorizzazioni in modo da disporre solo dell'accesso diretto in scrittura alla scheda SD ma non su qualsiasi altro dispositivo di archiviazione.
Sampo Sarrala - codidact.org

Risposte:


5

Potresti provare a scrivere una regola udev per dare ai dischi rigidi supplementari nomi sufficientemente univoci.

Un'altra idea: ogni volta che puoi definire un requisito di sicurezza come "Non è chi lo sta facendo, è come lo stanno facendo" stai parlando dell'applicazione del tipo, e nella maggior parte delle distro Linux TE viene fatto a livello MAC. Gran parte della mia esperienza MAC è con "SELinux"

Non è possibile bloccarlo a livello di DAC, altrimenti non si sarebbe in grado di eseguire I / O sul dispositivo (non necessariamente un fallimento del DAC come modello di sicurezza, è solo la politica DAC corrente è basata esclusivamente sull'identità, quindi tutti i programmi in esecuzione con una determinata identità ottenere diritti identici senza alcuna ulteriore espressione amministrativa possibile). Il blocco a livello MAC può essere effettuato in modo che i normali componenti dello spazio utente non possano fare nulla con il file di blocco, ma le tue utilità di root e alcune parti della piattaforma possono farlo. Su Fedora questo è già il caso con i dispositivi a blocchi mostrati con il tipo SELinux di fixed_disk_device_te grub che bootloader_exec_tvedono il seguente esempio:

[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 che ddha un'etichetta bin_t normale:

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

bin_t(a quanto pare) può ancora scrivere per bloccare i dispositivi ma la creazione di un nuovo tipo di contesto di file per fdiske dde la scrittura di una regola selinux per impedire l'accesso al nuovo tipo fixed_disk_device_tnon dovrebbe essere troppo difficile. Avresti solo bisogno di renderlo così i ruoli utente regolari non possono farlo ma gli utenti con sysadm_tpossono farlo, quindi ricorda di fare solo un newrole -r root:sysadm_rprima di provare a ricomporre il disco o fare un dddispositivo over the block (che non dovrebbe essere un affare enorme dal momento che non è come correre fdisktutti i giorni tutto il giorno).

Probabilmente più lavoro di quello che stavi cercando, ma TE è il meccanismo che risolve il problema generale in cui ti imbatti. Personalmente, la udevregola è probabilmente la scommessa più sicura. Cito solo le cose di TE nel caso in cui tu sia interessato a risolvere una serie più ampia di problemi simili a questo.


4

In caso di dubbi /dev/sdx, utilizzare i nomi di dispositivo alternativi in ​​cui è possibile trovare /dev/disk/.

Ad esempio, il mio lettore di schede SD è /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Questo è un po 'prolisso, sicuramente, ma almeno non c'è modo di confonderlo con un HDD.

In alternativa a hdparm -i /dev/sdxpuò mostrare informazioni utili se si tratta di un disco rigido e aiutare a evitare incidenti sfortunati ...


È possibile creare un collegamento con un nome univoco a un dispositivo?
sj755,

1
Con le regole udev, ma funzionerà solo sui box che usano quelle regole (e non quando si avvia un Live CD o simili), mentre /dev/disk/*è disponibile su qualsiasi sistema Linux.
frostschutz,

Le regole di udev realizzeranno questo, ma è più facile usare i collegamenti simbolici (a patto che il link "from" non sia esso stesso in / dev, / proc o / run) O semplicemente creare una variabile (come in bash / zsh): mysdcard=/dev/sdde poi ovviamente usi $mysdcardl'argomento ovunque ne abbia bisogno.
tgm1024 - Monica è stata maltrattata il

3

Ci sono nomi più lunghi e significativi in /dev/disk/by-*. Per un intero disco, /dev/disk/by-idcontiene un collegamento simbolico al dispositivo disco che contiene il modello del disco e il numero di serie.

Per ulteriore protezione, concediti l'autorizzazione ad accedere al dispositivo (ad es. sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), Quindi fai il resto sotto il tuo utente invece di root.

Assicurati di controllare due volte che il disco si sta andando ad agire per il contenuto ha previsto, ad esempio, di controllo fdisk -l /dev/whatever, file - </dev/sdz99... Nella shell, Esc .per richiamare l'argomento del comando precedente, non digitare nuovamente il nome del dispositivo.


1

Vedo due modi per farlo:

  1. Scrivi un wrapper (funzione shell) e controlla lì gli argomenti prima di passarli al programma reale.
  2. Esegui queste operazioni da una shell che è stata limitata da SELinux, AppArmor o simili.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.