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


21

我最近用完整的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 它会要求我输入密码,而当我输入密码时,什么也没有发生,则屏幕上没有任何内容!我无视它,继续其他步骤并重新启动,但是什么也没有发生,它要求输入密码。

谢谢您的帮助 。


您是说不输入密码就解密吗?如果引导过程能够做到这一点,则解密卷所需的密钥将需要位于引导期间可访问的系统上。您希望如何保护自己免受数据盗窃的侵害?
詹姆斯·亨斯特里奇

是的,我想我会将密钥放在隐藏的分区或USB闪存驱动器中。那可能吗 ?
isoman 2011年

问题是,如果引导加载程序可以找到密钥,那么检查(未加密的)引导代码的人也将能够找到它。如果将密钥存储在USB记忆棒上,则要确保该记忆棒不会被计算机窃取。如果您仅在引导过程中插入存储棒,那么它比输入密码短语更方便。
詹姆斯·亨斯特里奇

Answers:


27

我刚刚在新的家用服务器上进行了此操作,花了很多时间进行谷歌搜索和猜测,但是我已经使它工作了。我将尝试在此处重现这些步骤。我使用的是Ubuntu Server 11.10,首先使用加密的LVM进行了非常标准的安装,所以我只介绍在此所做的更改。

设定:

  • / dev / sda1是我未加密的/ boot分区
  • / dev / sda5是我的lvm分区,其中包含其他所有内容-根目录,交换目录和主目录
  • / 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

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

现在,将密钥文件复制到root模式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闪存驱动器丢失,则要求输入密码,那将很方便。希望这会有所帮助,我们欢迎您进行任何补充或更正!


3
如果不确定如何提示输入密码,可以使用闪存驱动器中的可引导分区通过备用initramfs加载,该initramfs查找密钥文件,并让硬盘上的默认引导加载常规的initramfs,以提示输入密码。
恢复莫妮卡-ζ-2012年

1
@ 3pic自从几个月前这样做以来,我还不确定100%。但是Ubuntu启动到虚拟文件系统。向其keyscript=/lib/cryptsetup/scripts/passdev添加passdev脚本。然后update-initramfs -uv重建文件系统档案。
VarunAgw

1
@RandyOrrison,这真的很棒。有用。但是...经过initram之后,再与A start job is running for dev-sda8:-keyfile.device (1min 18s...)etc 一起坐一两分钟。它通过了,所有东西都装好了,但是挂了一段时间。日志说:“等待设备dev-sda8:-sda7keyfile.device超时;对sda7crypt的加密设置依赖性失败。” 当然,它已经由initram挂载了,但是....我在做什么错?
deitch

1
由于某种原因,它似乎不喜欢/与systemd一起使用;它只会完全忽略该keyscript字段。
Etienne Bruines,2016年

1
在Ubuntu 17.10+中,如果您的根文件系统位于luks卷上并且具有密钥文件,则update-initramfs工具将不会生成能够引导luks卷的initramfs映像。通过将“ none”保留为密钥文件值,并将选项设置为具有keyscript = / etc / my-keyscript(其中/ etc / my-keyscript是输出密钥的shell脚本),可以使其工作。
Macil's

6

howtoforge.com上的这些说明使我可以自动解密卷并开始运行。

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

步骤1:建立随机金钥档案

sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4

步骤2:将密钥文件设置为对根用户只读

sudo chmod 0400 /root/keyfile

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

或者,将所需的密钥文件整理到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。Ctrl-x关闭nano,但首先要求保存文件[是=输入],以及名称应为[相同名称=输入]。

实际上,我们所做的是告诉/ root / keyfile代替密码输入来解锁驱动器。

步骤5:在fstab中挂载设备

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

sudo nano /etc/fstab

并添加一个新条目,例如:

/dev/mapper/sdX_crypt  /media/sdX     ext3    defaults        0       2

确保您具有在步骤4中添加的正确的映射器名称。另外,请确保安装点/文件夹存在。添加后,再次保存文件并关闭它(ctrl-x,输入,输入)。

步骤6:重新启动或重新安装

而已。现在,您可以重新启动,其他设备应自动解锁并安装。您还可以通过重新安装所有设备来对其进行测试:

sudo mount -a

1
您忘记更新了initramfs,需要100%
3pic

6

改善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,就大功告成了。


我想您的解决方案不适用于多个密钥文件的USB驱动器。我的意思是,如果我有多个加密分区(home,swap,root)。它表明在cat命令后它不会卸载USB驱动程序。您有解决的办法吗?
Khamidulla16年

这为我工作(Xubuntu 17.10),但是我必须编辑grub并删除“ splash”。另外,我还必须将文件保存在适当的位置(/ lib / cryptsetup / scripts / unlock_custom)并对其进行chmod 755处理。不确定在特定位置进行飞溅或复制是否对我有用,但是以前没有起作用。无论如何,它都能正常工作,但在启动后出现以下提示 Startet AppArmor initialization.:正在为dev-disk keyfile.device运行启动作业(1m 30s)。在90年代X启动之后,我可以使用我的系统了...不知道如何解决此启动工作...
firepol

1

@deitch我具有与@Randy Orrison相同的设置,并遇到了与您相同的问题,结果是systemd的一个错误,该错误试图在/ etc / crypttab中找到相应的条目时再次挂载/文件系统。

要解决此问题,我只需在运行update-initramfs -uv命令后从/ etc / crypttab中删除sda5_crypt的条目。

重新启动,一切工作正常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.