fscrypt
fscrypt 是一个用于管理 ext4、F2FS、UBIFS、CephFS 和 Lustre 文件系统的原生文件加密支持的工具。
内核中集成的底层加密机制有时也被称为 “fscrypt”。为了避免歧义,本文将内核功能称为 “Linux 原生文件加密”。使用 Linux 原生文件加密,不同的目录可以使用不同的加密密钥。在加密目录中,所有文件内容、文件名和符号链接都会被加密。所有子目录也会被加密。非文件名元数据,例如时间戳、文件大小和数量以及扩展属性,则不会被加密。
由于本文假设使用 fscrypt 工具(以及可选的 pam_fscrypt,它与 fscrypt 一起使用),因此它的大部分内容不适用于可以设置 Linux 原生文件加密的其他用户空间工具,例如 systemd-homed。
可考虑的替代方案
要用一个密码保护整个文件系统,使用 dm-crypt (LUKS) 进行块设备加密通常是更好的选择,因为它确保文件系统上的所有文件都被加密,并且所有文件系统元数据也被加密。fscrypt 最适用于加密特定目录,或使不同的加密目录能够独立解锁,例如,每个用户的加密 home 目录。
与 eCryptfs 相比,由 fscrypt 控制的 Linux 原生文件加密不使用文件系统堆叠,这使其更节省内存。它还使用更现代的密码学,并且不需要 root 权限即可设置,从而避免了对 setuid 二进制文件的需求。eCryptfs 也已不再积极开发,其最大的用户(Ubuntu 和 Chrome OS)已迁移到其他解决方案。
请参阅 静态数据加密 以获取有关其他加密解决方案以及加密的作用和不作用的更多信息。
- 可以将 fscrypt 与 dm-crypt 结合使用,每个加密层服务于不同的目的。例如,文件系统本身可以使用不太安全的方法(如绑定到 “安全启动” 的 TPM 或系统所有用户都知道的密码)通过 dm-crypt 进行保护,而每个用户的 home 目录也可以使用只有该用户知道的密码通过 fscrypt 进行保护。
- 来自 e2fsprogs 的 e4crypt 工具可以用作 fscrypt 工具的替代品。但是,不建议这样做,因为 e4crypt 缺少许多基本功能,并且已不再积极开发。
- 来自 f2fs-tools 的 f2fscrypt 只是 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 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
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 目录
要加密用户的 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
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
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]