微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

>设置密码并将其放在USB驱动器上.
>及时加载USB模块.
>等待USB驱动器被Linux识别,然后再尝试读取它.
>识别正确的USB驱动器(不是其他正在插入的驱动器).
一个“keyscript”来从USB驱动器上拉一个密码.
>确保在所有USB故障情况下退回键盘.

我将接受一个重大改进的答案,并提供提供贡献的upVote答案.

解决方法

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

>创建随机密码:

dd if=/dev/urandom bs=1 count=256 > passphrase

>插入USB驱动器. dmesg输出显示设备名称;假设/ dev / sdd.找出它的大小:

blockdev --getsize64 /dev/sdd

>我决定在原始设备的末端安装密码,认为可能会偶然使用USB驱动器.

dd if=passphrase of=/dev/sdd bs=1 seek=<size-256>

>将密码添加到LUKS卷:

cryptsetup luksAddKey /dev/sda5 passphrase

这并不影响安装人员现有的手工输入密码.密码文件可以删除

rm passphrase

>找到一个独特的名称为U盘,所以我们可以确定它当时:

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

你应该看到一个符号链接.我将其称为/ dev / disk / by-id /< ID&gt ;.
>编辑/ 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

>上面提及的键盘需要从USB设备读取密码.但是,它需要做的更多.要了解如何使用它,请检查/usr/share / initramfs-tools / scripts / local-top / cryptroot,这是在引导时运行以解锁根设备的脚本.注意当一个keyscript设置,它只是运行,输出管道到luksOpen没有其他检查.没有办法发出错误(USB驱动器不存在)或回退到键盘输入.如果密码失败,则键盘会循环运行,直到一段时间;然而,我们没有被告知我们正在进行哪些迭代.此外,我们无法控制keyscript的运行时间,所以我们无法确定Linux已经识别了USB驱动器.

我用一些黑客解决了这个问题:

>在USB驱动器上进行轮询,等待3秒钟才能显示.这对我来说很有用,但我很想知道一个更好的方法.
>创建一个虚拟文件/ passphrase-from-usb -i尝试在第一次运行,以表明我们已经运行了至少一次.
>如果至少运行了一次,或者找不到USB驱动器,请运行cryptroot使用的askpass程序进行键盘输入.

最后的脚本:

#!/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

>我的initramfs中没有USB驱动程序. (在Debian的更新版本中,它们认是认的).我不得不通过添加到/ etc / initramfs-tools / modules来添加它们:

uhci_hcd
ehci_hcd
usb_storage

>完成所有操作后,更新initramfs:

update-initramfs -u

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐