问题
什么是 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
以下是我笔记中的更多链接:
- https://www.guyrutenberg.com/2022/02/17/unlock-luks-volume-with-a-yubikey/
- https://0pointer.net/blog/unlocking-luks2-volumes-with-tpm2-fido2-pkcs11-security-hardware-on-systemd-248.html
- https://wiki.archlinux.org/title/Universal_2nd_Factor#Data-at-rest_encryption_with_LUKS
- https://fedoramagazine.org/use-systemd-cryptenroll-with-fido-u2f-or-tpm2-to-decrypt-your-disk/
在写下自己的答案之前,我需要检查这些解决方案随时间的表现。我想在这里简要介绍一下我的研究结果,以便每个有类似问题的人都能找到答案。
答案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 加密。
创建并加密卷:
- LVM 卷路径:
/dev/ubuntu-vg/home-[your_username]
。
- LVM 卷路径:
使用 LUKS 加密分区:
cryptsetup -yv luksFormat /dev/ubuntu-vg/home-[your_username]
打开加密卷:
cryptsetup open /dev/ubuntu-vg/home-[your_username] home-[your_username]
格式化打开的卷:
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
配置登录时自动解密和挂载
- 安装 pam_mount:
apt install libpam-mount
- 编辑
/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" />
- 调整
/etc/pam.d/common-session
:确保包含此行:session optional pam_mount.so
这配置pam_mount
为在登录期间运行,处理解密和安装/home/[your_username]
。
更多详细信息请参阅原博文这里。
我希望这可以帮助您设置具有加密主目录和 SSH 登录的服务器,而无需在启动期间输入完整的磁盘加密密码。