Table of Contents
一、文件目錄加密與磁盤加密
1.文件目錄加密
我們主要有兩種加密文件和目錄的方法。一種是文件系統級別的加密,在這種加密中,你可以選擇性地加密某些文件或者目錄(如,/home/alice)。然而,文件系統級別的加密也有一些缺點。例如,許多現代應用程序會緩存(部分)文件你硬盤中未加密的部分中,比如交換分區、/tmp和/var文件夾,而這會導致隱私泄漏。
加密方式:
EncFS:嘗試加密的最簡單方式之一。EncFS工作在基於FUSE的僞文件系統上,所以你只需要創建一個加密文件夾並將它掛載到某個文件夾就可以工作了。
eCryptFS:一個POSIX兼容的加密文件系統,eCryptFS工作方式和EncFS相同,所以你必須掛載它。
2.磁盤加密
另外一種方式,就是所謂的全盤加密,這意味着整個磁盤都會被加密(可能除了主引導記錄外)。全盤加密工作在物理磁盤級別,寫入到磁盤的每個比特都會被加密,而從磁盤中讀取的任何東西都會在運行中解密。這會阻止任何潛在的對未加密數據的未經授權的訪問,並且確保整個文件系統中的所有東西都被加密,包括交換分區或任何臨時緩存數據。
本篇介紹eCryptFS,一個基於文件系統的加密軟件。
二、eCryptFS
1、eCryptfs介紹
eCrypFS是一個基於FUSE(Filesystem in Userspace)的用戶空間加密文件系統,在Linux內核2.6.19及更高版本中可用(作爲encryptfs模塊)。eCryptFS加密的僞文件系統是掛載到當前文件系統頂部的。它可以很好地工作在EXT文件系統家族和其它文件系統如JFS、XFS、ReiserFS、Btrfs,甚至是NFS/CIFS共享文件系統上。Ubuntu使用eCryptFS作爲加密其家目錄的默認方法,ChromeOS也是。在eCryptFS底層,默認使用的是AES算法,但是它也支持其它算法,如blowfish、des3、cast5、cast6。如果你是通過手工創建eCryptFS設置,你可以選擇其中一種算法。
Ubuntu讓我們在安裝過程中選擇是否加密/home目錄。好吧,這是使用eCryptFS的最簡單的一種方法。
2、eCrypFS架構
架構在在文件系統之上,VFS(virtual File System)之下。
解讀以下架構,首先用戶輸出相關指令(也就是圖上的Application),我們可以吧指令當做應用接口對底層的調用,指令穿過VFS,虛擬文件層,說明eCrypFS是在虛擬文件之下的,也就說明eCrypFS提供了對虛擬文件的支持。再往下走就是ext3,文件系統底層。我們看到eCrypFS層,這一層的核心是API應用接口及程序,eCrypFS默認使用AES加密算法,加密算法將生成一段祕鑰,稱爲Keystore,keystore回調到用戶空間,eCrypFS Daemon指的是你使用eCrypFS加密的模型文件,比如你的家目錄/home。無論是加密還是解密,這一流程都是一定的,不同的只是調用的接口和執行的指令不一樣。在加密時會生成keystore,解密時根據你預留的密碼去找keystore,在於底層的keystore比對,一致則解開文件枷鎖。
eCryptfs 採用 OpenPGP (優良保密協議,是一套用於消息加密、驗證的應用程序)的文件格式存放加密文件, 對稱密鑰加密算法以塊爲單位進行加密/解密,因此 eCryptfs 將加密文件分成多個邏輯塊,稱爲 extent。當讀入一個 extent 中的任何部分的密文時,整個 extent 被讀入 Page Cache,通過 Kernel Crypto API 被解密;當 extent 中的任何部分的明文數據被寫回磁盤時,需要加密並寫回整個 extent。
加密文件的頭部存放元數據,包括元數據長度、標誌位以及 EFEK 鏈,目前元數據的最小長度爲 8192 字節。
加密寫入
eCryptfs Layer 創建一個新文件時,Keystore 利用內核提供的隨機函數創建一個 FEK;新文件關閉時,Keystore 和 eCryptfs Daemon 合作爲每個授權用戶創建相應 EFEK,存放在加密文件的頭部元數據中。
解密讀出
eCryptfs Layer 首次打開一個文件時,通過下層文件系統讀取該文件的頭部元數據,交與 Keystore 模塊進行 EFEK(加密後的 FEK)的解密。
三、eCrypFS安裝
Ubuntu系統是默認裝有eCryptFS的,當然你也可以通過下面方式安裝。
Debian,Ubuntu或其衍生版:
$ sudo apt-get install ecryptfs-utils
CentOS, RHEL or Fedora:
# yum install ecryptfs-utils
Arch Linux:
$ sudo pacman -S ecryptfs-utils
在安裝完包後,加載eCryptFS內核模塊(可選)
$ sudo modprobe ecryptfs
四、eCryptFS的使用
1.通過掛載文件目錄使用
使用mount命令,我們通常認爲的,只有磁盤塊可以掛載使用,沒有聽說過掛載文件目錄,但是我們卻可以指定類型爲ecryptfs來掛載文件目錄使用,在掛載的時候設置密碼,在取消掛載的時候,目錄裏的一切內容將被加密,再次掛載輸入密碼,如果與上一次輸入的密碼一致,那麼掛載就成功,又可以查看目錄下文件的內容了,下面通過實驗演示:
$ mkdir myfile #創建一個目錄
$ mount -t ecryptfs myfile myfile #我標紅的是需要輸入的,一定要以 -t ecryptfs形式掛載
Passphrase:
Select cipher:
1) aes: blocksize = 16; min keysize = 16; max keysize = 32
2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
6) cast5: blocksize = 8; min keysize = 5; max keysize = 16
Selection [aes]:
Select key bytes:
1) 16
2) 32
3) 24
Selection [16]:
Enable plaintext passthrough (y/n) [n]:
Enable filename encryption (y/n) [n]:
Attempting to mount with the following options:
ecryptfs_unlink_sigs
ecryptfs_key_bytes=16
ecryptfs_cipher=aes
ecryptfs_sig=360d0573e701851e
Mounted eCryptfs
passphrase:
(這是要你輸入密碼,自己編一個。一定要記住。另外密碼是不會有任何顯示的,輸完回車就行)
select cipher:
(選擇加密方式,不選默認是[aes]。最好記住自己的選擇)
select key bytes:
(選擇加密位數,不選默認是[16]。最好記住自己的選擇)
enable plaintext passthrough(y/n) [n]:
(是否允許使用明文,默認是 n)
enable filename encryption (y/n) [n]:
(是否把文件名也進行加密,默認是 n。如果選擇y,那麼在沒有解密 的情況下是無法看見文件夾內部的文件的) 如果設置的密碼是第一次使用,它會提示你密碼被標識爲[799d2f922c0f1f26] 。當然,你的密碼標識肯定不會是這個。並且告訴你掛載錯誤,因爲/root/.ecryptfs/sig-cache.txt中沒有相關記錄。開始讓你選擇:
Would you like to proceed with the mount (yes/no)? :
(你是否希望繼續進行掛載。我們輸入yes,來完成加密)
Would you like to append sig [799d2f922c0f1f26] to [/root/.ecryptfs/sig-cache.txt] in order to avoid this warning in the future (yes/no)?:
(你是否把密碼標識加到/root/.ecryptfs/sig-cache.txt中,免得下次再報警。我們輸入yes)
掛載後顯示
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 788M 9.3M 779M 2% /run
/dev/sda4 37G 18G 18G 50% /
tmpfs 3.9G 317M 3.6G 9% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 788M 56K 788M 1% /run/user/1000
/root/myfile 37G 18G 18G 50% /root/myfile
掛載之後,在目錄下創建一些文件並寫入內容
$ echo 123 > 123.txt
2.解掛載
以 -t ecryptfs解掛載
$ umount -t ecryptfs myfile
再次查看文件,爲亂碼文件
$ cat 123.txt
s����>����"3DUfw`�Cp��I�����{��~v�_CONSOLE6
�8n�ſi�,��;����װOW����2ֳVi8�7�eԚJ�YGY�oGBP�3�zLK�O��bS�n �T��� wZí��۾t9�3�����n%t�H��H�`�y��P���Y|�Yl�n�}on��T��6a���l#Ͼ�^��4��
3.再掛載
如果想恢復文件內容,再次掛載,又要輸入一堆東西,一定要把密碼與上一次密碼統一,稍後我們會講不統一的結果。
$ mount -t ecryptfs myfile myfile
Passphrase:
Select cipher:
1) aes: blocksize = 16; min keysize = 16; max keysize = 32
2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
6) cast5: blocksize = 8; min keysize = 5; max keysize = 16
Selection [aes]:
Select key bytes:
1) 16
2) 32
3) 24
Selection [16]:
Enable plaintext passthrough (y/n) [n]:
Enable filename encryption (y/n) [n]:
Attempting to mount with the following options:
ecryptfs_unlink_sigs
ecryptfs_key_bytes=16
ecryptfs_cipher=aes
ecryptfs_sig=360d0573e701851e
Mounted eCryptfs
再次查看文件內容
$ cat 123.txt
123
4.問題一:輸入錯誤的密碼
我們將密碼故意輸錯,居然發現可以掛載。但是卻打不開文件,這說明:每個人都可以使用同一個文件進行掛載使用(通過ecryptfs的方式),但是隻有輸入自己填寫的密碼,才能查看自己創建的文件。
$ mount -t ecryptfs myfile myfile
Passphrase:
$ cat 123.txt
cat: 123.txt: Input/output error
總結兩句話:
1.錯誤密碼可以掛載
2.掛載之後不能查看由其他人通過不同密碼創建的文件
5.問題二:未掛載前創建的文件是否可以查看
不可以,只有在解掛載的時候才能查看。如果你掛載了目錄再打開,則會把Input/output error的錯誤
五、eCryptFS自動掛載
現在,讓我們開始加密一些目錄,運行eCryptFS配置工具:
這條命令有相當多的選項,下面講解
$ ecryptfs-setup-private
它會要求你輸入登錄密碼和掛載密碼。登錄密碼和你常規登錄的密碼一樣,而掛載密碼用於派生一個文件加密主密鑰。這裏留空可以生成一個(複雜的),這樣會更安全。登出然後重新登錄。
你會注意到,eCryptFS默認在你的家目錄中創建了兩個目錄:Private和.Private。~/.Private目錄包含有加密的數據,而你可以在~/Private目錄中訪問到相應的解密後的數據。在你登錄時,~/.Private目錄會自動解密並映射到~/Private目錄,因此你可以訪問它。當你登出時,~/Private目錄會自動卸載,而~/Private目錄中的內容會加密回到~/.Private目錄。
eCryptFS怎麼會知道你擁有~/.Private目錄,並自動將其解密到~/Private目錄而不需要我們輸入密碼呢?這就是eCryptFS的PAM模塊搗的鬼,它爲我們提供了這項便利服務。
如果你不想讓~/Private目錄在登錄時自動掛載,只需要在運行ecryptfs-setup-private工具時添加“--noautomount”選項。同樣,如果你不想要~/Private目錄在登出後自動卸載,也可以自動“--noautoumount”選項。但是,那樣後,你需要自己手工掛載或卸載~/Private目錄:
$ ecryptfs-mount-private ~/.Private ~/Private $ ecryptfs-umount-private ~/Private
你可以來驗證一下.Private文件夾是否被掛載,運行:
$ mount -l
現在,我們可以開始把任何敏感文件放進~/Private文件夾裏頭了,它們會在我們登出時自動被加密並鎖在~/.Private文件內。
所有這一切看起來是那麼得神奇。這主要是ecryptfs-setup-private工具讓一切設置變得簡單。如果你想要深究一點,對eCryptFS指定的方面進行設置,那麼請轉到官方文檔。