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