gpt4 book ai didi

linux - 如何从 USB 加载 LUKS 密码,退回到键盘?

转载 作者:IT王子 更新时间:2023-10-28 23:52:35 28 4
gpt4 key购买 nike

我想设置一个无外设的 Linux (Debian Wheezy) PC,它具有整个磁盘加密功能,能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘。我的起点是使用 Debian 安装程序中的基本全盘加密选项进行全新安装,它管理除/boot 之外的所有内容作为 LUKS 加密的逻辑卷组,并为我提供键盘选项。我将在一个答案中描述我当前的解决方案,希望它有用并且其他人可以改进它。

以下是我遇到的一些问题:

  • 设置密码并将其放入 USB 驱动器。

  • 及时加载USB模块。

  • 等待 Linux 识别 USB 驱动器,然后再尝试读取它。

  • 识别正确的 USB 驱动器(而不是碰巧插入的其他驱动器)。

  • 编写“keyscript”以从 USB 驱动器中提取密码。

  • 确保在所有 USB 故障情况下回退到键盘。

我会接受有显着改进的答案,并对提供贡献的答案投赞成票。

最佳答案

我的很多解决方案都来自帖子,Using A USB Key For The LUKS Passphrase .

  1. 创建一个随 secret 码:

    dd if=/dev/urandom bs=1 count=256 > passphrase
  2. 插入 USB 驱动器。 dmesg输出将显示设备名称;假设/dev/sdd .计算出它的大小:

    blockdev --getsize64 /dev/sdd
  3. 我决定在原始设备的末尾安装密码,因为它可能会在任何意外使用 USB 驱动器时幸免于难。

    dd if=passphrase of=/dev/sdd bs=1 seek=<size-256>
  4. 将密码添加到 LUKS 卷:

    cryptsetup luksAddKey /dev/sda5 passphrase

    这不会影响安装程序现有的手动输入密码。可以删除密码文件:

    rm passphrase
  5. 为 U 盘找到一个唯一的名称,以便我们可以在出现时识别它:

    ls -l /dev/disk/by-id | grep -w sdd

    您应该会看到一个符号链接(symbolic link)。我会称之为/dev/disk/by-id/<ID> .

  6. 编辑 /etc/crypttab .你应该看到这样一行:

    sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 none luks

    修改为:

    sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 /dev/disk/by-id/<ID> luks,keyscript=/bin/passphrase-from-usb
  7. keyscript上面提到的将需要从 USB 设备读取密码。然而,它需要做的不止于此。要了解它的使用方式,请查看 /usr/share/initramfs-tools/scripts/local-top/cryptroot ,在启动时运行以解锁根设备的脚本。注意 keyscript已设置,只需运行并将输出通过管道传输到 luksOpen没有其他检查。无法发出错误信号(USB 驱动器不存在)或退回到键盘输入。如果密码短语失败,keyscript 将在循环中再次运行,最多运行一定次数;然而,我们没有被告知我们正在进行哪个迭代。此外,我们无法控制 keyscript 何时运行,因此我们无法确定 Linux 是否已识别 USB 驱动器。

    我用一些技巧解决了这个问题:

    1. 轮询 USB 驱动器并等待 3 秒以使其出现。这对我有用,但我很想知道更好的方法。

    2. 创建一个虚拟文件 /passphrase-from-usb-tried在第一次运行时表示我们至少运行过一次。

    3. 如果我们至少运行过一次,或者找不到 USB 驱动器,请运行 askpass cryptroot 使用的程序用于键盘输入。

    最终脚本:

    #!/bin/sh

    set -e

    if ! [ -e /passphrase-from-usb-tried ]; then
    touch /passphrase-from-usb-tried
    if ! [ -e "$CRYPTTAB_KEY" ]; then
    echo "Waiting for USB stick to be recognized..." >&2
    sleep 3
    fi
    if [ -e "$CRYPTTAB_KEY" ]; then
    echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2
    dd if="$CRYPTTAB_KEY" bs=1 skip=129498880 count=256 2>/dev/null
    exit
    else
    echo "Can't find $CRYPTTAB_KEY; USB stick not present?" >&2
    fi
    fi

    /lib/cryptsetup/askpass "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: "

    最后,我们需要确保这个脚本在 initramfs 中可用。创建/etc/initramfs-tools/hooks/passphrase-from-usb包含:

    #!/bin/sh

    PREREQ=""

    prereqs() {
    echo "$PREREQ"
    }

    case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    . "${CONFDIR}/initramfs.conf"
    . /usr/share/initramfs-tools/hook-functions

    copy_exec /bin/passphrase-from-usb /bin
  8. 我的 initramfs 中没有 USB 驱动程序。 (看起来它们在更高版本的 Debian 中是默认的。)我不得不通过添加到 /etc/initramfs-tools/modules 来添加它们。 :

    uhci_hcd
    ehci_hcd
    usb_storage
  9. 当一切都完成后,更新 initramfs:

    update-initramfs -u

关于linux - 如何从 USB 加载 LUKS 密码,退回到键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713918/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com