跳转到内容

Fscrypt

来自 Arch Linux 中文维基

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目录; 否则所有被加密的文件都将丢失.

自动解锁目录

要(可选)在登录时自动解锁使用登录密码的保护目录,并保持其保护目录与登录密码的更改同步,请调整系统 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
注意:第一行取自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就会自动解锁它们。考虑到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
提示:运行shred是可选的, 但十分推荐,原因详见 安全地擦除磁盘#shred。

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]。

参见