bcache 上的 LUKS 上的 LVM

bcache 上的 LUKS 上的 LVM

我在公司环境中使用 Ubuntu,我们的安全策略规定我们必须使用全盘加密。

我还有一台笔记本电脑,配备 32GB mSATA SSD 和 750GB 的 spinning rust。我当前的安装使用 bcache 来利用这一点,使用以下方式安装此程序。这提供了非常受欢迎的性能提升,而我无需担心填满 SSD。

这是一个悬赏问题。悬赏对象为:

  • 执行 Ubuntu 全新安装的清晰、可靠的方法
    • 任何版本都可以接受,但 15.04 (Vivid) 就可以了
  • 整个文件系统将被加密
    • 这里的偏好是使用默认 Ubiquity 安装程序中的相关复选框(dm-crypt 加密)
  • 文件系统将缓存在 SSD 上
    • 有关内核 dm-cache / lvmcache 方法的首选项,请参阅这里使用 Debian Jessie 执行此操作的方法
    • 缓存也必须是安全的(即加密)
    • 必须清楚解释为什么缓存也要加密

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

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

请像将解决方案写入社区维基一样来编写解决方案。


我已经授予了赏金 - 我认为“LUKS-on-LVM”解决方案仍然有潜力,该解决方案结合了仅使用一个密码的批准答案的简便性,并且仅使用设备映射器组件。

答案1

bcache 上的 LUKS 上的 LVM

这里俄罗斯娃娃游戏更加深入,有 3 个堆栈/层...

我对这个问题的最初想法是使用默认的 Ubuntu 安装LUKS 上的 LVM并将其转换成缓存带有背衬装置的但它在我使用 LVM 进行的测试中没有起作用。

此外,ubuntu 安装程序(无处不在)太有限,无法安装在缓存设备已经提前准备好(至少在 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

Ubuntu 15.04 有一个已知的 Live CD/USB 重启错误,因此你可能需要强制重启/关机

查看

启动后,你可以检查这/dev/bcache0实际上是卢克斯分区

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 状态尚未正式合并到 bcache-tools。你可以在这里获取它:https://gist.github.com/djwong/6343451

[1] 或许有更好的方法擦拭

答案2

LUKS + LUKS/dm-cache 上的 LVM

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. 需要 root 权限才能工作
  2. 在 bash 中运行脚本
  3. 脚本名称
  4. 您要使用的块设备(仅使用整个磁盘进行测试)
  5. 元数据大小
  6. 缓存数据大小

大小参数默认以 MB 为单位:您需要 1:1000 的元数据空间与缓存空间比率(例如,如果您的缓存磁盘为 180GB,则需要 180MB 的元数据空间和 179820MB 的数据空间 - 您可能需要将元数据稍微向上舍入以防万一。元数据的下限为 8M。)

系统将提示您输入缓存卷的密码 - 系统将提示您输入以下密码两个都在启动过程中检查磁盘。

参考


/bin/bash #!/bin/bash
#
# lvmcryptocache
#
# 添加 LVM 缓存池并将其附加到根卷
# 包括 LUKS 加密
# 假设你正在使用“全部在根上”设置
# 如果你不是,请根据自己的喜好进行调整
#
# 脚本使用 GPL3 或更高版本许可
# © Adrian Wilkins 2015 年 5 月
#
# 传递用作缓存的磁盘设备的名称
# 理想情况下,这应该是完全空白的,因此运行
#
# dd if=/dev/zero of=/dev/${DISK}
#
# 稍等片刻,以清除分区表

CACHE_DISK=$1
META_SIZE=$2
数据大小=$3

DISK_NAME=$(基本名称 $CACHE_DISK)

CRYPT_VOLUME=${磁盘名称}_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 "磁盘 ${CACHE_DISK}" | awk ' { 打印 $5 } ')
#
#META_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))
#
#数据大小=$((磁盘大小-元大小))
#

# 在加密卷内创建新的 PV

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

# 现在将缓存池物理驱动器 (/dev/sdb) 的 UUID 添加到 /etc/crypttab
DISK_UUID = $(ls -al / dev / disk / by-uuid / | grep $DISK_NAME | awk'{打印$ 9}')
echo "${CRYPT_VOLUME} UUID=${DISK_UUID} none luks,丢弃" >> /etc/crypttab

apt-get 安装——是精简配置工具

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

回显“#!/bin/sh”>$HOOK
回显“PREREQ =”lvm2“”>>$HOOK
echo "prereqs()" >> $HOOK
回显“{”>>$HOOK
回显“回显\“$PREREQ\””>>$HOOK
回声“}”>>$HOOK
echo "案例 $1 在" >> $HOOK
echo "prereqs)" >> $HOOK
echo "先决条件" >> $HOOK
回显“退出 0”>>$HOOK
回显“;;”>>$HOOK
回显“esac”>>$HOOK
回显“如果 [ !-x /usr/sbin/cache_check ];则”>> $HOOK
回显“退出 0”>>$HOOK
回显“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 现在重启!

相关内容