如何加密虚拟机的磁盘(gcloud、cryptsetup):

如何加密虚拟机的磁盘(gcloud、cryptsetup):

Google云服务(计算实例)默认为磁盘存储提供加密,客户可以通过该功能提供自己的密钥客户提供的加密(详细的这里还)。

我们如何应用磁盘加密密码设置不向谷歌提供加密密钥?

答案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
      
  • 串行控制台:

    • 概括:启用串口连接,并通过串口连接到机器(文档1,文档2,文档3
    • 在下面元数据添加serial-port-enableTRUE(并在实例选项上启用串行端口)
    • ssh使用/连接到串行端口gcloud;gcloud 示例:
      gcloud compute --project=prj-name connect-to-serial-port vm-name --zone=us-central2-b
      
  • 更新 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)
      
    • 将引导分区的文件系统设置为 ext4mkfs.ext4 /dev/sdb1
    • 擦除第二个分区以提高安全性
      dd if=/dev/urandom of=/dev/sdb2 bs=4096 status=progress
      
    • 设置加密为sdb2with
      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
    • 将加密映射分区设置​​为 ext4mkfs.ext4 /dev/mapper/crypteddisk
    • 关闭加密分区cryptsetup close /dev/mapper/crypteddisk
  • 克隆源盘:

    • 概括:我们需要将我们的系统复制/到新的加密分区/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
      
  • 调整磁盘大小:

    • 概括:在此步骤中,我们将扩大新加密分区的大小。
    • 扩展加密分区
      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_CRYPTODISKGRUB_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

  • 施展魔法:

    • 关闭临时虚拟机;分离所有磁盘;将加密磁盘附加为启动磁盘。
    • 打开临时虚拟机;使用串行控制台连接到它,瞧! (系统会要求您提供密码以在启动时解锁加密分区)。
    • 测试是否一切正常,然后在生产虚拟机上使用新的加密磁盘,并删除临时复制磁盘和临时虚拟机。
    • 还提供其他信息这里这里。享受 ;)

相关内容