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


10

我在公司环境中使用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上进行测试。赏金归功于我采用的重新安装实际硬件的第一个解决方案。

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


我已经获得了赏金-我认为“ LUKS-on-LVM”解决方案仍然存在潜力,该解决方案仅通过使用一个设备映射器组件就可以使批准的答案变得简单,只需一个密码即可。


据我了解,您不想在LUKS ubuntu安装的默认LVM中使用lvmcache,因为缓存将不加密。
solsTiCe 2015年

@solsTiCe-我的理解是,lvmcrypt是dm-cache上的一个很好的简单层,也应该可以与LUKS调和(LUKS是另一种设备映射器,dm-crypt),这很重要你周围的东西分层
阿德里安

您应该了解,/ boot分区肯定必须是未加密的。bcache与Ubuntu 14.04上的grub不兼容,我相信仍然如此。
亚当·里奇科夫斯基

@AdamRyczkowski是的,我现在有那个配置。可以接受,但我更喜欢LUKS配置。
阿德里安

我不明白为什么LUKS会排除bcache ...它们彼此不依赖,一个可以快乐地坐在另一个之上。
亚当·里奇科夫斯基

Answers:


7

在bcache上的LUKS上的LVM

俄罗斯玩偶游戏在这里更深一点,有3个堆栈/层...

我对这个问题的最初想法是在LUKS上使用默认的Ubuntu安装LVM,并将其转换为带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]可能有更好的方式来做到


确保update-initramfs -uk all在创建crypttab和以下exit命令后运行。
dess,2015年

4

LUKS上的LVM + LUKS / dm-cache

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

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

步骤是

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

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

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

致电:

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

大小参数默认为MB:您将需要1:1000元数据空间与缓存空间的比率(例如,如果您的缓存磁盘为180GB,则需要180MB元数据空间和179820MB数据空间-您可能需要四舍五入元数据需要谨慎一点。8M的元数据有一个下限。)

系统将提示您为您的缓存卷密码-你会被提示输入密码BOTH在引导过程中您的磁盘。

参考文献


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

CACHE_DISK = $ 1
META_SIZE = $ 2
DATA_SIZE = $ 3

DISK_NAME = $(基本名称$ CACHE_DISK)

CRYPT_VOLUME = $ {DISK_NAME} _crypt
CACHE_PV = / dev / mapper / $ {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缓存池--poolmetadata ubuntu-vg / cachemeta --cachemode写入ubuntu-vg / cachedata-是
lvconvert --type缓存--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 luk,discard” >> / etc / crypttab

apt-get install --yes精简配置工具

HOOK = $(临时文件)
#将钩子脚本添加到initramfs中以添加正确的工具和模块

回声“#!/ bin / sh”> $ HOOK
echo“ PREREQ =” lvm2“” >> $ HOOK
echo“ prereqs()” >> $ HOOK
回声“ {” >> $ HOOK
echo“ echo \” $ PREREQ \“” >> $ HOOK
echo“}” >> $ HOOK
echo“ case $ 1 in” >> $ HOOK
echo“ prereqs)” >> $ HOOK
echo“ prereqs” >> $ HOOK
回声“退出0” >> $ HOOK
回声“ ;;” >> $ HOOK
echo“ esac” >> $ HOOK
回声“如果[!-x / usr / sbin / cache_check];则” >> $ HOOK
回声“退出0” >> $ HOOK
echo“ fi” >> $ HOOK
回声“ ./usr/share/initramfs-tools/hook-functions” >> $ HOOK
回声“ copy_exec / usr / sbin / cache_check” >> $ HOOK
回声“ 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

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

#更新initramfs

更新initramfs -u

echo现在重启!

1.建议将缓存磁盘清零,但如果要在其上放置加密的LUKS,则应使用随机数据安全地擦除它。2.在您的设置中,您有2个LUKS分区,所以即使您使用相同的密码,也必须输入两次,对吗?
solsTiCe 2015年

1.随机擦除磁盘在现代硬件上有点过时了-零足以使磁盘超出大多数非学术级别的措施,当然也超出了商业磁盘恢复实验室的范围。除非您使用以前保存的敏感数据,否则没有必要,因为写入其中的所有块都会被加密;由于存在耗损均衡算法,因此您根本不应该使用上面带有明文敏感数据的SSD。2.是的,有2个LUKS分区,正如我在文本中所说,在启动过程中将提示您输入两个密码短语。
阿德里安

随机擦除并不是为了安全删除SSD上的数据,而是要避免检查并能够区分加密数据与空白(例如00000000zerazer000000000000)。在这里您可以看到中间的加密数据。这会削弱您的加密,而不是将其隐藏在随机的汤中。
solsTiCe 2015年

在我设置bcache后,我最终选择了这条路线。看起来效果很好:| cache_utilization_pct | 79.096846147 |。但是,top我看到iowait状态不断地达到20-50%。这可能是缓冲的副作用吗?
Jean Jordaan 2015年

我不能真正声称知道-但是我猜测这可能是减少对SSD的写入的最优化的副作用。此处有关IOWait的文章:thattommyhall.com/2011/02/18/iops-linux-iostat
Adrian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.