如何配置 LVM & LUKS 来自动解密分区?

iso*_*man 23 encryption lvm luks

我最近安装了带有完整 lvm 加密的 ubuntu 服务器 11.04(从安装程序安装)。我现在希望使用密钥文件进行自动解锁。我试图按照本指南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 它要求我输入密码,当我输入它时什么也没有发生,屏幕上没有打印任何内容!我忽略它并继续其他步骤并重新启动,但什么也没发生,它要求输入密码。

谢谢您的帮助 。

Ran*_*son 29

我刚刚在我的新家庭服务器上经历了这个,它需要大量的谷歌搜索和猜测,但我已经让它工作了。我将尝试在此处重现这些步骤。我使用的是 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
Run Code Online (Sandbox Code Playgroud)

(您可以使用更大的块大小或为更大的键计数)

告诉 cryptsetup 新密钥(重要的是内容,而不是文件名):

sudo cryptsetup luksAddKey /dev/sda5 keyfile
Run Code Online (Sandbox Code Playgroud)

然后,我用 ext2 格式化了我的 USB 闪存驱动器并给它一个标签。我使用了一个标签,以便稍后我可以通过标签安装它,并在出现问题时更换USB闪存驱动器。

sudo mkfs -t ext2 /dev/sdc1
sudo e2label /dev/sdc1 KEYS
Run Code Online (Sandbox Code Playgroud)

(当然,您的设备会有所不同)

现在,将密钥文件复制到 U 盘,由 root 模式 400 拥有:

mkdir KEYS
sudo mount /dev/sdc1 KEYS
sudo cp keyfile KEYS
sudo chown root KEYS/keyfile
sudo chmod 400 KEYS/keyfile
Run Code Online (Sandbox Code Playgroud)

修改 /etc/crypttab.conf 我的最初包含

sd5_crypt UUID=(...) none luks
Run Code Online (Sandbox Code Playgroud)

我改成

sd5_crypt UUID=(...) /dev/disk/by-label/KEYS:/keyfile luks,keyscript=/lib/cryptsetup/scripts/passdev
Run Code Online (Sandbox Code Playgroud)

最后,更新 initramfs:

sudo update-initramfs -uv
Run Code Online (Sandbox Code Playgroud)

它现在使用 USB 闪存驱动器上的密钥文件启动。如果我移除闪存驱动器(例如,当我去度假时)它不会启动并且我的数据是安全的。

如果有人知道如何让它在 USB 闪存驱动器丢失的情况下询问密码短语,那么作为后备方案会很方便。希望这会有所帮助,欢迎任何补充或更正!

  • 如果您不确定如何获得密码提示,您可以使用闪存驱动器中的可引导分区通过查找密钥文件的备用 initramfs 加载,并让硬盘上的默认引导加载一个常规的 initramfs 提示输入密码。 (3认同)
  • @RandyOrrison 这真的很棒。有用。但是...在它通过 initram 后,它会停留一两分钟,并显示“A start job is running for dev-sda8:-keyfile.device (1min 18s...)”等。它通过了,一切都已安装,但它会挂起一段时间。日志显示“等待设备 dev-sda8:-sda7keyfile.device 超时;sda7crypt 的加密设置依赖项失败。” 当然,它已经被 initram 挂载了,但是......我做错了什么? (2认同)

Var*_*Agw 8

改进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
Run Code Online (Sandbox Code Playgroud)

保存并取代keyscript=/lib/cryptsetup/scripts/passdev/etc/crypttab与此文件路径和运行sudo update-initramfs -uv,就大功告成了。


小智 6

这些来自 howtoforge.com 的说明让我开始使用自动解密卷。

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

第 1 步:创建随机密钥文件

sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
Run Code Online (Sandbox Code Playgroud)

第 2 步:使密钥文件对 root 只读

sudo chmod 0400 /root/keyfile
Run Code Online (Sandbox Code Playgroud)

这将使密钥文件只能由 root 读取。如果有人可以访问此密钥文件,那么无论如何您的计算机都会遇到更大的问题。

或者将你想要的密钥文件 chown 到 root:root 并将其移动到 /root 文件夹中

第 3 步:将密钥文件添加到 LUKS

启用 LUKS/dm_crypt 的设备最多可以保存 10 个不同的密钥文件/密码。因此,在拥有已经设置的密码之后,我们将添加这个密钥文件作为额外的授权方法。

sudo cryptsetup luksAddKey /dev/sdX /root/keyfile
Run Code Online (Sandbox Code Playgroud)

sdX 当然是你的 LUKS 设备。

首先,系统会提示您输入(现有)密码以解锁驱动器。如果一切正常,您应该得到如下输出:

Enter any LUKS passphrase:
key slot 0 unlocked.
Command successful.
Run Code Online (Sandbox Code Playgroud)

第 4 步:创建映射器

LUKS 设备需要创建一个映射器,然后可以在 fstab 中引用它。打开 /etc/crypttab

sudo nano /etc/crypttab
Run Code Online (Sandbox Code Playgroud)

然后添加这样一行:

sdX_crypt      /dev/sdX  /root/keyfile  luks
Run Code Online (Sandbox Code Playgroud)

或者您可以使用设备的 UUID:

sdX_crypt      /dev/disk/by-uuid/247ad289-dbe5-4419-9965-e3cd30f0b080  /root/keyfile  luks
Run Code Online (Sandbox Code Playgroud)

sdX_crypt 是正在创建的映射器的名称。您可以在此处使用任何名称,例如“音乐”或“电影”或“sfdsfawe”....

通过发出 ctrl-x、回车、回车来保存并关闭文件。Ctrl-x 关闭 nano 但首先它要求保存文件 [yes = enter] 以及名称 [same name = enter]。

我们在那里所做的实际上是告诉应该使用 /root/keyfile 而不是密码输入来解锁驱动器。

第 5 步:在 fstab 中挂载设备

现在,我们有一个解锁的设备(嗯,还没有,但是在系统启动时),我们现在只需要挂载它。打开/etc/fstab:

sudo nano /etc/fstab
Run Code Online (Sandbox Code Playgroud)

并添加一个新条目,如:

/dev/mapper/sdX_crypt  /media/sdX     ext3    defaults        0       2
Run Code Online (Sandbox Code Playgroud)

确保您拥有在步骤 4 中添加的正确映射器名称。还要确保安装点/文件夹存在。添加后,再次保存文件并关闭它(ctrl-x,回车,回车)。

第 6 步:重新启动或重新挂载

就是这样。现在您可以重新启动,其他设备应该会自动解锁并安装。您还可以通过重新安装所有设备来测试它:

sudo mount -a
Run Code Online (Sandbox Code Playgroud)

  • 你忘记更新 `initramfs`,100% 需要 (2认同)