安装完成后启用磁盘加密。

我正在运行13.10 Saucy。如果在安装过程中没有启用磁盘加密,有没有办法事后启用它?

我找到了this,它说加密必须在安装时进行,但它也提到了Fedora。如果可以从活动磁盘中进行操作,我可以轻松地引导进去。


全盘加密还是只加密你的/home文件夹? - Joren
1满盘。 (跟进问题:相比于只有/home,满盘的优缺点是什么? :)) - Isaac Dontje Lindell
1/home磁盘加密不包括交换空间。如果只有/home被加密,敏感数据可能会被写入未加密的交换空间。这是可以恢复的。Ubuntu在登录时自动解密/home。全盘加密需要在启动和登录时输入密码。调整加密驱动器的大小是一个费时的过程。如果您有一个外部驱动器,在13.10 Saucy Salamander中安装后进行加密很容易:备份您的数据,从仪表板启动“磁盘”,选择您的外部驱动器,点击齿轮图标,选择加密,解锁您新加密的驱动器,将数据复制回去。 - user75798
6个回答


2如果您在家目录中有一个加密的Samba共享,会发生什么情况?网络用户是否无法再读取文件,还是通过共享解密了文件? - Rush Frisby

跟进问题:全盘加密和仅加密/home目录的优缺点是什么?
在/home目录中进行的加密是使用一个名为ecryptfs的用户空间文件系统完成的。它非常完善,并且与默认的身份验证系统紧密结合,因此您不会遇到任何可用性问题:当您登录帐户(无论是从远程shell还是从默认的登录界面)时,您的密码将用于解封一个安全密钥,然后该密钥用于实时加密/解密您的家目录中的文件(挂载的文件系统将直接位于/home/用户名下)。当您退出登录时,/home/用户名将被卸载,系统中只剩下加密的文件可见(通常位于/home/.ecryptfs/用户名/.Private/)。由于文件名也被加密,它们看起来像一堆乱码/随机文件。唯一的信息泄漏是:文件大小、时间戳和文件数量(全盘加密也会隐藏这些信息)。
如果您的系统将在多个用户之间共享,即使您决定添加完整磁盘加密,这也是一个非常好的功能:完整磁盘加密在机器运行时处于关闭状态,而家庭(ecryptfs)加密只要您注销了就会打开。
因此,完整磁盘加密和家庭加密并不一定是互斥的。
以下是根据不同安全需求可能的设置列表:
  • 仅全盘加密:如果你是唯一使用计算机的人,并且你的机器可以处理全盘加密的开销(所有现代台式机都可以做到这一点,但是上网本和旧笔记本电脑就不行),那么你可以使用全盘加密,并将主目录放在与操作系统(/)相同的分区中。
  • 全盘加密 主目录 ECRYPTFS 加密:如果你担心在计算机开启时有人读取你的私人数据,或者你与其他用户共享计算机,那么你可以将主目录放在与 / 不同的分区中,并使用 ecryptfs 以及全盘加密(即通过 LUKS 对 / 进行加密)。
  • 仅主目录 ECRYPTFS 加密:如果你不太担心在你离开时有人篡改你的系统,但仍然希望保护你的私人数据安全,那么可以跳过全盘加密,只使用 ecryptfs(对主目录进行加密)。这种情况的额外好处是,即使在安装 Ubuntu 后,也很容易进行设置,只需使用 ecryptfs-migrate-home 命令即可。 此外,在几个版本之前,这也是默认的 Ubuntu 设置,后来增加了全盘加密的可能性。由于大多数现代台式机都可以轻松处理全盘加密,并且它增加了一层防止离线代码注入的安全性,因此将全盘加密添加到安装程序中。请注意,对于大多数用户来说,只使用 ecryptfs 加密主目录已经足够满足他们的需求:保护他们的朋友和普通的笔记本电脑小偷无法访问他们的私人数据。此外,如果你成为一个有着正确手段的组织的特定目标,那么无论是全盘加密还是仅主目录加密都不会有太大区别,除非你还采取了很多其他的偏执行为(比如:将内核保存在随身携带的独立闪存驱动器中;不断检查硬件篡改/键盘记录器等)。
如果我在安装过程中没有启用磁盘加密,是否有办法事后启用它?
是的,如果您当前正在使用LVM并且系统上有足够的空间将所有未加密的系统文件复制到加密的LUKS分区中,那么这将更容易。我暂时不会详细介绍,因为我不知道您是否正在使用LVM,而且如果您不想现在只使用ecrypfs并跳过完整磁盘加密的麻烦,直到下一次全新安装。

2唯一的信息泄漏是...你忽略了一个重要的地方:/tmp。作为用户运行的应用程序可能会将临时文件放在那里(例如,在您编辑文档时的副本),即使您已经注销并关闭计算机,这些文件仍然可见。另一个可能的泄漏是:如果您将计算机休眠而不是完全关机,我想坚决的攻击者可能会访问到您的文件。 - Arthur Tacca

由于这仍然是谷歌上的首要结果,我想用一些新信息来更新它。
正如用户Frederick Nord在以下链接中提到的: 是否有办法在安装后进行全盘加密? 经过进一步研究,我发现了一个名为luksipc(原地加密)的工具,并找到了最新的文档以及该工具作者的警告

luksipc是在dm-crypt/cryptsetup/LUKS等方面没有任何替代品之前创建的。但现在情况已经不同了。因此,我建议切换到cryptsetup-reencrypt,这是一个得到适当维护和测试的上游工具,即使LUKS头部的格式发生变化(据我所知,这至少发生过两次),也不会导致luksipc灾难性地失败,即在最坏的情况下破坏所有数据。

所以,cryptsetup-reencrypt似乎是推荐的方法。
高级概述:
  • 所建议的工具只能在未使用的分区上工作,因此请使用live cd/usb
  • 调整分区,以便在正确位置有足够的空间放置LUKS头部
  • 使用cryptsetup-reencrypt对分区进行加密
  • 对每个分区(除了引导分区)重复以上步骤
  • 简短指南取自Ubuntu文档

       Add LUKS encryption to not yet encrypted device 
    
              First, be sure you have space added to disk.  Or alternatively shrink filesystem in
              advance.
              Here we need 4096 512-bytes sectors (enough for 2x128 bit key).
              fdisk -u /dev/sdb # move sdb1 partition end + 4096 sectors
    
              cryptsetup-reencrypt /dev/sdb1 --new --reduce-device-size 4096
    

    Arch Wiki - Encrypt an unencrypted filesystem中获取的详细指南
    umount /mnt # As mentioned this only works on partitions/devices which aren't mounted. You can skip this if you used a live cd and didn't mount this partition yet - but be sure to check
    e2fsck -f /dev/sdaX # check that the file system is ok -f == force validation even if it looks ok
    resize2fs -M /dev/sdaX # Shrink the filesystem to the minimum size.
    cryptsetup-reencrypt /dev/sdaX --new  --reduce-device-size 16M # Encrypt the unencrypted partition
    cryptsetup open /dev/sdaX recrypt # Open the encrypted partition so we can give it back the disk space we removed by using the -M option on resize2fs
    resize2fs /dev/mapper/recrypt # enlarge partition again
    mount /dev/mapper/recrypt /mnt # Mount if you want to access data
    

    问题:为什么要缩小到最小尺寸?
    答案:假设-这样做是因为LUKS头的大小可能会在将来发生变化,所以这些步骤是通用的,不会过时。头部大小从LUKSv1 = 2MB变为Luksv2 = 16MB。
    故障排除指南- /boot被加密,无法启动
    更新于2020年12月
    对我来说,发生的情况是我只有一个包含/boot的分区。 之后,我无法再启动系统。如果您遇到相同的问题,本指南可能有助于恢复正常工作的系统。
    高级概述
    确保您具备grub和initramfs中解密所需的软件。
    了解如何引导
    Grub
    1. 启动Ubuntu的“live cd”
    2. 解密分区
    3. 切换到已解密系统的chroot环境(如果您不知道如何操作,可以参考此链接:https://superuser.com/questions/111152/whats-the-proper-way-to-prepare-chroot-to-recover-a-broken-linux-installation
    4. 在chroot环境中进行操作
    root@ubuntu:~# echo "GRUB_ENABLE_CRYPTODISK=y" >>/etc/default/grub
    root@ubuntu:~# update-grub
    root@ubuntu:~# grub-install /dev/sda???
    
    1. 留在 chroot 中!

    Initramfs

    1. 创建一个 initramfs 钩子脚本,通过 copy-exec 复制 cryptestup
    2. update-initramfs -u -k all

    如何引导

    1. 您会得到一个空的 grub 菜单,按下 "c" 进入命令行。
    2. 执行以下操作:
    insmod luks # load kernel module
    cryptomount hd0,gpt6 # decrypt your encrypted partition
    configfile (crypto0)/boot/grub/grub.cfg # tell grub the path to the now unecrypted config file
    

    现在你应该看到带有适当启动项的 grub 菜单。 选择“Ubuntu”后,你应该进入 initramfs。 现在执行以下操作。
    cryptsetup luksOpen /dev/sda6 system
    exit
    

    替代方案

    也许考虑使用下面的指南。它似乎能解决上述提到的问题。虽然我还没有尝试过,所以不能确定它是否有效。但是可能值得研究一下。 https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html

    P.S 故障排除指南是根据记忆编写的,所以可能有一些遗漏的部分。但是我还是想写下来,因为它可能仍然对某些人有帮助。然而,如果你发现有遗漏/不准确的地方,请在评论中告诉我,这样我可以更新指南。谢谢。


    1工具已经集成到 cryptsetup v2.5(于2022年中发布),现在被称为命令:cryptsetup reencrypt(注意缺少的破折号)。发布说明请参考:https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/v2.5/v2.5.0-ReleaseNotes - Thomas

    好的,你可以备份所有重要目录和已安装软件。确保你的13.10版本已完全更新以避免版本冲突。通常需要备份的内容包括:

    之后,你可以重新安装加密系统。将备份移动到加密系统并安装所有来自先前版本的软件。

    确保在恢复备份时不要覆盖与加密相关的重要文件(例如`/etc/fstab`、`/etc/cryptab`、一些与grub相关的内容以及`/boot`目录中的一些文件),请注意。

    从一个工作的Ubuntu 16.04开始,我成功地进行了后安装根分区加密,根分区中包含除了/boot之外的所有内容。我将/boot放在一个单独的可移动的USB设备上。值得注意的是,在升级到Ubuntu 18之前,我就已经完成了这个操作,而且升级过程在加密磁盘版本上也很顺利。

    加密操作并不是“原地”进行的,这对我来说没关系,因为在新的设置工作正常之前,我不想覆盖现有的工作版本。

    执行正确的步骤非常简单和快速。(尽管找出正确的步骤非常耗时,因为我跟随了一些错误的线索。)

    大纲

    1. 创建一个带有持久性的活动Linux USB盘 - 这样很方便。使用该USB盘启动。
    2. 在空分区上创建一个luks加密的卷组。(在我的情况下,它是在与原始Linux相同的磁盘上,但也可以是另一个磁盘。)在该加密分区上创建/(根目录)和交换逻辑卷。对于复制的Linux来说,这些将作为虚拟分区。
    3. 将文件从旧的根目录复制到新的根目录。
    4. 设置并分区另一个USB设备作为可移动的引导盘。
    5. 在新的根目录中设置一些文件,进行一些操作,并进入新的根目录的chroot环境,然后从chroot的新根目录环境中将grub安装到引导盘上。

    详细信息

    1 - 使用带有持久性的活动Linux USB盘启动。

    使用unetbootin在USB上安装了Ubuntu 16。GUI允许指定“持久性”,但还需要另一步才能使持久性起作用 - 修改/boot/grub/grub.cfg,添加--- persistent,如下所示:

    menuentry "Try Ubuntu without installing" {
        set gfxpayload=keep
        linux   /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash --- persistent
        initrd  /casper/initrd
    }
    

    使用live USB启动

    2- 在空分区上创建luks加密卷组。在该加密分区上创建/(根)和交换逻辑卷。

    假设未使用的分区被加密为/dev/nvme0n1p4

    可选地,如果您要隐藏加密和格式化之前的分区上的旧数据,则可以随机擦除该分区。 请参见此处的讨论

    dd if=/dev/urandom of=/dev/nvme0n1p4 bs=4096 status=progress
    

    设置加密。
    cryptsetup -y -v luksFormat /dev/nvme0n1p4
    

    你将被要求设置一个密码。
    cryptsetup luksOpen /dev/nvme0n1p4 crypt1
    

    您将被要求输入密码。请注意,crypt1 是一个任意由用户决定的名称。现在创建卷并进行格式化。
    pvcreate /dev/mapper/crypt1
    vgcreate crypt1-vg /dev/mapper/crypt1
    
    lvcreate -L 8G crypt1-vg -n swap
    mkswap /dev/crypt1-vg/swap
    
    lvcreate -l 100%FREE crypt1-vg -n root
    mkfs.ext4 /dev/crypt1-vg/root
    

    使用这些工具来查看卷并理解层次结构。
    pvscan
    vgscan
    lvscan
    ls -l /dev/mapper
    ls -l /dev/crypt1
    

    3- 将文件从旧根目录复制到新根目录
    mkdir /tmp/old-root 
    mount /dev/ubuntu-vg/root /tmp/old-root/
    mkdir /tmp/new-root
    mount /dev/crypt1-vg/root /tmp/new-root/
    cp -a /tmp/old-root/. /tmp/new-root/
    
    umount /tmp/old-root
    umount /tmp/new-root
    

    cp -a ... 在归档模式下进行复制,保留所有文件模式和标志。

    4- 设置并分区另一个USB设备作为可移动启动盘。

    我使用gparted来完成这个任务。设置两个分区。第一个分区是vfat,第二个分区是ext2。每个分区大小为512 MB,你可能可以用更小的空间。假设设备为/dev/sdf

    # The first partition: (will be /dev/sdf1)
    Free space preceding (leave default value)
    New size 512 MiB
    Free space following (leave default value)
    Create as: Primary Partition
    Partition Name: (leave)
    File System: fat32
    Label: (leave)
    
    # The second partition: (will be /dev/sdf2)
    Free space preceding (leave default value)
    New size 512 MiB
    Free space following (leave default value)
    Create as: Primary Partition
    Partition Name: (leave)
    File System: ext4
    Label: (leave) 
    

    5- 在新的根目录中设置一些文件,进行一些魔法操作,然后进入新的根目录并从其中安装 grub 到引导磁盘。
    找到一些 UUID 以备后用。请注意以下命令的输出:
    blkid /dev/sdf1
    blkid /dev/sdf2
    blkid /dev/nvme0n1p4
    

    挂载根分区和引导分区
    sudo mount /dev/mapper/crypt1--vg-root /mnt
    sudo mount /dev/sdf2 /mnt/boot
    sudo mount /dev/sdf1 /mnt/boot/efi
    

    设置文件/mnt/etc/fstab
    /dev/mapper/crypt1--vg-root /               ext4    errors=remount-ro 0       1
    /dev/mapper/crypt1--vg-swap none    swap    sw              0       0
    UUID=[uuid of /dev/sdf2] /boot           ext2    defaults        0       2
    UUID=[uuid of /dev/sdf1]  /boot/efi       vfat    umask=0077      0       1
    

    其中"[uuid of ...]"只是一个字母-数字-连字符的组合。

    创建文件/mnt/etc/cryptab

    # <target name> <source device>     <key file>  <options>
    crypt1 UUID=[uuid of /dev/nvme0n1p4] none luks,discard,lvm=crypt1--vg-root
    

    进入根目录环境需要一些魔法:

    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
    chroot /mnt
    

    现在使用grub设置启动USB盘:
    apt install --reinstall grub-efi-amd64
    grub-install --efi-directory=/boot/efi --boot-directory=/boot --removable
    update-initramfs -k all -c
    update-grub
    

    现在你应该能够重新启动并使用新创建的USB启动盘启动了。
    故障排除-
    (a) 在执行apt install --reinstall grub-efi-amd64命令时,网络必须连接。如果网络已连接但DNS失败,请尝试
    echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
    

    (b)在调用initramfs之前,原始Linux中使用的当前vmlinuz...文件必须存在于新的根目录中。如果不存在,请找到它并放置在那里。
    (c)grub-install命令默认会搜索所有其他可找到的Linux磁盘,即使它们没有被mount,并将它们放入新的启动USB的引导菜单中。通常这是不希望的,可以通过在/boot/default/grub.cfg中添加以下行来避免:
    GRUB_DISABLE_OS_PROBER=true
    

    注意: 可以将包含加密密钥的文本文件添加到可移动引导USB中。


    1在第5节,我猜应该是/mnt/etc/crypttab(双t)。 - rvf
    我花了整整一天的时间来尝试让这个工作起来,而这是唯一一个易于跟随并真正满足我的需求的指南。非常感谢! 如果有人处于相同的情况,我在我的系统(Pop OS 22.04 LTS)上需要做一些不同的事情:
    1. 我为/home/tmp创建了几个更多的逻辑卷(需要在几个地方进行更改以确保所有卷都被挂载)
    2. 在fstab中,我只有一个引导加载程序的条目位于/boot/efi,因为我不使用USB驱动器进行引导,而我的引导加载程序已经安装在一个单独的分区中。
    - EgoNecoTu
    1. 对于最后一部分,我使用了System76官方的支持指南来修复引导加载程序,因为Pop OS使用systemd-boot而不是grub。 相关命令在systemmd-boot中。一旦你达到@Craig挂载所有目录以切换根环境的步骤,就可以使用这些命令。
    之后,你应该完成了,希望一切都正常工作。此外,@rvf是正确的,在/mnt/etc/crypttab中应该是双t。
    - EgoNecoTu

    简单回答:不。
    复杂回答:
    对磁盘或分区进行加密将会擦除该磁盘或分区上的所有内容,因此在加密磁盘之前,您还应该删除磁盘上的内容。开始之前,您应该进行适当的数据备份。显然,这意味着您应该重新安装系统以使用全盘加密,没有其他方式可行。这是因为会在整个磁盘上写入随机数据,以增加数据恢复的难度。
    但是,现在不需要加密您的根分区了。请记住,如果出现问题,您将无法进入系统,也无法恢复数据。您应该考虑只加密个人信息。
    请参阅相关问题如何在安装后加密整个磁盘?

    系统中没有任何恢复数据的可能。只要有加密密钥,就可以使用活动介质来恢复数据。 - con-f-use
    @con-f-use 请注意,这里有一个条件句“如果出现严重问题”,意思是如果加密的驱动器/分区发生了什么非常糟糕的情况。 - Braiam
    好的,如果你是挑剔的话,一个人应该还要维护加密磁盘上的最新备份LUKS头部。但我会将其包含在"加密密钥"中。除此之外,从数据恢复的角度来看,完全加密并没有任何危害。然而,你可以知道其中的Ubuntu版本、安装的程序等信息,这为不完全加密的磁盘提供了可能的攻击途径。此外,固态硬盘通常也会如此。所以对于偏执狂来说,仍然无法避免全盘加密。 - con-f-use
    但是,现在你不需要加密你的根分区。请代表你自己说话,我完全不同意。"加密磁盘或分区将擦除该磁盘或分区上的所有内容,因此要加密磁盘,您还应该删除磁盘上的内容。"再次表示不同意。Truecrypt是在Windows上使用现有磁盘进行FDE的很好的例子。事实上,它是安装的事实标准-未加密,一旦完成,再加密。这并不改变答案,即目前在Ubuntu上无法实现,但是你的陈述非常绝对和不正确。 - Cookie
    @Cookie,为什么要加密一个分区,而这个分区里面有一些以后可以安装的东西呢?(请注意,我说的是普通用户系统,与可能在其中安装了东西的企业服务器无关)2)你所说的是TrueCrypt的一个功能,只适用于截至目前的Windows版本。如果你找不到一个能够在安装后加密分区的Linux加密系统,那么我的陈述是正确的,因为现在还不可能实现。 - Braiam
    任何考虑硬盘加密的人都是与众不同的。而且家目录加密具有在线文章中讨论的所有缺点。就我个人而言,我曾在家外共享过数据。然后你还有交换空间和临时文件没有加密的问题。可以假设你非常小心地加密每个可能保存敏感数据、备份、交换文件、休眠文件、临时文件等的目录,但鉴于全盘加密的便利性和几乎不可能遗漏任何东西,对我来说,全盘加密是最好的选择。 - Cookie