Schutz von Geräten vor dd- und fdisk-Befehlen

8

Ich frage mich, ob es eine Möglichkeit gibt, zu verhindern, dass bestimmte Geräte zur Ausgabedatei des ddBefehls und zum Ziel des fdiskBefehls werden. Ich verwende derzeit die beiden Vorgänge, um einen Bootloader, einen Kernel und ein Root-Dateisystem auf eine SD-Karte zu schreiben, die als angezeigt wird /dev/sdd. Ich bin immer ein wenig besorgt , dass ich mischen werde sddmit sdb, oder sdada die Buchstaben Aund Dsind in der Nähe auf der Tastatur, und ich möchte einen Weg finden , Befehle mit diesem Format zu verhindern:

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

oder

fdisk /dev/sd[ab]
sj755
quelle
1
Eine mögliche Lösung besteht darin, Berechtigungen so einzurichten, dass Sie nur direkten Schreibzugriff auf die SD-Karte haben, jedoch nicht auf einem anderen Speichergerät.
Sampo Sarrala - codidact.org

Antworten:

5

Sie können versuchen, eine udev-Regel zu schreiben, um den zusätzlichen Festplatten ausreichend eindeutige Namen zu geben.

Eine andere Idee: Wann immer Sie eine Sicherheitsanforderung als "Es ist nicht wer es tut, es ist wie sie es tun" ausdrücken können, sprechen Sie von Typendurchsetzung, und in den meisten Linux-Distributionen wird TE auf MAC-Ebene durchgeführt. Der größte Teil meiner MAC-Erfahrung ist mit "SELinux"

Sie können es nicht auf DAC-Ebene sperren, da Sie sonst keine E / A auf dem Gerät ausführen könnten (nicht unbedingt ein Fehler von DAC als Sicherheitsmodell, sondern nur die aktuelle DAC-Richtlinie basiert ausschließlich auf Identität, sodass alle Programme Laufen unter einer bestimmten Identität erhalten identische Rechte, ohne dass ein zusätzlicher administrativer Ausdruck möglich ist. Das Sperren auf MAC-Ebene kann so erfolgen, dass normale Benutzerbereichskomponenten nichts mit der Blockdatei tun können, außer Ihren Root-Dienstprogrammen und bestimmten Teilen der Plattform. Auf Fedora ist dies bereits der Fall, wenn Blockgeräte mit dem SELinux-Typ von fixed_disk_device_tund grub angezeigt werden, bootloader_exec_tsiehe folgendes Beispiel:

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

Während ddhat ein reguläres bin_t Label:

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

bin_t(anscheinend) kann immer noch auf blockierte Geräte schreiben, aber das Erstellen eines neuen Dateikontexttyps für fdiskund ddund das Schreiben einer Selinux-Regel, um den Zugriff des neuen Typs zu verbieten, fixed_disk_device_tsollte nicht allzu schwierig sein. Sie müssten es nur so gestalten, dass normale Benutzerrollen es nicht können, aber Benutzer mit dem sysadm_tkönnen es. Denken Sie dann daran, nur ein zu machen, newrole -r root:sysadm_rbevor Sie versuchen, die Festplatte neu zu partitionieren oder ein ddOver-the-Block-Gerät zu machen (was nicht sein sollte). Es ist keine große Sache, da es nicht so ist, als würdest du den fdiskganzen Tag jeden Tag laufen .

Wahrscheinlich mehr Arbeit als Sie gesucht haben, aber TE ist der Mechanismus, der das allgemeine Problem löst, auf das Sie stoßen. Persönlich ist die udevRegel wahrscheinlich, dass Sie die sicherste Wette sind. Ich erwähne das TE-Zeug nur für den Fall, dass Sie daran interessiert sind, eine größere Anzahl von Problemen zu lösen, die diesem ähnlich sind.

Bratchley
quelle
4

Wenn Sie sich nicht sicher sind /dev/sdx, verwenden Sie die alternativen Gerätenamen, die Sie unter finden /dev/disk/.

Zum Beispiel ist mein SD-Kartenleser /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Das ist zwar ein bisschen ausführlich, aber es gibt zumindest keine Möglichkeit, es mit einer Festplatte zu verwechseln.

Alternativ hdparm -i /dev/sdxkann a nützliche Informationen anzeigen, wenn es sich um eine Festplatte handelt, und unglückliche Unfälle vermeiden ...

Frostschutz
quelle
Ist es möglich, einen eindeutig benannten Link zu einem Gerät zu erstellen?
Sj755
1
Mit udev-Regeln, aber es funktioniert nur auf Boxen, die diese Regeln verwenden (und nicht beim Booten einer Live-CD oder ähnlichem), wohingegen /dev/disk/*es auf jedem Linux-System verfügbar ist.
Frostschutz
udev-Regeln werden dies erreichen, aber es ist einfacher, symbolische Links zu verwenden (solange sich der "von" -Link nicht selbst in / dev, / proc oder / run befindet) ODER einfach eine Variable zu erstellen (wie in bash / zsh): mysdcard=/dev/sddund dann verwenden Sie natürlich nur $mysdcardals Argument, wo immer Sie es brauchen.
tgm1024 - Monica wurde
3

Es gibt längere, aussagekräftige Namen in /dev/disk/by-*. /dev/disk/by-idEnthält für eine gesamte Festplatte einen Symlink zu dem Festplattengerät, das das Festplattenmodell und die Seriennummer enthält.

Geben Sie sich für zusätzlichen Schutz die Erlaubnis, auf das Gerät zuzugreifen (z. B. sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), und erledigen Sie den Rest unter Ihrem eigenen Benutzer anstelle von root.

Achten Sie darauf , nochmals zu überprüfen , dass die Platte Sie gehen zu dem erwarteten Inhalt zu handeln hat, zB Scheck fdisk -l /dev/whatever, file - </dev/sdz99... In der Shell Esc .das Argument des vorherigen Befehls zu erinnern, nie die Gerätenamen neu eingeben.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Ich sehe zwei Möglichkeiten, dies zu erreichen:

  1. Schreiben Sie einen Wrapper (Shell-Funktion) und überprüfen Sie die Argumente dort, bevor Sie sie an das reale Programm übergeben.
  2. Führen Sie diese Vorgänge von einer Shell aus, die durch SELinux, AppArmor oder dergleichen eingeschränkt wurde.
Hauke ​​Laging
quelle