如何:使用密钥文件自动解锁 LUKS 加密驱动器

如何:使用密钥文件自动解锁 LUKS 加密驱动器

我最近安装了 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 的条目。

重新启动,一切都按预期正常工作。

相关内容