使用USB密钥对Debian 8上的Linux根分区进行无密码加密

在本文中,使用保存在usb内存设备中的密钥打开加密分区。自动shell脚本用于提供...

存储设备(硬盘,便携式记忆棒)上的关键数据的安全性是必要的,以便入侵者无法窃取敏感信息。 在本教程中,我们的重点是Linux根文件系统和交换区域的安全性。 将使用默认的Linux加密功能“LUKS”,这在启动时需要密码。 因此,我们的下一个目标是在启动时自动提供加密卷的密码。 对于旧版Debian发行版,已经有同一主题的几篇文章。 但是,在本教程中,Debain 8(Jessie)版本安装在VirtualBox VM上。

Debian操作系统安装

在本教程中,Debian Jessie安装在VM上,详细信息如下图所示。 同样的程序也可以在“真实的”服务器或桌面上工作。

将Debian网络安装程序iso文件添加到VM中并启动vm,将出现安装程序提示符。 选择“安装”选项开始安装过程。

在Debian安装程序中选择安装选项。

以下几个屏幕将提示Debian的基本设置。 从给定列表中选择所需的语言选项。

选择语言

选择国家或地区,如下图所示。

选择您的国家

配置键盘的语言。

配置键盘语言。

基本设置后,安装程序将加载更多组件进行配置。

装载组件

同样,在安装过程中将配置更多的基本设置。

1.设置主机名

设置主机名

2.配置域名

配置域名

3.设置“root”用户的密码。

设置root密码

重新输入root密码

4.创建除root以外的新用户。

创建非root用户

输入用户名

输入密码

重新输入密码。

5.设置时区

设置时区

最后,最重要的部分就是分区磁盘。

选择手动磁盘分区

本文需要手动分区硬盘。 因此,在上述提示中选择“手动”选项,然后选择所需的硬盘启动进程。

选择硬盘

如上图所示,Debian将安装在VM中。 按回车键开始分区所选硬盘,如下所示。

开始划分

以下屏幕将在接受上述消息后显示。 如下面的屏幕截图所示,目前硬盘上没有分区。

没有分区可用

按“enter”键创建虚拟硬盘上的第一个分区。

创建分区

我们在硬盘上创建的第一个分区是“/ boot”装载点的“/ dev / sda1”。

/ boot挂载点分区

选择主或逻辑类型进行分区。

添加新的主分区

选择新分区的位置。

选择分区的位置

安装点“/ boot”显示在以下屏幕截图中。

/ boot装载点已创建

第一个分区已经在硬盘上成功创建。 Linux内核后来被放置在“/ boot”分区中。

启动分区创建

在VM硬盘上创建的第二个分区是交换,交换分区的大小应该是RAM大小的两倍。 如下面的截图所示,选择剩余的可用空间进行交换。

选择swp分区的空间

设置交换分区的大小。

设置交换大小

以下屏幕截图显示分区被选择为交换区域。

选择交换分区

VM上也创建了另一个分区。

创建另一个分区

Linux平台的核心分区是在/(“根”安装点)的剩余空间上创建的。 以下快照显示“root”分区的大小。

添加根分区

为硬盘上的新分区选择“物理卷加密”选项。

选择根分区的加密磁带

需要在以下屏幕截图中突出显示的选项来加密Linux平台上的分区。

选择加密选项

选择“加密物理卷”后的分区设置如下图所示。 默认加密方法是设备映射(dm-crypt),加密算法是256密钥大小的AES。

使用dm-crypt

在虚拟硬盘上成功创建分区如下图所示。

分区成功创建

以下是截图中选择Debian的加密卷的高级配置。

高级加密配置

以下提示显示当前分区方案需要在硬盘上进行写入,才能从加密卷的配置开始。

首先保存分区设置

以下提示显示在Debian平台上创建加密卷。

创建加密卷

选择加密卷的设备。 不要为加密卷选择引导设备“/ dev / sda1”,因为它不允许加密引导分区。

如下面的截图所示,只有加密卷选择“/ dev / sda3”,这是磁盘的根分区。

选择要加密的设备

配置加密卷后,选择完成以应用更改。

应用更改

但是,如果没有为加密卷选择交换分区,则会出现以下错误提示。

加密卷错误。

因此,我们选择加密卷的两个分区。

添加交换到加密卷

交换加密卷的分区设置如下所示。

我们选择的结果

以下提示显示数据将在“sda2”(swap)上被清除。

确认数据从/ dev / sda2中删除

擦除“sda2”和“sda3”的数据如下所示。

从sda2删除数据

从sda3删除数据

过程完成后,输入两个加密分区的密码。

输入分区的密码

重新输入相同的密码。

重新输入密码

成功配置磁盘上加密卷后的分区表如下所示。

结果分区表

完成分区过程,开始安装Debian操作系统。 但是,将出现以下错误提示,因为任何分区尚未选择安装点“/”。

设置根文件系统

上述错误提示后,重新配置加密卷以设置安装点。 在本文中,“sda3_crypt”是根文件系统,“sda2_crypt”是交换区域。

设置根文件系统

为加密卷选择安装点“/”。

选择/作为安装点

选择“sda2_crypt”加密卷作为交换区域。

选择交换区域。

以下屏幕截图显示加密卷的最终分区表。

分区表结果

分区格式如下所示。

格式化分区

完成格式化处理后,将安装基本系统。

系统安装进度

以下屏幕截图显示了Debian软件包的归档镜像的选择。

选择Debian镜像

软件包管理器配置如下所示。

安装包

仅安装基础或核心系统,并且可以从显示的列表中安装其他软件包。

只需安装核心系统

从列表中选择桌面环境和其他软件包。

选择桌面环境

所选软件包的安装如下所示。

安装包

下面的屏幕截图显示了Linux引导加载程序“GRUB”的安装。

安装Grub

选择设备(sda)进行引导加载程序的安装。

选择sda作为引导加载程序

最后,安装过程完成。

安装完成

重新启动后,输入密码以解密sda3磁盘。

输入密码

输入密码解密sda2磁盘,这是交换区域。

交换区域相同

成功登录已安装的系统。

成功登录

无密码根文件系统的配置

启动时输入密码短语的过程现在可以使用USB记忆棒进行自动化。 而不是使用

一个密码,USB上的秘密密钥将解密加密的卷。 将U盘连接到虚拟机,并使用“dmesg”命令找到它。 在我的虚拟机中被检测为“/ dev / sdb”。

用dmesg找到U盘

使用dd命令从usb棒提取8192随机字节的秘密密钥。

dd if=/dev/sdb of=/root/secret.key bs=512 skip=4 count=16

dd命令

使用“cryptsetup”命令将上述生成的秘密密钥添加到加密卷。 默认情况下,密码短语保留在socket0中。因此,socket1将用于第二个密钥。

运行“blkid”命令获取磁盘上的卷的详细信息。

blkid

使用blkid

在本教程中,解密卷的秘密密钥仅在/ dev / sda3中添加。 但是,它也可以添加到“/ dev / sda2”(swap)分区。

cryptsetup luksAddKey /dev/sda3 /root/secret.key --key-slot 1

添加luks键

在/etc/udev/rules.d/99-custom-usb.rules文件中为USB设备创建一个简单的udev规则,我们将使用符号链接是/ dev / usbdevice。

SUBSYSTEMS=="usb", DRIVERS=="usb",SYMLINK+="usbdevice%n"

添加udev规则

使用以下命令重新加载规则。

udevadm control --reload-rules

重新加载udev规则

插入USB设备以验证自定义规则。

验证udev规则是否有效

从USB设备读取密钥需要一个shell脚本,并在启动时将其提供给cryptsetup。 该脚本创建为“/usr/local/sbin/openluksdevices.sh”,并从http://www.oxygenimpaired.com/网站获取

#!/bin/sh
############taken from following link#########
###http://www.oxygenimpaired.com/debian-lenny-luks-encrypted-root-hidden-usb-keyfile

TRUE=0
FALSE=1

# flag tracking key-file availability
OPENED=$FALSE

if [ -b /dev/usbdevice ]; then
# if device exists then output the keyfile from the usb key
dd if=/dev/usbdevice bs=512 skip=4 count=16 | cat
OPENED=$TRUE
fi

if [ $OPENED -ne $TRUE ]; then
echo "FAILED to get USB key file ..." >&2
/lib/cryptsetup/askpass "Try LUKS password: "
else
echo "Success loading key file for Root . Moving on." >&2
fi

sleep 2

设置脚本的权限,使其可以执行。

 chmod a+x /usr/local/sbin/openluksdevices.sh

添加执行权限

与fstab配置文件类似,crypttab文件包含有关Linux平台上有关嵌入卷的信息。 为sda3_crypt加密分区添加一个shell脚本。 下面给出了加密卷的配置文件“/ etc / crypttab”内容。

sda3_crypt /dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc none luks,keyscript=/usr/local/sbin/openluksdevices.sh

crypttab的内容

在“/etc/initramfs-tools/conf.d/cryptroot”文件中添加以下行。

CRYPTROOT=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc

添加线到cryptroot

确保将“usb_storage”添加到“/ etc / initramfs-tools / modules”文件中。

确保加载了usb_storage模块

以下shell脚本(/etc/initramfs-tools/hooks/udevusbkey.sh)也从外部来源获取 。 它用于在临时文件系统“initrd”中添加自定义udev规则。

#!/bin/sh
# udev-usbkey script
###taken from
###http://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)
prereqs
exit 0
;;
esac

. /usr/share/initramfs-tools/hook-functions

# Copy across relevant rules

cp /etc/udev/rules.d/99-custom-usb.rules ${DESTDIR}/lib/udev/rules.d/

exit 0

剧本

更改脚本的权限。

 chmod a+x /etc/initramfs-tools/hooks/udevusbkey.sh

使脚本可执行

在GRUB2引导加载程序配置中需要进行一些更改。 但是,不允许直接更改配置文件“/boot/grub/grub.cfg”。 因此,请在“/ etc / default / grub”配置文件中更改“GRUB_CMDLINE_LINUX_DEFAULT”参数。 如下所示,“rootdelay”和“cryptopts”包含在“GRUB_CMDLINE_LINUX_DEFAULT”参数中。


GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtainsConclusion

grub配置文件

运行“update-grub”命令以应用上述“/boot/grub/grub.cfg”配置文件中的更改。

运行update-grub

在上述命令之后,在“/boot/grub/grub.cfg”配置文件中应用了以下更改。

echo    'Loading Linux 3.16.0-4-686-pae ...'
linux   /vmlinuz-3.16.0-4-686-pae root=UUID=b30cdb22-8e3c-4ffd-a0c7-af96b90ba016 ro  rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-3.16.0-4-686-pae

运行“update-initramfs -u”来更新所有内核的临时文件系统文件。

update-initramfs -u

重新启动之前,打开newley生成的“initrd.img”,并验证keyscript是否被复制到“lib / cryptsetup / scripts”目录,并将自定义的udev规则复制到“lib / udev / rules.d /”目录中。

cd /tmp/
zcat /boot/initrd.img-3.16.0-4-686-pae | cpio -iv

检查initrd映像

Keyscript成功地包含在initramfs脚本中。

钥匙包括在内

自定义USB规则也包含在udev规则中。

包括usb规则

在测试整个设置之前,在VM设置中添加USB设备。

将usb设备添加到vm

最后,秘密密钥成功加载加密卷。

秘密密钥在启动时成功加载。

结论

在本文中,使用保存在USB存储设备中的秘密密钥打开加密分区。 自动shell脚本用于在启动时提供加密卷的秘密密钥。