如何使用磁盘加密和SSD缓存安装Ubuntu

我在企业环境中使用Ubuntu,我们的安全策略声明我们必须使用全盘加密。

我还有一台配备32GB mSATA SSD和750GB旋转防锈的笔记本电脑。 我当前的安装使用bcache来利用它,使用此过程安装。 这提供了非常受欢迎的性能提升,而我不必担心填充SSD。

这将是一个有价值的问题。 赏金将授予:

  • 一种清晰,可靠的方法来执行Ubuntu的全新安装
    • 任何释放都是可以接受的,但15.04(生动)将没问题
  • 整个文件系统将被加密
    • 这里的首选项是使用默认的Ubiquity安装程序中的相关复选框(dm-crypt加密)
  • 文件系统将缓存在SSD上
    • 首先,内核dm-cache / lvmcache方法可以在这里看到使用Debian Jessie执行此操作的方法
    • 缓存也必须是安全的(即加密)
    • 必须清楚解释为什么缓存也是加密的

上面已经尝试过Debian Jessie的方法,但它拒绝为我启动。 到目前为止还没有尝试过这里评论中描述的方法。

发布的解决方案将在具有两个空白虚拟磁盘和15.04桌面版本(amd64版本)的VirtualBox VM上进行测试。 Bounty转到我采用的第一个重新安装我的实际硬件的解决方案。

请编写您的解决方案,就像它进入社区维基一样。


我已经获得了奖励 – 我认为仍然有可能实现“LUKS-on-LVM”解决方案,该解决方案仅使用一个密码,仅使用设备映射器组件,将已批准答案的简易性结合在一起。

关于bcache的LUKS上的LVM

这里的俄罗斯娃娃游戏有点深度,有3个堆叠/层……

我对这个问题的初步想法是在LUKS上使用LVM的默认Ubuntu安装并将其转换为带有块的bcache支持设备,但在我使用LVM进行测试时它对我不起作用。

而且,ubuntu安装程序( ubiquity )太有限了,无法安装在预先准备好的bcache设备中(至少在LVM上使用LUKS),因此我们回退到手动操作的方法。

启动到现场CD / USB并选择“尝试Ubuntu”并打开终端

预安装

sudo -i # Define some variable to avoid confusion and error luks_part=/dev/sda3 boot=/dev/sda2 # boot partition caching_bcache=/dev/sdb # SSD or partition in SSD # Do secure erase of encrypted backing and caching device (see Notes [1]) dd if=/dev/urandom of=$luks_part || dd if=/dev/urandom of=$caching_bcache # Go and grab some coffe, this will take a while... apt-get install bcache-tools # Setup bcache caching and backing devices make-bcache -C $caching_bcache -B $luks_part # (Optional) Tweak bcache echo writeback > /sys/block/bcache0/bcache/cache_mode # Below we now create manually what ubiquity should have done for us # Setup LUKS device on bcache device cryptsetup --key-size 512 luksFormat /dev/bcache0 cryptsetup luksOpen /dev/bcache0 crypted # Setup LVM on LUKS # You can skip that part if you don't want to use a swap # or don't want to use multiple partition. Use /dev/mapper/crypted # as you root latter on pvcreate /dev/mapper/crypted vgcreate vg /dev/mapper/crypted lvcreate -L 1G vg -n swap lvcreate -l 100%FREE vg -n root 

安装

保持终端打开,然后运行安装。 在分区和指定时选择“其他”

  • 你的启动分区( /dev/sda2
  • 你的根分区( /dev/mapper/vg-root
  • 你的交换( /dev/mapper/vg-swap

并选中复选框以格式化分区

在安装结束时, 不要重新启动 ,只需单击“继续尝试ubuntu”

安装后

在我们开的终端

 # Install bcache-tools to add bcache module to initramfs mount /dev/mapper/vg-root /mnt mount $boot /mnt/boot mount -o bind /sys /mnt/sys mount -o bind /proc /mnt/proc mount -o bind /dev /mnt/dev chroot /mnt # To get apt-get running in the chroot echo 'nameserver 8.8.8.8' > /run/resolvconf/resolv.conf apt-get install bcache-tools # Create /etc/crypttab to add crypted bcached partition echo "crypted UUID=`blkid -o value /dev/bcache0|head -1` none luks" > /etc/crypttab exit sync umount /mnt/sys umount /mnt/proc umount /mnt/dev umount /mnt/boot umount /mnt vgchange -an /dev/mapper/crypted cryptsetup luksClose crypted sync # Reboot & enjoy 

Live CD / USB存在一个已知的Ubuntu 15.04重启错误,因此您可能需要强制重启/关闭

校验

启动后,您可以检查/dev/bcache0实际上是否为LUKS分区

 if sudo cryptsetup isLuks /dev/bcache0; then \ echo "crypted";\ else echo "unencrypted";\ fi 

这是因为它是您的LUKS分区的缓存,现在您通过设备/dev/bcache0访问您的数据,而不是从原始后备设备访问您的数据(这里是/dev/sda3

参考

http://bcache.evilpiepirate.org/

https://wiki.archlinux.org/index.php/Bcache

https://wiki.archlinux.org/index.php/Dm-crypt

bcache-status尚未正式合并到bcache-tools中。 你可以在这里找到它: https : //gist.github.com/djwong/6343451

[1]可能有更好的方法来擦拭

LUKS + LUKS / dm-cache上的LVM

Ubuntu安装程序在LUKS配置上使用LVM进行全磁盘加密。

如果您还想使用dm-cache / lvmcache来提高性能,则需要将缓存池放入加密卷中以维护数据的安全性。

步骤是

  • 在目标块设备上创建LUKS卷
  • 使用新加密的LUKS卷扩展默认卷组
  • 在新LUKS卷中创建缓存元数据和数据卷
  • 将它们绑定在一起作为缓存池
  • 将此缓存池绑定到根卷
  • 通过将新加密卷添加到/etc/crypttab确保可以在引导时挂载新的加密卷
  • 确保您的引导环境支持dm-cache

下面的脚本提供了一个示例,并将加密的缓存池添加到现有的根文件系统。 它是为在Ubuntu安装程序中使用默认磁盘加密选项的系统设计的 – 即; 整个磁盘分区和加密,没有自定义分区等。

请注意,此脚本中的validation或防御性编程很少。 如果它破坏了你的工作系统,那就是你的责任。

这样称呼:

 # 1 2 3 4 5 6 sudo bash lvmcryptocache /dev/sdb 32M 1968M 
  1. 需要root才能工作
  2. 在bash中运行脚本
  3. 脚本名称
  4. 您要使用的块设备(仅使用整个磁盘进行测试)
  5. 元数据大小
  6. 缓存数据大小

默认情况下,大小参数以MB为单位:您需要1:1000元数据空间与缓存空间的比例(例如,如果您的缓存磁盘为180GB,您需要180MB的元数据空间和179820MB的数据空间 – 您可能需要围绕元数据有点小心谨慎.8M的元数据有一个下限。)

系统将提示您输入缓存卷的密码 – 在启动过程中将提示您输入磁盘的密码。

参考

  • 使用LVM新缓存function(Richard Jones)
  • 加密整个系统(dm-crypt wiki)
  • 评论Launchpad Bug#1423796
  • 从lvmcache启动Debian Jessie

 #!/斌/庆典
 #
 #lvmcryptocache
 #
 #添加LVM缓存池并将其附加到根卷
 #包括LUKS加密
 #假设您正在使用“all on root”设置
 #如果不是,请根据自己的需要进行调整
 #
 #脚本许可GPL3或更高版本
 #©Adrian Wilkins 2015年5月
 #
 #将您正在使用的磁盘设备的名称作为缓存传递
 #理想情况下,这应该是完全空白的,所以运行
 #
 #dd if = / dev / zero of = / dev / $ {DISK}
 #
 #在它上面短暂地核对分区表

 CACHE_DISK = $ 1
 META_SIZE = $ 16
 DATA_SIZE = $ 3

 DISK_NAME = $(基本名称$ CACHE_DISK)

 CRYPT_VOLUME = $ {} DISK_NAME _crypt
 CACHE_PV =的/ dev /映射器/ $ {} CRYPT_VOLUME

 #在原始磁盘中创建LUKS卷

 cryptsetup luksFormat $ CACHE_DISK
 cryptsetup open --type luks $ CACHE_DISK $ CRYPT_VOLUME

 #开始尝试计算磁盘大小的东西,但它很复杂
 #如果你愿意,可以去吧,我一直在用完
 #
 #DISK_SIZE = $(fdisk -l | grep“Disk $ {CACHE_DISK}”| awk'{print $ 5}')
 # 
 #META_SIZE = $((DISK_SIZE / 1000))
 #META_SIZE = $((META_SIZE + 512))
 #MOD = $((META_SIZE%512))
 #MOD_OFFSET = $((512  -  MOD))
 #META_SIZE = $((META_SIZE + 512)) 
 #META_SIZE = $((META_SIZE + MOD_OFFSET))
 # 
 #DATA_SIZE = $((DISK_SIZE  -  META_SIZE))
 # 

 #在加密卷内创建新的PV

 pvcreate $ CACHE_PV
 vgextend ubuntu-vg $ CACHE_PV
 lvcreate -L $ {META_SIZE} -n cachemeta ubuntu-vg $ CACHE_PV
 lvcreate -L $ {DATA_SIZE} -n cachedata ubuntu-vg $ CACHE_PV
 lvconvert --type cache-pool --poolmetadata ubuntu-vg / cachemeta --cachemode writethrough ubuntu-vg / cachedata --yes
 lvconvert --type cache --cachepool ubuntu-vg / cachedata ubuntu-vg / root

 #现在将缓存池PHYSICAL DRIVE(/ dev / sdb)的UUID添加到/ etc / crypttab
 DISK_UUID = $(ls -al / dev / disk / by-uuid / | grep $ DISK_NAME | awk'{print $ 9}')
 echo“$ {CRYPT_VOLUME} UUID = $ {DISK_UUID} none luks,discard”>> / etc / crypttab

 apt-get install  - 是thin-provisioning-tools

 HOOK = $(临时文件)
 #在initramfs中添加一个钩子脚本,添加正确的工具和模块

 echo“#!/ bin / sh”> $ HOOK
 echo“PREREQ =”lvm2“”>> $ HOOK
 echo“prereqs()”>> $ HOOK
 echo“{”>> $ HOOK
 echo“echo \”$ PREREQ \“”>> $ HOOK
 echo“}”>> $ HOOK
 echo“case $ 1 in”>> $ HOOK
 echo“prereqs”“>> $ HOOK
 echo“prereqs”>> $ HOOK
 echo“exit 0”>> $ HOOK
 echo“;;”  >> $ HOOK
 echo“esac”>> $ HOOK
 echo“if [!-x / usr / sbin / cache_check];然后”>> $ HOOK
 echo“exit 0”>> $ HOOK
 echo“fi”>> $ HOOK
 echo“./ usr / share / initramfs-tools / hook-functions”>> $ HOOK
 echo“copy_exec / usr / sbin / cache_check”>> $ HOOK
 echo“manual_add_modules dm_cache dm_cache_mq dm_persistent_data dm_bufio”>> $ HOOK

 cp $ HOOK / etc / initramfs-tools / hooks / lvmcache
 chmod + x / etc / initramfs-tools / hooks / lvmcache

 echo“dm_cache”>> / etc / initramfs-tools / modules
 echo“dm_cache_mq”>> / etc / initramfs-tools / modules
 echo“dm_persistent_data”>> / etc / initramfs-tools / modules
 echo“dm_bufio”>> / etc / initramfs-tools / modules

 #更新initramfs

 update-initramfs -u

 echo现在重启!