我最近安装了 ubuntu server 11.04,并启用了完整的 lvm 加密(从设置中安装)。我现在希望使用密钥文件进行自动解锁。我尝试遵循此指南http://ubuntuforums.org/showthread.php?t=837416
我使用以下命令生成了一个密钥:sudo dd if=/dev/urandom of=/boot/grub/keyfile bs=1024 count=4
我输入了它,/boot/grub
因为我认为它没有加密。当我尝试使用此命令添加密钥时,sudo cryptsetup luksAddKey /dev/sdX /boot/grub/keyfile
它要求我输入密码,当我输入密码时,什么也没有发生,屏幕上没有打印任何内容!我忽略了它,继续其他步骤并重新启动,但什么也没有发生,它要求输入密码。
谢谢您的帮助 。
答案1
我刚刚在我的新家用服务器上完成了这个操作,虽然花了很多时间在谷歌上搜索和猜测,但最终还是成功了。我将尝试在这里重现这些步骤。我使用的是 Ubuntu Server 11.10,并且从使用加密 LVM 的相当标准的安装开始,因此我只会讲述我在那里所做的更改。
设置:
- /dev/sda1 是我的未加密的 /boot 分区
- /dev/sda5 是我的 lvm 分区,其中包含其他所有内容——root、swap 和 home
- /dev/sdc1 是我的 USB 闪存驱动器上的分区,我将在其中存储密钥文件
首先,我在我的主目录中创建了一个密钥文件:
dd if=/dev/urandom of=keyfile bs=512 count=4
(您可以使用更大的块大小或计算更大的密钥)
告诉 cryptsetup 新密钥(重要的是内容,而不是文件名):
sudo cryptsetup luksAddKey /dev/sda5 keyfile
然后,我用 ext2 格式化了我的 USB 闪存盘,并给它贴上标签。我贴上标签是为了以后我可以通过标签安装它,并在 USB 闪存盘出现问题时更换它。
sudo mkfs -t ext2 /dev/sdc1
sudo e2label /dev/sdc1 KEYS
(当然,你的设备会有所不同)
现在,将密钥文件复制到根模式 400 所拥有的 USB 闪存驱动器:
mkdir KEYS
sudo mount /dev/sdc1 KEYS
sudo cp keyfile KEYS
sudo chown root KEYS/keyfile
sudo chmod 400 KEYS/keyfile
修改 /etc/crypttab。我的最初包含
sd5_crypt UUID=(...) none luks
我将其改为
sd5_crypt UUID=(...) /dev/disk/by-label/KEYS:/keyfile luks,keyscript=/lib/cryptsetup/scripts/passdev
最后,更新 initramfs:
sudo update-initramfs -uv
现在可以使用 USB 闪存驱动器上的密钥文件启动。如果我移除闪存驱动器(例如,当我去度假时),它不会启动,我的数据是安全的。
如果有人知道如何让它在 USB 闪存驱动器丢失时要求输入密码,那么这将非常方便。希望这能有所帮助,任何补充或更正都非常欢迎!
答案2
改进Randy Orrison 的回答,这是我创建的一个小脚本,如果找不到密钥文件,它将使系统恢复到要求用户输入密码。
#!/bin/sh
ask_for_password () {
cryptkey="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: "
if [ -x /bin/plymouth ] && plymouth --ping; then
cryptkeyscript="plymouth ask-for-password --prompt"
cryptkey=$(printf "$cryptkey")
else
cryptkeyscript="/lib/cryptsetup/askpass"
fi
$cryptkeyscript "$cryptkey"
}
device=$(echo $1 | cut -d: -f1)
filepath=$(echo $1 | cut -d: -f2)
# Ask for password if device doesn't exist
if [ ! -b $device ]; then
ask_for_password
exit
fi
mkdir /tmp/auto_unlocker
mount $device /tmp/auto_unlocker
# Again ask for password if device exist but file doesn't exist
if [ ! -e /tmp/auto_unlocker$filepath ]; then
ask_for_password
else
cat /tmp/auto_unlocker$filepath
fi
umount /tmp/auto_unlocker
保存它并将其替换keyscript=/lib/cryptsetup/scripts/passdev
为此/etc/crypttab
文件的路径,然后运行sudo update-initramfs -uv
,就完成了。
答案3
howtoforge.com 上的这些说明帮助我启动并运行了自动解密卷。
如何:使用密钥文件自动解锁 LUKS 加密驱动器
步骤 1:创建随机密钥文件
sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
步骤 2:将密钥文件设为 root 只读
sudo chmod 0400 /root/keyfile
这将使密钥文件只有 root 才能读取。如果有人可以访问此密钥文件,那么您的计算机就会出现更大的问题。
或者将所需的密钥文件 chown 为 root:root 并将其移动到 /root 文件夹
步骤 3:将密钥文件添加到 LUKS
启用 LUKS/dm_crypt 的设备最多可以保存 10 个不同的密钥文件/密码。因此,除了设置密码外,我们还将添加此密钥文件作为附加授权方法。
sudo cryptsetup luksAddKey /dev/sdX /root/keyfile
sdX 当然是您的 LUKS 设备。
首先,系统会提示您输入(现有)密码来解锁驱动器。如果一切正常,您应该会得到如下输出:
Enter any LUKS passphrase:
key slot 0 unlocked.
Command successful.
步骤 4:创建映射器
LUKS 设备需要创建一个映射器,然后可以在 fstab 中引用它。打开 /etc/crypttab
sudo nano /etc/crypttab
然后添加如下一行:
sdX_crypt /dev/sdX /root/keyfile luks
或者您可以使用设备的 UUID:
sdX_crypt /dev/disk/by-uuid/247ad289-dbe5-4419-9965-e3cd30f0b080 /root/keyfile luks
sdX_crypt 是正在创建的映射器的名称。您可以在此处使用任何名称,例如“音乐”或“电影”或“sfdsfawe”...
通过按下 ctrl-x、enter、enter 保存并关闭文件。Ctrl-x 关闭 nano,但它首先会询问是否保存文件 [yes = enter] 以及文件名称 [same name = enter]。
我们实际上所做的是告诉应该使用 /root/keyfile 而不是密码输入来解锁驱动器。
步骤 5:在 fstab 中挂载设备
现在,我们有一个解锁的设备(嗯,还没有,但是当系统启动时),我们现在只需要挂载它。打开 /etc/fstab:
sudo nano /etc/fstab
并添加一个新条目,例如:
/dev/mapper/sdX_crypt /media/sdX ext3 defaults 0 2
确保您在步骤 4 中添加的映射器名称正确。还要确保挂载点/文件夹存在。添加后,再次保存文件并关闭它(ctrl-x,enter,enter)。
步骤 6:重新启动或重新挂载
就是这样。现在您可以重新启动,附加设备应该会自动解锁并安装。您也可以通过重新安装所有设备来测试它:
sudo mount -a
答案4
@deitch 我和 @Randy Orrison 有相同的设置,并遇到了和你一样的问题,结果发现是 systemd 的一个错误,当它在 /etc/crypttab 中找到相应的条目时,它会尝试再次挂载 / 文件系统。
为了解决这个问题,我在运行 update-initramfs -uv 命令后从 /etc/crypttab 中删除了 sda5_crypt 的条目。
重新启动,一切都按预期正常工作。