Fscrypt
fscrypt 是一个用于管理 ext4, F2FS, UBIFS, CephFS 和 Lustre 文件系统加密的用户空间工具.
内核中上述文件系统的 加密特性有时也被叫做“Fscrypt”。
在此加密特性中,不同目录可以用不同的密钥加密。在被加密的目录中,所有文件的内容、文件名和符号链接,以及子目录都将被加密。而元数据,如时间戳、文件大小,文件属性,则不会被加密。
由于本文提供的内容仅适用于fscrypt(以及可选的配套的pam_fscrypt),多数内容不适用于其他同样用于配置加密的用户空间工具,例如 systemd-homed.
替代方案
dm-crypt(LUKS)支持用一个密码加密整个分区。对于磁盘加密,这通常是更好的选择,因为它能加密分区上所有的内容,包括元数据。FSClect最适合加密特定目录,也能使不同的加密目录能够分别解锁,如按用户加密的主目录。
eCryptfs 使用Fscrypt不支持的文件系统堆叠加密,这使得其内存的利用率极高。它还使用更先进的加密算法,且无需root权限即可设置,无需提权。但eCryptfs已不再活跃,其主要用户(Ubuntu 用户和 Chrome OS用户)已迁移到其他解决方案。
参阅静态数据加密,以了解有关其他方案的更多信息,以及相关功能。
- fscrypt和dm-crypt可以结合使用,且每个加密层都分别具有不同用途。例如,文件系统本身可以通过dm-crypt使用一种安全性较差的方案进行加密,例如将TPM绑定到“安全启动”或或者一个所有用户都知道的密码,而fscrypt也可以将每个用户的主目录以该用户设置的密码加密。
- e2fsprogs包的e4crypt可以作为fscrypt的替代品。但不推荐使用,因为e4crypt缺少很多基本功能,而且已经不再活跃。
- f2fs-tools包的f2fstools只是e4crypt的复制品,同样不建议使用
准备工作
内核
所有官方支持的内核均支持ext4,F2FS,UBIFS和CephFS的加密。
对于用户自定义的内核,请确保CONFIG_FS_ENCRYPTION=y已被设置。
文件系统
对于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 --all-users mountpoint
其中 mountpoint 是该文件系统的挂载点, 如 /home.
--all-users 选项允许用户选择要加密的目录,也可以在创建配置后更改,更多信息请参见 fscrypt documentation。
这将会创建mountpoint/.fscrypt以存放配置和保护器。
- 永远不要删除
.fscrypt目录; 否则所有被加密的文件都将丢失.
- 在backup, 备份,修复和恢复时一定要先尝试一下。
自动解锁目录
要(可选)在登录时自动解锁使用登录密码的保护目录,并保持其保护目录与登录密码的更改同步,请调整系统 PAM 配置以启用pam_fscrypt。
在/etc/pam.d/system-login的auth 部分附加以下行:
/etc/pam.d/system-login
auth optional pam_fscrypt.so
然后在session include system-auth 的session 部分之前插入:
/etc/pam.d/system-login
session [success=1 default=ignore] pam_succeed_if.so service = systemd-user quiet session optional pam_fscrypt.so
最后,在/etc/pam.d/passwd后插入:
/etc/pam.d/passwd
password optional pam_fscrypt.so
加密目录
要加密一个空目录,运行:
$ fscrypt encrypt dir
按照提示创建或选择“保护器”。保护器是关于保护目录密钥的秘密信息。保护器的类型包括:
- “custom_passphrase”,即用户自定义密码。
- “pam_passphrase”,即用户登录密码。使用此类保护器的目录,当用户登录时(如果启用了该保护器),pam_fscrypt就会自动解锁它们。考虑到Arch Linux使用yescrypt哈希算法, 使用此类保护器前应先查阅上游安全建议。
在这两种情况下,密码都支持在设置加密后更改,或修改保护器。对于“pam_passphrase”,fscrypt 会为其自动生成第二个保护器,即恢复密码。
E
custom_passphrase的示例:
$ 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_passphrase的示例:
$ 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
FSCcrypt会提示输入密码短语。
要锁定加密目录,运行:
$ fscrypt lock dir
加密主目录
- 登录密码保护器的安全性取决于
/etc/shadow中密码的哈希算法。使用该保护器之前,请参见#Encrypt a directory。 - 如果主目录被加密了,那么在主目录解锁之前,可能无法连接该用户的SSH.
要加密主目录,首先要完成 准备工作,同时应启用 pam_fscrypt。
然后创建一个加密目录做为新的主目录:
# mkdir /home/newhome # chown user:user /home/newhome # fscrypt encrypt /home/newhome --user=user
S
使用--user选项以使用登录密码保护主目录。
将原主目录下的所有内容复制到加密的主目录:
# 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配置错误,也可能是选错了保护器的类型。
如果没有问题,就可以替换主目录:
# mv /home/user /home/oldhome # mv /home/newhome /home/user # reboot
如果之后的使用正常,可以删除原来的主目录:
# find /home/oldhome -type f -print0 | xargs -0 shred -n1 --remove=unlink # rm -rf /home/oldhome
Lxc内的加密
Lxc内部支持使用Fscrypt,或者更一般地在mount_namespaces(7) 中使用Fscrypt,该功能在v0.2.8.以添加
容器停止时设定目录
容器内的systemd/用户单元可以在容器停止时锁定加密目录:
~/.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提交issues.
ext4: 从加密目录移动文件
可以将加密文件从它已解锁的父目录中移动出去,但这种方法支持。不佳当相应的保护器锁定时可能会引发许多后续问题,当保护器被移除时,甚至可能丢失数据。参见 https://github.com/google/fscrypt/issues/393。
若要永久解密文件,可以将其从已解锁的加密目录复制到普通的未加密目录中[1]。