问题

问题

问题

什么是 ecryptfs 的最新替代品,同时允许用户通过 SSH 登录而无需“主”全盘加密(= FDE)密码?

语境

很久以前,Ubuntu 在安装程序中提供了 ecryptfs 支持的加密主目录。这很好,让我可以设置服务器,我可以通过电源按钮或 LAN 唤醒来启动服务器,并通过 SSH 连接到机器。

几年前有人告诉我,ecryptfs 不再被认为是安全的或最先进的。尽管我可以看到ecryptfs-实用程序仍然可用。所以理论上我可以继续像以前一样设置服务器,直到遇到严重问题。

我听说过系统主目录,但到目前为止我还没有听到任何确认消息表明这是 Ubuntu 开发人员和维护人员推荐或接受的解决方案。

我也一直在使用Dm-crypt/Mounting_at_login在切换为使用相应 Linux 发行版提供的典型加密分区布局之前。

如果您对我的问题以及过去的运作方式感到困惑:

ls -1a /home/
.ecryptfs
my_user

ls -1a /home/.ecryptfs/
my_user

ls -1a /home/.ecryptfs/my_user/
.ecryptfs
.Private
.ssh

我进行了一些额外的配置,将用户的加密文件存储在 下/home/.ecryptfs/my_user/.Private/home/.ecryptfs/my_user/.ecryptfs包含一些脚本和元数据。/home/.ecryptfs/my_user/.ssh/authorized_keys包含未加密的内容,最后我创建了一个从/home/.ecryptfs/my_user/.ssh/authorized_keys到 的符号链接/home/my_user/.ssh/authorized_keys。瞧,远程 SSH 登录无需提供 FDE 密码。其余部分由 ecryptfs 处理。因此,如果我可以使用最先进的技术获得类似的设置,并且在不使用 ecryptfs 时不引用它,那就太棒了。

如果目前正在进行的某些工作可以使这变得更容易,我可以等到 24.04 LTS 发布。

关于安全问题:此类服务器位置固定,不会像笔记本电脑那样四处移动。房间门有电子锁(和 API 日志)保护。

要求

  • 至少服务器上的用户数据(主目录)应该采用最先进的强加密技术进行加密。
  • 应该可以使用 SSH 登录机器
  • 服务器启动过程中不应出现解锁文件系统的密码提示中断
    • 从技术上讲,我可以使用 iKVM,但在这种情况下我宁愿不这样做
    • 只要在开机自检 (POST) 和通过启动 SSHd 完成启动过程之间需要亲自操作服务器,按下电源按钮或发送 LAN 唤醒数据包就足够了。

正如您所见,我尝试寻找不同的解决方案,但这似乎是一个非常具体的用例,曾经是常识,但似乎已被 SEO、LLM 和群体思维所掩盖。


编辑 2023-10-19

方法 1

“TPM 支持的全盘加密”

哦,这确实是 Ubuntu 中的新功能,我没有关注这个消息。https://ubuntu.com/blog/tpm-backed-full-disk-encryption-is-coming-to-ubuntu

最大的缺点:远程访问的设置非常困难。

请告诉我有关这个噩梦的更多信息。

这台机器的主板有一个 TPM 接头,而且模块价格便宜。尽管我过去一直是 TPM 的强烈反对者,但我还是会考虑采用这种解决方案。

在我的设置中,根卷和主卷上不应存储任何有价值的数据。

方法 2 和方法 3

好的,我的主目录已加密,我需要做什么才能使用 SSH 远程登录?我发现一些文章和讨论建议扩展 SSHd 的配置以在不同的地方查找authorized_keys。使用最新版本的 SSH,应该可以实现以下配置片段:

cat /etc/ssh/ssh_config.d/authorized_keys
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /home/.ssh/%u/authorized_keys

我还没有测试过这是否有效。

/home/.ssh/%u/authorized_keys如果我们想与上面的例子保持一致,则应将其转换为/home/.ssh/my_user/authorized_keys。它类似于使用的惯例ecryptfs,我不知道为什么我没有早点想到它。

或者你打算做些不同的事情?如何继续?使用 SSH 密钥登录不会自动挂载卷,是吗?对于使用什么脚本,或者可能是 systemd 功能,是否有一些共识,或者每个人都自己实现一个脚本(请不要 :-( )?

编辑 2024-05-08

正如我在下面的评论中所写,我决定使用 TPM 支持的全盘加密而不是未加密的根卷,并配置加密的主目录,以便可以在通过 SSH 登录系统时解锁它们。

目前,TPM 支持的全盘加密仍处于试验阶段,即使满足要求,也可能无法在每台机器上运行。当我使用 TPM FDE 时,我会向 LUKS 添加另一个密钥,以便能够从另一个操作系统解锁驱动器,这样我就可以在没有 TPM 的情况下访问我的数据。社区的一名成员提供了一个脚本,我分叉了添加更多解释并使其能够与 pipx 一起运行。(我希望我的 PR 能够被合并。)

当我无法使用 TPM FDE 时,我会将 LUKS 与 FIDO 结合使用。这意味着我选择使用标准 LUKS 分区选项进行安装,然后注册 FIDO2 密钥。TPM 芯片可能比 FIDO2 密钥便宜,但这取决于您的需求。一些 FIDO2 密钥(例如 Google 的 Titan)对我来说不起作用。此设置目前有一个问题:您需要用 dracut(Fedora/RHEL)替换 Ubuntu 的标准 initramfs 工具。

以下是说明:

# Configure FIDO key with systemd-cryptenroll.
# Remove "--fido2-with-client-pin=no" and or "--fido2-with-user-presence=no" if you don't want them, read the manpage.
sudo systemd-cryptenroll --fido2-device auto --fido2-with-client-pin=no --fido2-with-user-presence=no /dev/sda3

# Configure crypttab and add "fido2-device=auto"
$ sudo cat /etc/crypttab
dm_crypt-0 UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeee123 none luks,fido2-device=auto

# Add required configuration.
sudo apt install dracut
sudo apt install fido2-tools

cat << EOF | sudo tee /etc/dracut.conf.d/11-fido2.conf
## Spaces in the quotes are critical.
# install_optional_items+=" /usr/lib/x86_64-linux-gnu/libfido2.so.* "

## Ugly workaround because the line above doesn't fetch
## dependencies of libfido2.so
install_items+=" /usr/bin/fido2-token "

# Required detecting the fido2 key
install_items+=" /usr/lib/udev/rules.d/60-fido-id.rules /usr/lib/udev/fido_id "
EOF

# Add required configuration.
sudo tee /etc/dracut.conf.d/10-hostonly.conf <<< "hostonly=yes"

# Create new initramfs.
sudo dracut -f

以下是我笔记中的更多链接:

在写下自己的答案之前,我需要检查这些解决方案随时间的表现。我想在这里简要介绍一下我的研究结果,以便每个有类似问题的人都能找到答案。

答案1

主要有 3 种方法。第 3 种方法看起来最简单、最合适,但为了全面了解所有 3 种方法...

方法 1

“TPM 支持的全盘加密”是安装程序支持的方法。您需要从安装程序中执行此操作。最大的缺点:远程访问设置起来非常麻烦。安装过程中:

  • 擦除磁盘并安装 Ubuntu 选项
  • 勾选“为安全起见,加密新的 Ubuntu 安装”
  • 插入键

丢失密钥对于整个系统来说都是致命的。

方法 2

如果只加密一个分区,那么当前的方法就是使用 LUKS。您不再能从安装程序中执行此操作,但安装后执行此操作相当容易。最大的缺点:更改分区的大小很烦人。

sudo cryptsetup luksFormat /dev/{device}

并设置加密密钥即可。这样您就可以启动,但如果使用 执行此操作,则需要加密密钥/home。我会将其保留/home为目录/,并仅将加密分区用于个人数据。需要密码才能打开分区,但它不会停止启动和使用系统。

方法 3

然后有一个使用 LUKS 的虚拟加密分区。有了这个,您就可以启动和使用您的系统。只有当您想打开容器时才需要密码。设置:

dd if=/dev/zero of={dir/filename} bs=1M count=1024
sudo cryptsetup luksFormat {/dir/filename}

这是最灵活的方法:扩展大小很容易,因此解决了分区加密问题。如果您需要新系统,可以轻松备份并轻松传输到另一个系统。

我做的一件事:使用容器,在容器内放置一个脚本。打开容器时执行脚本。脚本将文件放在正确的位置(例如 ssh 文件,如果您不想在系统上使用密码,它也适用于 gnome 密钥环,但我自己使用密码保险箱)。这些文件在启动、关闭和关闭容器时会被删除。

我发现一些文章和讨论建议扩展 SSHd 的配置,以便在不同的地方查找 authorized_keys

我通过不加密来解决这个问题/home,但这确实是一个解决方案。SSH 接受这一点:

/etc/ssh/authorized_keys_{username}

然后 {username} 可以使用私钥进行连接。当然需要重新启动 sshd。

答案2

我最近在新安装的 Ubuntu 24.04 上设置了一个类似于您所寻找的系统,它似乎满足您的所有要求。以下是我如何配置它的简要概述:

LUKS 加密主目录设置/home/[your_username]

初始设置

在使用新卷之前,我设置了 LUKS 加密。

  1. 创建并加密卷

    • LVM 卷路径:/dev/ubuntu-vg/home-[your_username]
  2. 使用 LUKS 加密分区

    cryptsetup -yv luksFormat /dev/ubuntu-vg/home-[your_username]
    
  3. 打开加密卷

    cryptsetup open /dev/ubuntu-vg/home-[your_username] home-[your_username]
    
  4. 格式化打开的卷

    mkfs.ext4 /dev/mapper/home-[your_username]
    mount /dev/mapper/home-[your_username] /home/[your_username]
    

备份 LUKS 头文件

备份 LUKS 标头非常重要,以避免标头损坏时造成数据丢失。

cryptsetup luksHeaderBackup /dev/ubuntu-vg/home-[your_username] --header-backup-file luksHeaderBackup.bin

配置登录时自动解密和挂载

  1. 安装 pam_mount
    apt install libpam-mount
    
  2. 编辑/etc/security/pam_mount.conf.xml配置加密卷:
    <volume user="[your_username]" fstype="auto" path="/dev/ubuntu-vg/home-[your_username]" mountpoint="/home/[your_username]" options="fsck,noatime" />
    
  3. 调整/etc/pam.d/common-session:确保包含此行:
    session optional pam_mount.so
    

这配置pam_mount为在登录期间运行,处理解密和安装/home/[your_username]

更多详细信息请参阅原博文这里

我希望这可以帮助您设置具有加密主目录和 SSH 登录的服务器,而无需在启动期间输入完整的磁盘加密密码。

相关内容