我想知道是否有某种方法可以防止某些特定设备成为命令的输出文件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
您可以尝试编写 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
(显然)仍然可以写入块设备,但为fdisk
和创建一个新的文件上下文类型dd
并编写一个 selinux 规则以禁止新类型访问fixed_disk_device_t
应该不会太困难。您只需要做到这一点,以便常规用户角色无法执行此操作,但具有该权限的用户sysadm_t
可以执行此操作,然后记住newrole -r root:sysadm_r
在尝试重新分区磁盘或dd
在块设备上执行 a 之前执行 a (这应该是)这没什么大不了的,因为这不像你fdisk
每天都整天跑步)。
可能比您想要的工作更多,但 TE 是解决您遇到的一般问题的机制。就个人而言,该udev
规则可能是最安全的选择。我仅在您有兴趣解决与此类似的大量问题时才提及 TE 内容。
答案2
如果您不确定/dev/sdx
,请使用您可以在 中找到的替代设备名称/dev/disk/
。
例如我的SD卡读卡器是/dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0
.当然,这有点冗长,但至少没有办法将它与 HDD 混淆。
或者,hdparm -i /dev/sdx
如果它是硬盘,则可能会显示有用的信息,并有助于避免不幸的事故......
答案3
中还有更长、更有意义的名称/dev/disk/by-*
。对于整个磁盘,/dev/disk/by-id
包含指向磁盘设备的符号链接,其中包含磁盘型号和序列号。
为了获得额外的保护,请授予您自己访问设备的权限(例如sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H
),然后在您自己的用户(而不是 root)下执行其余操作。
确保仔细检查您要操作的磁盘是否具有预期的内容,例如检查fdisk -l /dev/whatever
,,file - </dev/sdz99
...在 shell 中,Esc .要调用上一个命令的参数,切勿重新输入设备名称。
答案4
我看到有两种方法可以实现这一目标:
- 编写一个包装器(shell 函数)并在将参数传递给实际程序之前检查其中的参数。
- 从受 SELinux、AppArmor 等限制的 shell 执行这些操作。