fscrypt

来自 ArchWiki

fscrypt 是一个用于管理 ext4F2FSUBIFSCephFSLustre 文件系统的原生文件加密支持的工具。

内核中集成的底层加密机制有时也被称为 “fscrypt”。为了避免歧义,本文将内核功能称为 “Linux 原生文件加密”。使用 Linux 原生文件加密,不同的目录可以使用不同的加密密钥。在加密目录中,所有文件内容、文件名和符号链接都会被加密。所有子目录也会被加密。非文件名元数据,例如时间戳、文件大小和数量以及扩展属性,则不会被加密。

由于本文假设使用 fscrypt 工具(以及可选的 pam_fscrypt,它与 fscrypt 一起使用),因此它的大部分内容不适用于可以设置 Linux 原生文件加密的其他用户空间工具,例如 systemd-homed

此条目或章节需要扩充。

原因:应添加关于访问语义的参考(多用户系统 ACL、加密目录备份的限制以及 ext4 回退到 data-ordered-mode)。(在 Talk:Fscrypt 中讨论)

可考虑的替代方案

要用一个密码保护整个文件系统,使用 dm-crypt (LUKS) 进行块设备加密通常是更好的选择,因为它确保文件系统上的所有文件都被加密,并且所有文件系统元数据也被加密。fscrypt 最适用于加密特定目录,或使不同的加密目录能够独立解锁,例如,每个用户的加密 home 目录。

eCryptfs 相比,由 fscrypt 控制的 Linux 原生文件加密不使用文件系统堆叠,这使其更节省内存。它还使用更现代的密码学,并且不需要 root 权限即可设置,从而避免了对 setuid 二进制文件的需求。eCryptfs 也已不再积极开发,其最大的用户(Ubuntu 和 Chrome OS)已迁移到其他解决方案。

请参阅 静态数据加密 以获取有关其他加密解决方案以及加密的作用和不作用的更多信息。

注意
  • 可以将 fscryptdm-crypt 结合使用,每个加密层服务于不同的目的。例如,文件系统本身可以使用不太安全的方法(如绑定到 “安全启动” 的 TPM 或系统所有用户都知道的密码)通过 dm-crypt 进行保护,而每个用户的 home 目录也可以使用只有该用户知道的密码通过 fscrypt 进行保护。
  • 来自 e2fsprogse4crypt 工具可以用作 fscrypt 工具的替代品。但是,不建议这样做,因为 e4crypt 缺少许多基本功能,并且已不再积极开发。
  • 来自 f2fs-toolsf2fscrypt 只是 e4crypt 的副本,同样不建议使用。

准备工作

内核

所有官方支持的内核都支持 ext4、F2FS、UBIFS 和 CephFS 上的原生文件加密。

自定义内核的用户,请确保已设置 CONFIG_FS_ENCRYPTION=y

文件系统

ext4

对于 ext4,要使用加密的文件系统必须启用 encrypt 功能标志。要启用它,请运行

# tune2fs -O encrypt /dev/device
提示: 创建新文件系统时,可以使用 mkfs.ext4 -O encrypt 立即启用 encrypt 功能。

F2FS

对于 F2FS,在创建文件系统时使用 mkfs.f2fs -O encrypt,或稍后使用 fsck.f2fs -O encrypt

用户空间工具

安装 fscrypt 软件包。然后运行

# fscrypt setup

这将创建文件 /etc/fscrypt.conf 和目录 /.fscrypt

然后,如果要使用加密的文件系统不是根文件系统,也请运行

# fscrypt setup mountpoint

其中 mountpoint 是文件系统的挂载点,例如 /home

这将创建目录 mountpoint/.fscrypt 以存储 fscrypt 策略和保护器。

警告: 永远不要删除 .fscrypt 目录;否则将丢失对加密文件的所有访问权限!

PAM 模块

要在登录时自动解锁受登录密码保护的目录,并使受登录密码保护的目录与登录密码的更改保持同步,请调整系统 PAM 配置以启用 pam_fscrypt

将以下行附加到 /etc/pam.d/system-login 中的 auth 部分

/etc/pam.d/system-login
auth       optional   pam_fscrypt.so

session 部分的 session include system-auth 之前插入以下行

/etc/pam.d/system-login
session    [success=1 default=ignore]  pam_succeed_if.so  service = systemd-user quiet 
session    optional                    pam_fscrypt.so
注意: 第一行取自 https://github.com/google/fscrypt/issues/95,是 systemd --user 会话的绕过,该会话无法正确关闭其 PAM 会话,否则会阻止注销时锁定。

最后,将以下行附加到 /etc/pam.d/passwd

/etc/pam.d/passwd
password    optional    pam_fscrypt.so

加密目录

要加密一个空目录,请运行

$ fscrypt encrypt dir

按照提示创建或选择一个 “保护器”。保护器是保护目录加密密钥的秘密或信息。保护器的类型包括

  • “custom_passphrase”。顾名思义,这是一个用户定义的密码。
  • “pam_passphrase”。这是特定用户的登录密码。使用此类型保护器的目录将在该用户登录时由 pam_fscrypt 自动解锁(如果已启用)。在使用此类型的保护器之前,请务必遵循 安全建议

在这两种情况下,密码都可以稍后更改,或者可以使用另一种方法重新保护目录。

自定义密码示例

$ fscrypt encrypt private/
Should we create a new protector? [y/N] y
Your data can be protected with one of the following sources:
1 - Your login passphrase (pam_passphrase)
2 - A custom passphrase (custom_passphrase)
3 - A raw 256-bit key (raw_key)
Enter the source number for the new protector [2 - custom_passphrase]: 2
Enter a name for the new protector: Super Secret
Enter custom passphrase for protector "Super Secret":
Confirm passphrase:
"private/" is now encrypted, unlocked, and ready for use.

PAM 密码示例

$ fscrypt encrypt private/
Should we create a new protector? [y/N] y
Your data can be protected with one of the following sources:
1 - Your login passphrase (pam_passphrase)
2 - A custom passphrase (custom_passphrase)
3 - A raw 256-bit key (raw_key)
Enter the source number for the new protector [2 - custom_passphrase]: 1
Enter login passphrase for testuser:
"private/" is now encrypted, unlocked, and ready for use.
注意: 只能在空目录上启用加密。要加密现有目录,请先将内容复制到其他位置,然后删除原始文件,例如
$ mkdir new_dir
$ fscrypt encrypt new_dir
$ cp -a -T old_dir new_dir
$ find old_dir -type f -print0 | xargs -0 shred -n1 --remove=unlink
$ rm -rf old_dir
注意避免移动文件(命令 mv),而不是复制,因为未加密的文件很容易恢复。在某些情况下,即使在粉碎和删除后,它们也可能从磁盘中以取证方式恢复,尤其是在使用 SSD 的情况下。最好从一开始就加密数据。

锁定/解锁目录

要解锁加密目录,请运行

$ fscrypt unlock dir

fscrypt 将提示输入密码。

要锁定加密目录,请运行

$ fscrypt lock dir

加密 home 目录

警告
  • 登录保护器的安全性仅与 /etc/shadow 中系统的密码散列一样安全。在使用登录保护器之前,请务必遵循 安全建议
  • 如果用户的 home 目录已加密,则该用户的 SSH 可能无法工作,直到其 home 目录被解锁。

要加密用户的 home 目录,首先要确保所有准备工作都已完成,包括启用 pam_fscrypt

然后,为用户创建一个新的加密目录

# mkdir /home/newhome
# chown user:user /home/newhome 
# fscrypt encrypt /home/newhome --user=user

选择使用用户的登录密码保护目录的选项。

然后将用户旧 home 目录的内容复制到加密目录中

# cp -a -T /home/user /home/newhome
提示: 如果磁盘空间不足以容纳 home 目录的第二个副本,请考虑使用 mv -T /home/user /home/newhome 代替。但是,这是不安全的。强烈建议先进行 备份

如果使用了 cp 方法,请在实际切换到使用它之前,检查目录是否在登录时自动解锁。最简单的方法是重启并以该用户身份登录。之后,运行

$ fscrypt status /home/newhome
"/home/newhome" is encrypted with fscrypt.

Policy:   d80f252996aae181204403043b0ada25
Options:  padding:32 contents:AES_256_XTS filenames:AES_256_CTS policy_version:2
Unlocked: Yes

Protected with 1 protector:
PROTECTOR         LINKED  DESCRIPTION
5952c84ebaf0f98d  No      login protector for testuser

如果显示 Unlocked: No,则 PAM 配置有问题,或者选择了不正确的保护器类型。

否则,替换 home 目录

# mv /home/user /home/oldhome
# mv /home/newhome /home/user
# reboot

如果一切都按预期工作,请删除旧的 home 目录

# find /home/oldhome -type f -print0 | xargs -0 shred -n1 --remove=unlink
# rm -rf /home/oldhome
提示: 运行 shred 是可选的,但强烈建议这样做。

Linux 容器 (lxc) 内的加密

在 v0.2.8 中添加了在 Linux 容器 (lxc) 内使用 fscrypt 的支持,或者更普遍地在文件系统的根目录不可见的 mount_namespaces(7) 中使用 fscrypt 的支持。

容器停止时锁定目录

容器内的 systemd/User 单元可以在容器停止时锁定加密目录

~/.config/systemd/user/lock-directory.service
[Unit]
Description=lock encrypted directory on shutdown
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/fscrypt lock /home/facade/target"
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

故障排除

请参阅 https://github.com/google/fscrypt/blob/master/README.md#troubleshooting 以获取一些常见问题的解决方案,并查看 Github 上的未解决问题

ext4:fscrypt 加密目录外的加密文件

来自解锁的 fscrypt 的加密常规文件可以移动到未加密的目录中。虽然这是可能的,但它没有得到很好的支持,通常是不希望的,并且可能导致以后的问题:用户可能不会注意到它,除非相应的保护器被锁定或更糟:被删除。 https://github.com/google/fscrypt/issues/393

如果您想永久解密文件,请将它们从解锁的 fscrypt 目录复制到常规的未加密目录中。[1]

参见