跳至內容

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

參見