使用Debian Lenny创建一个完全加密的Para-Virtualized Xen Guest系统
本文档介绍如何设置完全加密的对虚拟化XEN实例。 在这个howto中,主机系统正在运行Debian Etch,而要安装的guest虚拟机系统将使用Debian Lenny。
介绍
如果您担心您的隐私,您可能需要考虑使用硬盘加密来保护您的宝贵的私人数据免遭窥视。 通常,最简单的方法是使用发行版的安装程序来设置完全加密的系统; 我认为最新的Linux发行版支持这一点。 但是,当您使用XEN提供虚拟化时,有时您可能不希望使用所有访客实例对整个计算机进行加密,而只能加密一个OS实例。 这个方法将会正好处理这种情况。 它假定XEN主机系统已经启动并运行。
准备XEN实例
首先,我们需要为新的访客实例创建XEN配置。 这可以从包xen-tools中
的脚本xen-create-image
轻松完成:
xen:~# aptitude install xen-tools
现在,我们需要“教” xen工具
Lenny的存在(因为,记住,我们使用Etch作为主机系统):
xen:~# ln -s /usr/lib/xen-tools/debian.d /usr/lib/xen-tools/lenny.d
现在,我们可以创建XEN实例:
xen:~# xen-create-image --memory 150M --size 1G --noswap --ip 10.0.0.1 --hostname crypto.example.com --dist lenny
最后一步安装了一个非常基本的Debian Lenny guest系统。 我们将使用该系统配置加密文件系统,并最终将其内容复制到这些加密的文件系统。
新系统的加密文件系统将全部使用LVM存储。 所以基本上是LVM里面的一个LVM,我们需要在主机系统上创建一个逻辑卷,这个逻辑卷将作为/ dev / sdX
提供给guest虚拟机系统,而在加密的客户系统里面,我们将安装LVM使用这个/ dev / sdX
作为物理卷来存储我们的卷组:
xen:~# lvcreate -L24G -n crypto.example.com_crypt vg0
这里我们假设XEN服务器上保存所有XEN实例的逻辑卷的卷组称为vg0
。
默认情况下, xen-create-image
创建一个配置文件/etc/xen/crypto_unencrypted.cfg
。 我们需要修改它以包括额外的逻辑卷,使其读取如下:
kernel = '/boot/vmlinuz-2.6.18-6-xen-amd64' ramdisk = '/boot/initrd.img-2.6.18-6-xen-amd64' memory = '150' root = '/dev/sda1' disk = [ 'phy:vg0/crypto.example.com_disk,sda1,w', 'phy:vg0/crypto.example.com_crypt,sda2,w' ] name = 'crypto.example.com' vif = [ 'ip=10.0.0.1' ] on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'restart'
所以现在我们准备首先进入新创建的系统:
xen:~# xm create -c /etc/xen/crypto_unencrypted.cfg
临时XEN客人准备步骤
登录后,我们需要安装必要的组件:
crypto:~# aptitude install lvm2 cryptsetup
接下来,我们使用随机数据填充目标分区:
crypto:~# dd if=/dev/urandom of=/dev/sda2
创建cryptodisk:
crypto:~# cryptsetup -c aes-cbc-essiv:sha256 -y -s256 luksFormat /dev/sda2
启用LVM来处理cryptsetup设备。 为此,请将以下内容添加到/etc/lvm/lvm.conf的设备
部分:
types = [ "device-mapper", 16 ]
打开加密设备:
crypto:~# cryptsetup luksOpen /dev/sda2 crypt
为LVM创建物理卷和卷组:
crypto:~# pvcreate /dev/mapper/crypt
crypto:~# vgcreate vg-crypt /dev/mapper/crypt
创建逻辑卷:
crypto:~# lvcreate -L1G -nroot vg-crypt
crypto:~# lvcreate -L2G -ntmp vg-crypt
crypto:~# lvcreate -L12G -nvar vg-crypt
crypto:~# lvcreate -L1G -nswap vg-crypt
crypto:~# lvcreate -L3G -nusr vg-crypt
现在,当创建逻辑卷时,设备上没有完全1G的空间,但稍微多了一点。 我们使用vgdisplay
来确定剩下多少空间,然后创建最后一个卷:
crypto:~# lvcreate -l255 -nusrlocal vg-crypt
并创建文件系统:
crypto:~# mkfs.ext3 /dev/vg-crypt/root
crypto:~# mkfs.ext3 /dev/vg-crypt/tmp
crypto:~# mkfs.ext3 /dev/vg-crypt/usr
crypto:~# mkfs.ext3 /dev/vg-crypt/usrlocal
crypto:~# mkfs.ext3 /dev/vg-crypt/var
crypto:~# mkswap /dev/vg-crypt/swap
你可能会问自己为什么要创建这么多文件系统? 那么这应该是一个非常安全的系统(毕竟,如果我的系统遭到黑客攻击,所有的加密都不会有帮助),所以稍后我会遵循安全的Debian手册
( http:// www。 debian.org/doc/manuals/securing-debian-howto/ ),但是这个方法没有涵盖。
安装新创建的文件系统:
crypto:~# mkdir /mnt/target
crypto:~# mount /dev/vg-crypt/root /mnt/target/
crypto:~# mkdir /mnt/target/usr/local -p
crypto:~# mkdir /mnt/target/var
crypto:~# mkdir /mnt/target/tmp
crypto:~# mount /dev/vg-crypt/usr /mnt/target/usr
crypto:~# mount /dev/vg-crypt/usrlocal /mnt/target/usr/local
crypto:~# mount /dev/vg-crypt/var /mnt/target/var
crypto:~# mount /dev/vg-crypt/tmp /mnt/target/tmp
并将当前正在运行的文件系统复制到加密文件系统:
crypto:~# init s
crypto:~# cp -apx / /target/
由于我们从正在运行的系统复制数据,我们需要清理一下:
crypto:~# /bin/rm -fr /target/tmp/*
crypto:~# /bin/rm -fr /target/proc/*
crypto:~# /bin/rm -fr /target/sys/*
crypto:~# /bin/rm /target/etc/mtab
创建/ target / etc / fstab
:
proc /proc proc rw,nodev,nosuid,noexec 0 0 /dev/vg-crypt/root / ext3 errors=remount-ro 0 1 /dev/vg-crypt/usr /usr ext3 errors=remount-ro 0 1 /dev/vg-crypt/usrlocal /usr/local ext3 errors=remount-ro 0 1 /dev/vg-crypt/var /var ext3 errors=remount-ro 0 1 /dev/vg-crypt/tmp /tmp ext3 errors=remount-ro 0 1 /dev/vg-crypt/swap none swap sw 0 0
如上所述,您可能需要考虑“ 安全Debian手册”
,并应用一些额外的安全调整。
现在,停止客系统:
crypto:~# halt
回到XEN主机系统...
我们需要安装一些必要的工具:
xen:~# aptitude install cryptsetup initramfs-tools
现在我们为加密系统创建一个XEN配置文件/etc/xen/crypto_encrypted.cfg
:
kernel = '/boot/vmlinuz-2.6.18-6-xen-amd64' ramdisk = '/boot/initrd.img-2.6.18-6-xen-amd64_crypt' memory = '150' root = '/dev/mapper/vg--crypt-root' disk = [ 'phy:vg0/crypto.example.com_crypt,sda1,w' ] name = 'crypto.example.com' vif = [ 'ip=10.0.0.1' ] on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'restart'
现在,这是一个非常棘手的部分。 我们需要创建一个新的initrd映像,以便加密的系统实际上要求磁盘Key。
首先,我们创建一个文件/etc/initramfs-tools/conf.d/cryptroot
:
CRYPTROOT=target=crypt,source=/dev/sda1,key=none,lvm=vg--crypt-root
请注意,即使保存加密文件系统的卷组称为vg-crypt
,因此我们需要使用第二个破折号来“转义”“ - ”。
然后,我们将以下行添加到/ etc / initramfs-tools / modules文件中
:
aes-x86_64 dm-crypt dm-mod sha256
接下来,我们备份我们现有的initrd映像,创建一个新的,并进行一些重命名:
xen:~# mv /boot/initrd.img-2.6.18-6-xen-amd64 /boot/initrd.img-2.6.18-6-xen-amd64_orig
xen:~# update-initramfs -k 2.6.18-6-xen-amd64 -v -c
xen:~# mv /boot/initrd.img-2.6.18-6-xen-amd64 /boot/initrd.img-2.6.18-6-xen-amd64_crypt
xen:~# mv /boot/initrd.img-2.6.18-6-xen-amd64_orig /boot/initrd.img-2.6.18-6-xen-amd64
所以现在我们准备开始加密的XEN客人:
xen:~# xm create -c /etc/xen/crypto_encrypted.cfg
如果一切顺利,系统将提示您输入加密卷的密钥,并引导整个系统。 请享用 :)
现在你还可以清理一下:
xen:~# /bin/rm /etc/xen/crypto_unencrypted.cfg
xen:~# lvremove /dev/vg0/crypto.example.com_disk
一件重要的事情:你需要信任主机系统! 如果主机系统受到威胁,当您进入解锁cryptsetup设备的密钥时,它可能会记录控制台输入,从而学习密码,加密所有数据!
来源
在设置加密的XEN guest实例时,以下网站对我来说是有用的: