答案1
在 Linux 上,当使用加密磁盘 (luks) 时,它会在启动时使用密码解锁,这里的想法是使用以下命令加密磁盘密码设置在谷歌系统之上(默认加密)并获得对实例的早期访问权限,以便能够在启动时解锁驱动器。这可以借助远程串行控制台功能来实现(请注意,本指南使用了 opensuse VM,其他发行版的不同步骤不应有所不同)。
缺点:
- 磁盘速度会降低10~15%。
- 在启动/重新启动时,需要通过串行会话引入加密密码。
- 失败/迁移时重新启动可能需要手动输入密码(如果不是自动)。
专业人士:
- 数据访问确实仅限于客户/所有者。
- 客户私有化静态磁盘加密。
- 客户对快照备份和映像进行私有化磁盘加密。
- Google 无法访问该磁盘的数据(或者至少会非常困难)。
- 磁盘加密密钥不会提供给 Google。
- 可定制的加密方法、算法和密钥大小。
- 数据保护改进等
实施概要:
- 0 拥有现有 VM 实例
- 1 启用实例/VM 串行访问
- 2 创建额外的(目标)加密硬盘
- 3 将当前硬盘复制到加密硬盘
- 4 将旧驱动器更换为新驱动器
- 5 启动 VM 并通过串行控制台输入密码
如何加密虚拟机的磁盘(gcloud、cryptsetup):
先决条件:
- 在目标区域上创建一个新的临时虚拟机(这需要是目标机器的副本,您可以使用快照备份磁盘,然后将快照恢复到新磁盘)
- 创建一个新的空磁盘(稍后加密),这是目标磁盘,其大小需要比源磁盘(用于新的 /boot 分区)大至少 256 MB,也可以更大,如果您想要扩大空间。
- 将两个磁盘挂载到临时虚拟机并启动它。
Temporary VM Config: /dev/sda : main disk, copy of the original source disk /dev/sdb : new empty disk larger than /dev/sda
串行控制台:
更新 grub 配置:
- 概括:启用串行控制台(使 grub 可通过串行控制台访问)
- 添加/编辑此内容到
/etc/default/grub
# ...Enabling serial console... GRUB_TIMEOUT=15 GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1" # ...End
- 应用设置
grub2-mkconfig -o /boot/grub2/grub.cfg
- 重新启动并检查 grub 是否可以在串行控制台上访问。
格式化目标磁盘:
- 概括:我们需要创建 2 个分区,一个用于
/boot
(未加密),另一个用于系统/
(加密),无论您/boot
的旧系统是否已经有一个单独的分区,在新系统上我们都需要让系统启动 grub 并要求输入密码来解锁加密分区。 - 格式化空磁盘并创建 2 个分区,其中一个大小至少为 256 MB(用于包含
/boot
),另一个包含剩余空间;使用fdisk /dev/sdb
为此,请创建第一个 256 MB 或更多的分区作为主分区,并启用可启动标志;然后创建第二个主分区,其大小与剩余空间相同(请注意,如果您在旧系统上使用交换分区,则还需要创建该分区)/dev/sda : /dev/sdb : |- sdb1 : 256 MB primary and bootable (empty) |- sdb2 : xx GB primary (empty)
- 将引导分区的文件系统设置为 ext4
mkfs.ext4 /dev/sdb1
- 擦除第二个分区以提高安全性
dd if=/dev/urandom of=/dev/sdb2 bs=4096 status=progress
- 设置加密为
sdb2
with
更改密码、密钥大小、加密类型等以满足您的需求cryptsetup -y -v --cipher aes-xts-plain64 --key-size 256 --pbkdf-force-iterations=100200 --hash sha256 --type luks1 --label=linux --use-random luksFormat /dev/sdb2
- 检查加密分区
cryptsetup luksDump /dev/sdb2
- 解锁加密分区
cryptsetup luksOpen /dev/sdb2 crypteddisk
- 将加密映射分区设置为 ext4
mkfs.ext4 /dev/mapper/crypteddisk
- 关闭加密分区
cryptsetup close /dev/mapper/crypteddisk
- 概括:我们需要创建 2 个分区,一个用于
克隆源盘:
- 概括:我们需要将我们的系统复制
/
到新的加密分区/dev/mapper/crypteddisk
(sdb2),在此步骤中您可以使用不同的工具,在本指南中我们将使用dd
,重要的提示在这里,为了dd
复制磁盘而没有任何错误,需要卸载源分区。如果你想避免任何数据丢失您可以创建另一个临时虚拟机并将源磁盘和目标磁盘作为附加磁盘附加到其上以执行此步骤...否则,为了避免迁移过程太长,我关闭了大部分正在运行的进程并在dd
不卸载源分区的情况下使用(不推荐),然后用于fsck
纠正由于未卸载源而导致的任何错误。 - 解锁加密分区
cryptsetup luksOpen /dev/sdb2 crypteddisk
- 使用以下命令将源分区复制到目标(假设
/
是/dev/sda1
)dd if=/dev/sda1 of=/dev/mapper/crypteddisk bs=4096 status=progress
- 检查并修复新的加密分区
fsck /dev/mapper/crypteddisk
- 检查磁盘结构
fdisk -l
(不要注意 crypteddisk 大小,我们稍后会修复该问题)
- 概括:我们需要将我们的系统复制
分区UUID:
- 获取所有分区的所有 UUID 并保留该信息。
blkid /dev/sda blkid /dev/sda1 blkid /dev/sdb blkid /dev/sdb1 blkid /dev/sdb2 blkid /dev/mapper/crypteddisk
- 获取所有分区的所有 UUID 并保留该信息。
调整磁盘大小:
- 概括:在此步骤中,我们将扩大新加密分区的大小。
- 扩展加密分区
cryptsetup resize crypteddisk -v e2fsck -f /dev/mapper/crypteddisk resize2fs /dev/mapper/crypteddisk
备份MBR:
- 这不是必需的,但可能有用
dd if=/dev/sdb of=/backup/location/sdb.mbr count=1 dd if=/dev/sda of=/backup/location/sda.mbr count=1
- 这不是必需的,但可能有用
设置启动分区:
- 挂载新的启动分区并将
/boot
内容复制到其中。mkdir /tmp/boot mount /dev/sdb1 /tmp/boot cp -a /boot/* /tmp/boot/ ls -l /tmp/boot/* umount /tmp/boot rmdir /tmp/boot
- 删除旧
/boot
文件夹内容并将其保留为安装位置。mkdir /tmp/system mount /dev/mapper/crypteddisk /tmp/system rm -rf /tmp/system/boot/* ls -l /tmp/system/boot/* umount /tmp/system rmdir /tmp/system
- 挂载新的启动分区并将
Chroot 并设置新系统:
将新的加密磁盘加载为当前磁盘 (chroot) 并将其设置为应用新的系统配置、加密等(
/mnt
在继续之前还要确保为空)。mount /dev/mapper/crypteddisk /mnt/ mount /dev/sdb1 /mnt/boot for i in sys dev proc; do mount --bind /$i /mnt/$i; done chroot /mnt
从现在开始,我们将使用新系统(请记住,配置文件中的 sdb 需要被视为 sda)
更新
/etc/fstab
配置(确保使用 sdb1 uuids 而不是 sda1),以下是cat /etc/fstab
输出:# Main Partition ---------------------- # Entry for /dev/mapper/crypteddisk (sda2) : UUID=CHANGE-THIS-WITH-CRYPTEDDISK-UUID / ext4 noatime,acl 0 0 # Boot Partition ---------------------- # Entry for /dev/sda1 : #/dev/sda1 /boot ext4 defaults 1 2 UUID=CHANGE-THIS-WITH-THE-CURRENT-SDB1-UUID /boot ext4 noatime,acl 1 2 # Swap Partition/File ----------------- /swap/swapfile swap swap defaults 0 0 #
更新
/etc/crypttab
配置(如果crypttab
文件不存在,请使用-rw-r--r--
权限创建它),还要确保使用 sdb2 uuids 而不是 sda1 或 crypteddisk,以下是cat /etc/crypttab
输出:crypteddisk UUID=CHANGE-THIS-WITH-CURRENT-SDB2-UUID
更新grub配置
/etc/default/grub
,你只需要更改GRUB_ENABLE_CRYPTODISK
,GRUB_CMDLINE_LINUX
输出GRUB_DISABLE_OS_PROBER
如下cat /etc/default/grub
:GRUB_DISTRIBUTOR=My-Custom-Server... # .................................... Command line #GRUB_CMDLINE_LINUX=" root=/dev/sda1 disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet" GRUB_CMDLINE_LINUX=" root=/dev/mapper/crypteddisk luks_root=/dev/sda2 luks="root" disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet" # .................................... Options GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_GFXMODE=800x600 GRUB_GFXPAYLOAD_LINUX=keep GRUB_THEME=/boot/grub2/theme/theme.txt GRUB_BACKGROUND= # .................................... Enabling serial console... GRUB_TIMEOUT=30 GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1" # .................................... Enabling cryptsetup GRUB_ENABLE_CRYPTODISK="y" # .................................... Ignore other os GRUB_DISABLE_OS_PROBER="true" # ....................................
应用 grub 更改:
grub2-mkconfig -o /boot/grub2/grub.cfg
更新 init ram 磁盘并强制包含加密模块:
mkinitrd -d /dev/mapper/crypteddisk -f "dm luks"
更新 MBR 并在新磁盘上重新安装 grub 以使其可启动
grub2-install /dev/sdb
退出 chroot 并卸载所有内容
exit cd / for i in sys dev proc; do umount /mnt/$i; done unmount /mnt/boot unmount /mnt
如果你在卸载分区时遇到任何问题,请使用
-l
以下选项umount -l /mnt/sys
施展魔法: