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

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

Debian操作系统安装

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

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

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

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

配置键盘的语言。

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

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

1.设置主机名

2.配置域名

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

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

5.设置时区

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

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

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

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

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

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

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

选择新分区的位置。

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

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

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

设置交换分区的大小。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

重新输入相同的密码。

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

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

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

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

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

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

分区格式如下所示。

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

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

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

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

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

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

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

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

最后,安装过程完成。

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

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

成功登录已安装的系统。

无密码根文件系统的配置

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

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

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

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

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

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

blkid

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

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

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

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

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

udevadm control --reload-rules

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

从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

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

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

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

以下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

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

在上述命令之后,在“/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”来更新所有内核的临时文件系统文件。

重新启动之前,打开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

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

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

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

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

结论

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

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏