用 eCryptfs 建立加密的目錄

eCryptfs 是一個檔案系統加密的工具,它可以用來在家目錄中建立一個加密的目錄 ~/Private 並在使用者登入時自動掛載,登出時自動卸載。這個目錄可以用來存放像 ssh key 或是 thunderbird 設定檔之類的個人資料,這樣連 root 都沒辦法取得你的資料了,也不需要每次電腦送修都要換 key/passphrase 了。

eCryptfs 有兩個部份,一個是
kernel module,另一個是 userspace 的管理工具。

1. 安裝 ecryptfs-utils

1-1 設定 kernel module

Kernel module 通常已經內建於 Linux kernel 裡面,但是不一定會在開機時自動載入。以下以 openSUSE 12.3 為例,說明如何設定 eCryptfs 的 kernel module。開啟 /etc/modules-load.d/custom.conf,並在裡面加入 ecryptfs 一行,重新開機後就會自動載入 eCryptfs kernel module 了。

輸入 lsmod | grep ecryptfs 檢查有沒有載入 eCryptfs module,如果有出現類似以下的輸入就代表已經設定完成:

ecryptfs              103936  1
encrypted_keys         18729  1 ecryptfs

1-2 設定自動認證掛載 eCryptfs

eCryptfs 利用 PAM
來自動在登入的時候掛載加密的目錄。在這裡同樣的,我將以 openSUSE 12.3 為例說明如何設定 PAM (其他的 distribution 設定方式可能不相同,在此不一一列出,請自行查詢)。

首先先切換目錄到 /etc/pam.d: cd /etc/pam.d

我們要把這行 auth required pam_ecryptfs.so unwrap 加到下面這行後面:

輸入 grep -n "auth.*pam_unix\.so" * 來找到以下這行,用文字編輯器開啟後,在這行後面加上 auth required pam_ecryptfs.so unwrap:

auth     required        pam_unix.so  ...

接下來,輸入 grep -n "password.*pam_unix\.so" * 找到以下這行,並在它的前面加上 password optional pam_ecryptfs.so:

password     required        pam_unix.so  ...

最後,輸入 grep -n "session.*pam_unix\.so" * 找到以下這行並在它的後面加上
session optional pam_ecryptfs.so

session     required        pam_unix.so  ...

如此就完成了 eCryptfs 的設定,重新開機後繼續下面的步驟。

1-3 安裝 userspace 工具

我們要使用 eCryptfs 只要安裝userspace 的工具,在套件管理程式裡面搜尋安裝 ecryptfs-utils 即可。如果你用的是 openSUSE,可以輸入以下指令安裝:

sudo zypper install ecryptfs-utils

2. 建立 ~/Private 目錄

輸入以下指令建立你自己的 ~/Private 目錄,注意前面不要sudo

ecryptfs-setup-private

重新登入後,應該就會看到一個空的 ~/Private 目錄,若是目錄裡面不是空的,而含有 Access-Your-Private-Data.desktopREADME.txt 兩個檔案,代表
~/Private 並沒有成功掛載。

實際加密後的資料存在 ~/.Private 裡面,保留了目錄結構和權限,檔名和檔案內容則是加密後的結果。

密碼管理

eCrypts 會詢問你的登入密碼(login passphrase)和一個掛載密碼(mount passphrase)。你或許會覺得奇怪,為什麼要用兩組密碼呢?這是因為登入密碼可能會經常改變,但是我們希望在修改密碼的時候不需要重新加密所有檔案。eCryptfs 會用掛載密碼來加密檔案,然後再用登入密碼來加密掛載密碼,並將加密後的掛載密碼存在
~/.ecryptfs/wrapped-passphrase 這個檔案裡面。這樣當使用者修改登入密碼的時候,eCryptfs 就只要重新加密掛載密碼,而不用重新加密所有檔案。

因此,當使用者修改登入密碼之後,必須手動執行
ecryptfs-rewrap-passphrase ~/.ecryptfs/wrapped-passphrase 來重新加密掛載密碼。雖然看起來很奇怪,但這不是一個 bug,而是一個正確的設計。一個理由是 eCryptfs 需要知道原來的登入密碼才能解密加密後過的掛載密碼,另一個理由是若不是這樣的話,root 只要修改某個使用者的密碼就可以取得他的檔案,eCryptfs 就失去它的功能了。

手動掛載 ~/Private

若是修改了登入密碼但是沒有執行 ecryptfs-rewrap-passphrase,重新登入後會發現~/Private 裡面只有 Access-Your-Private-Data.desktopREADME.txt 兩個檔案。這時候可以執行 ecrypt-mount-private 來掛載 ~/Private,它會詢問你的登入密碼,注意這時要輸入的是舊的登入密碼。

手動卸載 ~/Private

執行 ecrypt-umount-private 即可卸載 ~/Private。

將要加密的檔案移至 ~/Private

設定好登入自動掛載之後,就可以把需要加密的檔案移到 ~/Private 並建立 symlink。舉例來說,以下這些就是我的 home 裡面需要加密的目錄。

~/.ssh/
~/.gnupg/
~/.thunderbird/
~/.purple/

首先,先關閉這些程式(Thunderbird 和 Pidgin),然後把這些目錄移到 ~/Private 之後,再建立 symbolic link 讓程式以為目錄還在 home 裡面:

cd ~   # 切換到 home
mv ~/.ssh ~/.gnupg/ ~/.thunderbird/ ~/.purple/ ~/Private # 移動到 ~/Private
ln -s ~/Private/.* .  # 建立 symlink

如此一來,只要登出之後,連 root 都沒辦法存取你的 private key、e-mail 和聊天紀錄了。

參考資料

https://wiki.archlinux.org/index.php/ECryptfs#Auto-mounting
http://ecryptfs.org/