存储设备(硬盘,便携式记忆棒)上的关键数据的安全性是必要的,以便入侵者无法窃取敏感信息。 在本教程中,我们的重点是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脚本用于在启动时提供加密卷的秘密密钥。