Ubuntu全盘加密,带有加密的/ boot


15

我正在尝试设置具有单独/boot分区的完整加密磁盘,但遇到了一些麻烦。

我将写下在Ubuntu 15.04 Live DVD会话中一直遵循的过程。

  • 用“随机数据”填充磁盘

    sudo dd if=/dev/urandom of=/dev/sda1 bs=4096   #ok
    
  • 创建分区(使用gparted)

    1. 创建分区表-gpt 2。
      • / dev / sda1 ext2 1.5GB#启动
      • / dev / sda2 linux-swap 4GB #swap
      • / dev / sda3 ext4 15 GB #root
      • / dev / sda4 ext4 FREESPACE #home
  • 加密卷

    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda1
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda2
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda3
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 5000 /dev/sda4
    
  • 打开加密卷

    cryptsetup luksOpen /dev/sda1 boot
    cryptsetup luksOpen /dev/sda2 swap
    cryptsetup luksOpen /dev/sda3 root
    cryptsetup luksOpen /dev/sda4 home
    
  • 格式

    mkfs.ext2 /dev/mapper/boot
    mkswap /dev/mapper/swap
    mkfs.ext4 /dev/mapper/root
    mkfs.ext2 /dev/mapper/home
    
  • 安装(使用普遍性)

    • / dev / sda上的引导程序
    • / dev / sda1-用作ext2-挂载点/ boot
    • / dev / sda2-用作ext2-挂载点/ boot
    • / dev / sda3-用作ext2-挂载点/ boot
    • / dev / sda4-用作ext2-挂载点/ boot

    最后,安装程序会警告grub-install失败(因为引导卷已加密),因此请选择“继续而不使用引导程序”。

  • 清理启动卷

    mkfs.ext2 /dev/mapper/boot
    
  • 挂载量

    mkdir /mnt/root
    mount /dev/mapper/root /mnt/root
    mount /dev/mapper/boot /mnt/root/boot
    
  • 更新fstab和crypttab

    sudo blkid
    
    [/dev/sr0: UUID="2015-10-21-16-17-40-00" LABEL="Ubuntu 15.10 amd64"
               TYPE="iso9660" PTUUID="429817b4" PTTYPE="dos"
    /dev/sda1: UUID="...#1" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda2: UUID="...#2" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda3: UUID="...#3" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda4: UUID="...#4" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/mapper/boot: UUID="..." TYPE="ext2"
    /dev/mapper/swap: UUID="..." TYPE="swap"
    /dev/mapper/root: UUID="..." TYPE="ext4"
    /dev/mapper/home: UUID="..." TYPE="ext4"]
    
  • fstab

    #<file system>   <mount point>   <type>   <options>           <dump>   <pass>
    UUID=#1          /boot           ext2     defaults            0        2
    UUID=#2          none            swap     sw                  0        0
    UUID=#3          /               ext4     errors=remount-ro   0        1
    UUID=#4          /home           ext4     defaults            0        2
    
  • 加密表

    boot   UUID=#1   luks,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool, time=3000
    swap   UUID=#2   luks,swap,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool,time=3000
    root   UUID=#3   luks,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool,time=3000
    home   UUID=#4    luks,cipher=twofish-xts-plain64,size=512,
                      hash=whirlpool,time=5000
    
  • 更新initramfs映像

    cd /mnt
    sudo chroot root
    mount -t proc proc /proc
    mount -t sysfs sys /sys
    mount -t devpts devpts /dev/pts
    update-initramfs -u                      #ok
    
  • 配置引导程序(/etc/default/grub

    GRUB_ENABLE_CRYPTODISK=y
    GRUB_PRELOAD_MODULES="luks cryptodisk"
    GRUB_CMDLINE_LINUX="cryptdevice=UUID#3:root root=/dev/mapper/root resume=/dev/mapper/swap 
                        crypto=whirlpool:twofish-xts-plain64:512:0:"
    
  • 创建配置文件

    $ grub-mkconfig -o /boot/grub/grub.cfg
    [/usr/sbin/grub-probe: error: failed to get canonical path of `/dev/mapper/root'.]
    
  • 在外面尝试

    $ exit
    $ grub-mkconfig -o /boot/grub/grub.cfg
    [/usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.]
    

在此之前,我是否犯了任何错误?如何继续正确配置和安装grub?


让您将Q移至“正确的”网站后,我感到很难过,没有人提供帮助。我尚未在Ubuntu中完成此级别的工作。但是我确实在Google上查找了grub+您的标题。我想您在pavelkogan.com/2014/05/23/luks-full-disk-encryption(这是该主题上的第一个Google搜索)中找到了加密过程。如果没有,也许会有所帮助。好问题!还有祝你好运!
Shellter '16

几件事情:1.您提到/boot了一切的安装点。我希望那是一个错字。2. /devchroot 时没有挂载,但是挂载了devpts。Oo
Muru

另一个错误是您似乎在crypttab和fstab中使用了相同的UUID。fstab实际上应该使用/ dev / mapper /驱动器的UUID。
Aleksandr Dubinsky

1
查看Ubuntu社区成员的指南。我用过它,对我来说效果很好。
kapad

Answers:


13

您犯了一些错误,但主要问题在于普遍性和grub。基本上,当您设置/为加密分区并且不为创建单独的分区时/boot,grub会显示以下错误消息:

我知道/boot是加密的。您需要设置GRUB_ENABLE_CRYPTODISK=y/etc/default/grub。我不会为您这样做,所以我将失败,您的安装将停止。

过程概述

  • 我们使用EFI模式。
  • 我们使用标准安装程序将其安装到未加密的/boot分区和加密的btrfs /
  • 安装程序完成后,我们chroot进行一些重要的配置更改,然后将grub重新安装到EFI System Partition并重新创建initrd。

详细步骤

  • 从Ubuntu 16.04安装磁盘引导(已通过Xubuntu测试)。
  • 连接到Internet并运行sudo apt update && sudo apt upgrade以更新安装程序组件
  • 使用fdiskgparted或其他工具创建3个分区:
    • GPT分区表
    • 我们将用于EFI系统分区的200MB分区
    • 一个数千兆字节的分区,我们最终将其用作加密的交换分区,但它将用作我们的临时未加密分区 /boot
    • 使用剩余空间的加密分区
  • 准备加密的分区

    sudo cryptsetup luksFormat /dev/sda3
    sudo cryptsetup luksOpen --allow-discards /dev/sda3 sda3_crypt
    sudo mkfs.btrfs /dev/mapper/sda3_crypt
    
  • 安装Ubuntu

    • 当询问安装类型时,请选择“其他”。
    • 配置/dev/sda1EFI System Partition
    • 配置/dev/sda2为ext2,格式化,安装点为/boot
    • /dev/mapper/sda3_crypt使用挂载点配置为btrfs/
    • 继续安装。
    • 完成后,选择保留在实时系统中(不重新启动)。
  • 复制内容/boot并执行chroot

    sudo mount -o subvol=@ /dev/mapper/sda3_crypt /target
    sudo mount /dev/sda2 /mnt
    # (Watch those trailing slashes! rsync is very sensitive to them.)
    sudo rsync -aXAH /mnt/ /target/boot/
    sudo mount /dev/sda1 /target/boot/efi
    sudo mount --bind /dev /target/dev
    sudo mount --bind /proc /target/proc
    sudo mount --bind /sys /target/sys
    sudo chroot /target
    
  • (现在,一切都chroot在您的新系统中发生。)

  • 将行添加到 /etc/default/grub

    GRUB_ENABLE_CRYPTODISK=y
    
  • 在中添加行/etc/crypttab。您将需要先运行sudo blkid以找到/dev/sda3(NOT /dev/mapper/sda3_crypt)的UUID 。

    sda3_crypt UUID=<UUID of /dev/sda3> none luks,discard
    
  • 编辑/etc/fstab并删除的行/boot。其他输入正确。

  • 将grub安装到EFI系统分区,生成一个新的grub.cfg,并准备initrd。

    sudo grub-install --target=x86_64-efi --efi-directory /boot/efi --bootloader=ubuntu --boot-directory=/boot/efi/EFI/ubuntu --recheck
    sudo grub-mkconfig -o /boot/efi/EFI/ubuntu/grub/grub.cfg
    sudo update-initramfs -c -k all
    
  • 可选的双重检查:仔细检查/boot/efi/EFI/ubuntu/grub/grub.cfg包含以下行的行:insmod luks,,cryptomount -u <UUID>正确的引导项等。并再次检查initrd包含cryptsetup二进制文件。如果这些东西丢失了,那是因为grub-mkconfig和/或update-initrd无法弄清楚您在fstab中安装或指定的卷与crypttab中的加密卷之间的关系。(它们有很多神奇的自动配置功能。)如果您偏离本指南,例如,使用ZFS或尝试对sda3_crypt进行分区,则可能会发生这种情况。

  • (如果使用ZFS代替btrfs) grub-mkconfig和update-initrd将无法识别ZFS。的解决方法涉及(chroot环境中之前,平头mkconfig /更新的initrd)编辑/usr/sbin/grub-mkconfig以添加|| true到线139(其与开始GRUB_DEVICE=),加入GRUB_DEVICE="/dev/mapper/sda3_crypt"/etc/default/grub,创建文件/usr/share/initramfs-tools/conf-hooks.d/forcecryptsetup与内容export CRYPTSETUP=y和文件/etc/initramfs-tools/conf.d/cryptroot与内容target=sda3_crypt,source=UUID=<UUID of sda3>,key=none,discard。所有这些都是在不加密ZFS分区时要采取的步骤的补充(例如,在实时系统和chroot中都安装zfs userspace utils,并删除挂载/在fstab中的行)。

  • 退出chroot并重新引导到新系统

    exit
    sudo umount /target/boot/efi
    sudo umount /target/dev
    sudo umount /target/proc
    sudo umount /target/sys
    sudo umount /target
    sudo reboot
    
  • 您应该看到grub询问您的密码。然后,您将获得启动菜单。选择Ubuntu后,将再次要求您输入密码。然后,您将进入系统。阅读更多有关Ubuntu如何使用BTRFS的信息

  • TODO:创建加密的交换(提示:它涉及编辑crypttab,fstab并重新运行update-initrd)。

  • 待办事项:保存您的密码,因此您只需要在grub中输入一次即可。这是详细这里

升级版

  • 每次安装新内核时,都应运行custom grub-mkconfig命令。
  • 每次更新grub时,都应运行custom grub-install命令。

其他注意事项

  • 试图创建一个加密的卷并将其分区以创建交换分区(可能还有其他分区)是很诱人的,但这是行不通的。grub-mkconfig和update-initrd都会发生异常。但是,我还没有尝试过LVM。
  • 在btrfs之上使用交换文件可能很吸引人,但是由于性能原因,这可能不是一个好主意。

只是澄清什么,我想你已经知道(根据您的评论):fstabcrypttab实际上并不在该题正确。crypttab应该指向uuid原始/dev/sdxY设备;fstab应该指向处打开的crypt设备/dev/mapper/label
亨迪

感谢您做出此回答,它帮助我进行了设置。
x13

实际上,我不考虑任何真正的FDE,因为有分区信息泄漏。真正的FDE要求所有扇区都是加密数据(除了开头的LUKS标头,尽管从技术上讲,使用分离的标头并不需要)。我在LUKS中使用LVM进行FDE,所以它肯定可以工作,并且如果以后需要更改分区/卷大小,它会更好。这是有关在12.04中执行此操作的旧博客文章,但应该在更高版本中起作用。
crass

另外,在BTRFS上使用swapfile 绝对不是一个好主意 ……
crass

在您的grub-install指令中,您有一个--bootloader=ubuntu参数。我似乎在UbuntuGNU的手册中都找不到这种说法。您能否澄清它的作用或在何处记录?
塞缪尔·哈默
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.