我编写了一个新的 udev 规则,以便在插入 USB 闪存驱动器时创建指向 USB 闪存驱动器上 luks 加密分区的符号链接。我编写的新 udev 规则确实创建了指向 USB 驱动器的 luks 加密分区的符号链接。但是,当运行“cryptsetup luksOpen”指定符号链接来获取 /dev/mapper/ 对象(然后我可以挂载 ext4 文件系统)时,一旦 cryptsetup 命令结束,符号链接就会消失。这不是预期的情况,我希望符号链接保留到 USB 驱动器弹出为止。
udev规则:
SUBSYSTEM!="block", GOTO="usb_luks_rules_end"
ENV{DEVTYPE}!="partition", GOTO="usb_luks_rules_end"
ACTION=="add", ENV{ID_FS_TYPE}=="crypto_LUKS", SYMLINK+="myusbluks"
LABEL="usb_luks_rules_end"
我从拔下驱动器开始,因此没有符号链接:
# ls /dev/my*
ls: cannot access /dev/my*: No such file or directory
我插入带有 luksFormat 分区的 USB 闪存驱动器。加密分区内部是一个 ext4 文件系统。 USB 驱动器变为 /dev/sdc。我希望我的符号链接指向该分区,以便我可以“cryptsetup luksOpen”符号链接名称,而不是指定不可预测的 /dev/sdc1 名称。
# ls -l /dev/my*
lrwxrwxrwx. 1 root root 4 Mar 24 15:51 /dev/myusbluks -> sdc1
udev 规则起作用并创建了符号链接,就像我预期的那样。现在我在符号链接上运行 cryptsetup luksOpen,在重新获得控制权后,符号链接消失了!
# cryptsetup luksOpen /dev/myusbluks cr_diskbackup
Enter passphrase for /dev/myusbluks: (I enter passphrase successfully.)
# ls -l /dev/my*
ls: cannot access /dev/my*: No such file or directory
# ls -l /dev/mapper/cr_diskbackup
lrwxrwxrwx. 1 root root 8 Mar 24 15:53 /dev/mapper/cr_diskbackup -> ../dm-92
# blkid /dev/mapper/cr_diskbackup
/dev/mapper/cr_diskbackup: LABEL="backupdisk1" UUID="54e2dfcb-20d9-4699-8f7c-0834fda1b4a6" TYPE="ext4"
# ls -l /dev/sdc1
brw-rw----. 1 root disk 8, 33 Mar 24 15:53 /dev/sdc1
# blkid /dev/sdc1
/dev/sdc1: UUID="dd5c374e-963f-4604-8ca3-d271a26abc90" TYPE="crypto_LUKS"
我当然已经实现了使用符号链接来 cryptsetup luksOpen 驱动器而不是必须使用“/dev/sdc1”的目标之一。但是,我希望符号链接一直存在,直到 USB 驱动器被物理拔出为止。
在另一次设置后,我在同一命令上运行了 strace 。我可以看到符号链接名称被打开并进行统计,但我没有看到任何删除 cryptsetup strace 中符号链接的内容。
以下内容来自发出 cryptsetup luksOpen 时的“udevadm Monitor”:
KERNEL[2064243.853683] change /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.2/1-10.2:1.0/host29/target29:0:0/29:0:0:0/block/sdc/sdc1 (block)
KERNEL[2064243.854830] add /devices/virtual/bdi/253:92 (bdi)
KERNEL[2064243.855452] add /devices/virtual/block/dm-92 (block)
UDEV [2064243.856682] add /devices/virtual/bdi/253:92 (bdi)
KERNEL[2064243.856781] change /devices/virtual/block/dm-92 (block)
UDEV [2064243.858320] add /devices/virtual/block/dm-92 (block)
UDEV [2064243.897808] change /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.2/1-10.2:1.0/host29/target29:0:0/29:0:0:0/block/sdc/sdc1 (block)
UDEV [2064244.124652] change /devices/virtual/block/dm-92 (block)
正在发生“变化”事件的事实可能与此有关。我不确定是 cryptsetup 还是设备映射器造成的。但由于 /dev/sdc1 在 cryptsetup luksOpen 完成后仍保留为设备,因此我不明白为什么不单独保留符号链接,以便它可以继续指向同一设备。在我执行此操作的系统上,可能会插入其他没有 luks 分区的 USB 驱动器。因此,需要一个指向 luks 分区(如果存在)的符号链接。
我在这里缺少什么?如果基本加密分区的符号链接已打开并且有某些措施确保此类符号链接不存在,是否会被视为某种安全问题?
答案1
我已经使用更复杂的帮助脚本解决了这个问题,令我满意。帮助脚本
由于我不明白的原因,我确认进入后发生的第二个 udev“更改”事件
cryptsetup luksOpen /dev/asymlinkname cr_diskbackup
命令导致符号链接消失。
我将规则逻辑切换为“添加|更改”,并且还添加了一个帮助程序脚本。帮助程序脚本是对此处找到的脚本的修改:用于为相同 USB 串行设备分配已知符号链接的 udev 规则。修改是添加逻辑来查找 /dev 目录中指向 luks 分区(通常是 /dev/sdc1,但不保证)的任何现有符号链接。如果找到,则将符号链接的后缀号打印到标准输出。 Udev 读取该数字并将其用作后缀以(重新)创建具有该名称的符号链接。 Cryptsetup luksOpen 继续像以前一样工作,神秘地删除块设备的符号链接,即使块设备仍然存在。但使用帮助程序脚本,现在符号链接出现在 luksOpen 之后,因为它是由 udev 规则操作为“更改”事件再次创建的。
更新后的 udev 规则:
SUBSYSTEM!="block", GOTO="my_usb_luks_rules_end"
ENV{DEVTYPE}!="partition", GOTO="my_usb_luks_rules_end"
ACTION=="add|change", ENV{ID_FS_TYPE}=="crypto_LUKS", PROGRAM="/usr/local/sbin/my-unique-usb-luks-num /dev myusbluks $env{DEVNAME}", SYMLINK+="myusbluks%c"
LABEL="my_usb_luks_rules_end"
/usr/local/sbin/my-unique-usb-luks-num 脚本:
#!/bin/bash
if [ $# -ne 3 ]; then
printf "Usage: $0 location prefix devicename\n" >&2
exit 1
fi
location="$1"
prefix="$2"
devname="$3"
# Find any symlinks in the location that may already
# exist to our device. Save only the first one.
old_symlink=$( find $location -maxdepth 1 \
-lname "$(basename ${devname})" \
-name "$prefix*" |
sort -n | head -n 1 )
# If we found any symlinks with our prefix to the specified device, then print
# its numeric suffix to stdout for it to be "$result" (%c) in the caller udev
# rule.
if [ "${old_symlink}" != "" ]; then
devbase=$(basename ${old_symlink})
printf "${devbase##$prefix}\n"
exit
fi
# No symlink was already in existence, so find a unique new suffix number.
for ((index=0; index<256; index++)); do
if [ ! -e "$location/$prefix$index" ]; then
# Merely print this to our stdout for it to be $result (%c) in caller udev
# rule. Then exit.
printf "$index\n"
exit
fi
done
# If we did not exit above, we printed (returned) nothing.
exit 1
插入带有 luks 分区的 USB 驱动器会导致:
/dev/myusbluks0
待创建。如果同时插入带有 luks 分区的第二个 USB 驱动器,该 luks 分区将获得一个符号链接
/dev/myusbluks1
如果我
cryptsetup luksOpen /dev/myusbluks0 cr_diskbackup
符号链接仍然存在并指向 cryptsetup luksOpen 之前的设备。而且,唯一的编号足以使其更加防弹。