保护设备免受dd和fdisk命令的攻击


8

我想知道是否有某种方法可以防止某些特定设备成为dd命令的输出文件和命令的目标fdisk。我目前正在使用这两种操作在SD卡上设置引导加载程序,内核和根文件系统,显示为/dev/sdd。我总是有点担心我会sdd与混合使用sdb,或者sda因为字母A和字母D在键盘上很靠近,所以我想找到一种方法来防止使用这种格式的命令:

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

要么

fdisk /dev/sd[ab]

1
一种可能的解决方案是设置权限,以便您仅具有对SD卡的直接写访问权,而不能在任何其他存储设备上。
Sampo Sarrala-codidact.org

Answers:


5

您可以尝试编写udev规则以为补充HDD提供足够独特的名称。

另一个想法:每当您可以将安全性要求表述为“不是谁在做,而是他们在做的”时,您在说的是类型强制,在大多数Linux发行版中,TE是在MAC级别完成的。我大部分的MAC经验是“ SELinux”

您不能将其锁定在DAC级别,否则您将无法在设备上执行I / O(不一定是DAC作为安全模型失败,这只是当前DAC策略仅基于身份,因此所有程序以特定身份运行的用户将获得相同的权利,并且无法获得其他管理表达式)。可以将其锁定在MAC级别,以便常规用户空间组件无法对块文件执行任何操作,但您的根实用程序和平台的某些部分可以执行此操作。在Fedora上,已经出现了SELinux类型fixed_disk_device_t和grub的块设备,bootloader_exec_t请参见以下示例:

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

dd具有常规的bin_t标签:

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

bin_t(显然)仍然可以写入块设备而是创建一个新的文件上下文类型fdiskdd并将其写入SELinux的规则来访问禁止新型fixed_disk_device_t应该不会太困难。您只需要进行设置,以使普通用户角色不能执行此操作,但是拥有该sysadm_t功能的用户可以执行此操作,然后记住newrole -r root:sysadm_r在尝试重新分区磁盘或dd在块设备上进行操作之前,请先执行“ a”操作(不应这样做)。没什么大不了的,因为它不像您fdisk每天都在跑步。

可能比您期望的工作还要多,但是TE是解决您遇到的一般问题的机制。就个人而言,udev规则可能是您最安全的选择。我只提到TE的东西,以防您有兴趣解决与此类似的更多问题。


4

如果不确定/dev/sdx,请使用可以在中找到的备用设备名称/dev/disk/

例如,我的SD卡读卡器是/dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0。当然,这有点冗长,但是至少没有办法将其与HDD混淆。

另外,hdparm -i /dev/sdx如果是硬盘,a 可能会显示有用的信息,并有助于避免不幸的事故...


是否可以创建到设备的唯一命名的链接?
sj755

1
使用udev规则时,它将仅在使用这些规则的机器上起作用(而在引导Live CD或类似机器时则无效),而/dev/disk/*在任何Linux系统上都可用。
弗罗斯特斯

udev规则可以实现这一点,但是使用符号链接会更容易(只要“ from”链接本身不在/ dev,/ proc或/ run中),或者只需创建一个变量即可(例如在bash / zsh中):mysdcard=/dev/sdd,那么您当然可以$mysdcard在需要的地方使用它作为参数。
tgm1024--Monica

3

中有更长,有意义的名称/dev/disk/by-*。对于整个磁盘,/dev/disk/by-id包含指向磁盘设备的符号链接,该符号链接包含磁盘型号和序列号。

为了获得更多保护,请给自己访问设备的权限(例如sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H),然后在您自己的用户(而不是root)下进行其余操作。

务必请仔细检查,你会作用于磁盘有预期的内容,例如支票fdisk -l /dev/whateverfile - </dev/sdz99...在shell下,Esc .调出以前的命令的说法,从来没有重新输入设备名称。


1

我看到两种方法可以做到这一点:

  1. 编写一个包装器(shell函数),并在将其传递到实际程序之前检查其中的参数。
  2. 从受SELinux,AppArmor等限制的shell中执行这些操作。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.