分享一下Debian下使用cryptsetup加密系统分区和使用keyfile来进行自动解密的方法

加密分区

在Debian系的系统中使用cryptsetup,首先要确保你的系统中已经正确安装了cryptsetup这个包

假设我们要加密/DEV/SDA5这个分区,因为这个分区中存放着一些重要的数据,我们不想让其他人可以随意访问他。

首先执行以下命令,这会为你创建一个加密的数据分区:

然后系统会提示你输入一个大写的YES来确认你的操作,然后会让你输入密码。完成之后,这个分区就已经被加密了。

使用加密后的分区

要想使用加密过的分区,首先需要使用之前设置的密码对其解密才行。

该命令会提示你输入密码解密该分区,成功之后,系统的/DEV/MAPPER目录下出现一个CRYPT_DATA块设备文件,
该文件的文件名就是上一步LUSKOPEN时的最后一个参数。

然后就可以对这个快设备文件进行操作,比如建立文件系统、挂载、读写等,就像普通的快设备文件一样。

sudo mkfs.ext4 /dev/mapper/crypt_data sudo mount /dev/mapper/crypt_data /mnt

注意,这个时候/DEV/SDA5这个文件已经不能进行正常的建立文件系统,挂载等操作,而仅仅用来加解密,
相应的文件系统操作都应该对/DEV/MAPPER目录下生成的文件来进行。

当进行完数据操作之后,通过以下命令来卸载分区,使分区重新回到加密状态。

sudo umount /dev/sda5 sudo cryptsetup luksClose cry_data

根分区加密(不包括/BOOT)

使用KYEFILE的普通系统分区加密

如果系统分区/VAR是一个单独的分区,假设是/dev/sda5,并且该分区是使用cryptsetup加密过的,
那么应该如何使用keyfile来在开机时自动进行分区解密呢?

创建keyfile

首先创建一个keyfile文件。

sudo dd if=/dev/urandom of=/root/autounlock.key bs=512 count=4 sudo chmod 0400 /root/autounlock.key

用keyfile加密分区

sudo cryptsetup luksAddKey /dev/sda5 /root/autounlock.key[/code]

**修改crypttab文件**

最后,修改/etc/crypttab文件,在keyfile那一部分加入/root/autounlock.key,/etc/crypttab配置文件的结构如下所示:

[code]<target name>	<source device>		<key file>	<options>[/code]

**使用KEYFILE的根分区加密(不包括/BOOT)**


假设你已通过上一节的方法安装了全盘加密(不包括/boot)的Debian系统,那么接下来介绍如何使用keyfile来进行全盘加密的自动解密。
用来解密的keyfile被存储在initramfs中。下面是具体步骤。

假设下面是现在的系统布局状况:

-   /dev/sda1 /boot 不加密
-   /dev/sda2 / 加密

**生成keyfile**

首先生成一段随机的二进制数据来作为我们的keyfile

[code]sudo dd if=/dev/urandom of=/root/autounlock.key bs=512 count=4
sudo hmod 0400 /root/autounlock.key[/code]

**使用keyfile加密根分区
**
然后将使用这个keyfile来加密系统分区

[code]sudo cryptsetup luksAddKey /dev/sda2 /root/autounlock.key --key-slot 1[/code]

可以通过以下命令来进一步查看系统分区的加密状况

[code]sudo cryptsetup luksDump /dev/sda2

**initramfs中加载keyfile的脚本
**
创建一个新的脚本,用来在initramfs中将这个keyfile导入系统。

以下是getinitramfskey.sh文件的内容

#!/bin/busybox ash

KEY="${1}" if -f "${KEY}" ]; then cat "${KEY}" else PASS=/bin/plymouth ask-for-password --prompt="Key not found. Enter LUKS Password: " echo "${PASS}" fi

给这个文件加上可执行权限:

创建update-initramfshook脚本

然后再创建一个新的shell脚本,这个脚本在系统创建initramfs时被调用,作用是加载keyfile到initramfs中。

sudo /etc/initramfs-tools/hooks/loadinitramfskey.sh
loadinitramfskey.sh的内容:

#!/bin/sh /etc/crypttab. PREREQ="" prereqs() { echo "$PREREQ" } case "$1" in prereqs) prereqs exit 0 ;; esac . "${CONFDIR}/initramfs.conf" . /usr/share/initramfs-tools/hook-functions if ! -f "${DESTDIR}/lib/cryptsetup/scripts/getinitramfskey.sh" ]; then if ! -d "${DESTDIR}/lib/cryptsetup/scripts" ]; then mkdir -p "${DESTDIR}/lib/cryptsetup/scripts" fi cp /lib/cryptsetup/scripts/getinitramfskey.sh ${DESTDIR}/lib/cryptsetup/scripts/ fi if ! -d "${DESTDIR}/root/" ]; then mkdir -p ${DESTDIR}/root/ fi cp /root/autounlock.key ${DESTDIR}/root/

同样地,给这个文件加上可执行权限:

修改/etc/crypttab配置

修改/etc/crypttab文件,使之看起来像下面的样子

重新生成initramfs

最后,需要执行命令来重新生成initramfs,

这样,重启系统之后,你会发现,此时已经不再需要输入密码了,系统已经使用initramfs中存储的keyfile文件来自动解密了系统分区。

Thumbs up. 现在LUKS+ZFS已经成为我的标配。/滑稽