- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想设置一个无外设的 Linux (Debian Wheezy) PC,它具有整个磁盘加密功能,能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘。我的起点是使用 Debian 安装程序中的基本全盘加密选项进行全新安装,它管理除/boot 之外的所有内容作为 LUKS 加密的逻辑卷组,并为我提供键盘选项。我将在一个答案中描述我当前的解决方案,希望它有用并且其他人可以改进它。
以下是我遇到的一些问题:
设置密码并将其放入 USB 驱动器。
及时加载USB模块。
等待 Linux 识别 USB 驱动器,然后再尝试读取它。
识别正确的 USB 驱动器(而不是碰巧插入的其他驱动器)。
编写“keyscript”以从 USB 驱动器中提取密码。
确保在所有 USB 故障情况下回退到键盘。
我会接受有显着改进的答案,并对提供贡献的答案投赞成票。
最佳答案
我的很多解决方案都来自帖子,Using A USB Key For The LUKS Passphrase .
创建一个随 secret 码:
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
您应该会看到一个符号链接(symbolic link)。我会称之为/dev/disk/by-id/<ID>
.
编辑 /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
keyscript
上面提到的将需要从 USB 设备读取密码。然而,它需要做的不止于此。要了解它的使用方式,请查看 /usr/share/initramfs-tools/scripts/local-top/cryptroot
,在启动时运行以解锁根设备的脚本。注意 keyscript
已设置,只需运行并将输出通过管道传输到 luksOpen
没有其他检查。无法发出错误信号(USB 驱动器不存在)或退回到键盘输入。如果密码短语失败,keyscript 将在循环中再次运行,最多运行一定次数;然而,我们没有被告知我们正在进行哪个迭代。此外,我们无法控制 keyscript 何时运行,因此我们无法确定 Linux 是否已识别 USB 驱动器。
我用一些技巧解决了这个问题:
轮询 USB 驱动器并等待 3 秒以使其出现。这对我有用,但我很想知道更好的方法。
创建一个虚拟文件 /passphrase-from-usb-tried
在第一次运行时表示我们至少运行过一次。
如果我们至少运行过一次,或者找不到 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
我的 initramfs 中没有 USB 驱动程序。 (看起来它们在更高版本的 Debian 中是默认的。)我不得不通过添加到 /etc/initramfs-tools/modules
来添加它们。 :
uhci_hcd
ehci_hcd
usb_storage
当一切都完成后,更新 initramfs:
update-initramfs -u
关于linux - 如何从 USB 加载 LUKS 密码,退回到键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713918/
以下代码使用堆: char* getResult(int length) { char* result = new char[length]; // Fill result...
目前我们正在使用 Mandrill 发送电子邮件,每当 Mandrill 检测到退回邮件时,我们都会获得原始 header 以及退回邮件或发送电子邮件的子帐户。 在 Amazon SES 中,我们通过
我遇到了 nopCommerce 中特定客户要求带来的问题。 我有一个页面 - 比方说 page1 - 它显示了一个 block 图像,然后你必须点击它才能到达页面的主要部分(无论我多么努力劝阻他们不
大多数移动浏览器都有默认行为,允许用户在到达页面顶部或底部时继续滚动,并在页面顶部或底部留出空白。然后整个页面将弹回以填充空白区域。在原生的 iOS 应用中,我们可以很方便地为这些顶部和底部区域设置图
我有一个触发 lambda 方法的 api 网关。我试图到达终点,但返回了 500,InternalServerErrorException。但是,lambda 从未被调用。 登录aws控制台时,我在
我是一名优秀的程序员,十分优秀!