1. 程式人生 > >玩轉Ubuntu Linux之加密檔案系統篇

玩轉Ubuntu Linux之加密檔案系統篇

當Ubuntu Linux使用加密檔案系統後,資料的安萬能得到非常好的保護。在這種情況下,即使把我們的機器送給黑客,只要他們沒有金鑰,黑客看到的資料只會是一堆亂碼,毫無利用價值可言。
本文將周詳介紹利用dm-crypt來建立加密檔案系統的方法。和其他建立加密檔案系統的方法相比,dm-crypt系統有著無可比擬的優越性:他的速度更快,易用性更強。除此之外,他的適用面也非常廣,能夠執行在各種塊裝置上,即使這些裝置使用了RAID和 LVM也毫無障礙。dm-crypt系統之所以具有這些好處,主要得益於該技術是建立在2.6版本核心的device-mapper特性之上的。 device-mapper是設計用來為在實際的塊裝置之上新增虛擬層提供一種通用靈活的方法,以方便研發人員實現映像、快照、級聯和加密等處理。此外, dm-crypt使用了核心密碼應用程式設計介面實現了透明的加密,並且相容cryptloop系統。
一、設定核心


dm -crypt利用核心的密碼應用程式設計介面來完成密碼操作。一般說來,核心通常將各種加密程式以模組的形式載入。對於256-bit AES來說,其安全強度已非常之高,即便用來保護絕密級的資料也足夠了。因此本文中我們使用256-bit AES密碼,為了確保你的核心已載入AES密碼模組,請利用下列命令進行檢查:
$ cat /proc/crypto如果看到類似下面的輸出的話,說明AES模組已載入: 
name         : aes
module       : aes
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
否則,我們能利用modprobe來手工載入AES模組,命令如下所示:
$ sudo modprobe aes
接下來安裝dmsetup軟體包,該軟體包含有設定device-mapper所需的工具:
$ sudo apt-get install dmsetup cryptsetup為檢查dmsetup軟體包是否已建立了裝置映象程式,鍵入下列命令: 
$ ls -l /dev/mapper/control接下來載入dm-crypt核心模組: 
$ sudo modprobe dm-cryptdm-crypt載入後,他會用evice-mapper自動註冊。如果再次檢驗的話,device-mapper已能識別dm-crypt,並且把crypt 新增為可用的物件: 
$ sudo dmsetup targets如果一切順利,目前你應該看到crypt的下列輸出: 
crypt            v1.1.0
striped          v1.0.2
linear           v1.0.1
error            v1.0.1
這說明我們的系統已為裝載加密裝置做好了準備。下面,我們先來建立一個加密裝置。
二、建立加密裝置

要建立作為加密裝置裝載的檔案系統,有兩種選擇:一是建立一個磁碟映像,然後作為回送裝置載入;二是使用物理裝置。無論那種情況,除了在建立和捆綁回送裝置外,其他操作過程都是相似的。
1.建立回送磁碟映象
如果你沒有用來加密的物理裝置(比如儲存棒或另外的磁碟分割槽),作為替換,你能利用命令dd來建立一個空磁碟映象,然後將該映象作為回送裝置來裝載,照樣能用。下面我們以例項來加以介紹:
$ dd if=/dev/zero of=~/secret.img bs=1M count=100這裡我們新建了一個大小為100 MB的磁碟映象,該映象名字為secret.img。要想改動其大小,能改動count的值。                
接下來,我們利用losetup命令將該映象和一個回送裝置聯絡起來: 
$ sudo losetup /dev/loop/0 ~/secret.img目前,我們已得到了一個虛擬的塊裝置,其位於/dev/loop/0,並且我們能夠如同使用其他裝置那樣來使用他。 
2.設定塊裝置
準備好了物理塊裝置(例如/dev/sda1),或是虛擬塊裝置(像前面那樣建立了回送映象,並利用device-mapper將其作為加密的邏輯卷載入),我們就能進行塊裝置設定了。
下面我們使用cryptsetup來建立邏輯卷,並將其和塊裝置捆綁:
$ sudo cryptsetup -y create myEncryptedFilesystem           
/dev/DEVICENAME其中,myEncryptedFilesystem 是新建的邏輯卷的名稱。並且最後一個引數必須是將用作加密卷的塊裝置。所以,如果你要使用前面建立的回送映象作為虛擬塊裝置的話,應當執行以下命令: 
$ sudo cryptsetup -y create myEncryptedFilesystem  /dev/loop/0無論是使用物理塊裝置還是虛擬塊裝置,程式都會要你輸入邏輯卷的口令,-y的作用在於要你輸入兩次口令以確保無誤。這一點非常重要,因為一旦口令弄錯,你就會把自己的資料鎖住,這時誰也幫不了你了!
為了確認邏輯卷是否已建立,能使用下列命令進行檢查一下:
$ sudo dmsetup ls只要該命令列出了邏輯卷,就說明已成功建立了邏輯卷。不過根據機器的不同,裝置號可能有所不同: 
myEncryptedFilesystem  (221, 0)device-mapper會把他的虛擬裝置裝載到/dev/mapper下面,所以,你的虛擬塊裝置應該是/dev/mapper/myEncryptedFilesystem ,儘管用起來他和其他塊裝置沒什麼不同,實際上他卻是經過透明加密的。
如同物理裝置相同,我們也能在虛擬裝置上建立檔案系統:
$ sudo mkfs.ext3 /dev/mapper/myEncryptedFilesystem目前為新的虛擬塊裝置建立一個裝載點,然後將其裝載。命令如下所示: 
$ sudo mkdir /mnt/myEncryptedFilesystem 
$ sudo mount /dev/mapper/myEncryptedFilesystem  /mnt/myEncryptedFilesystem我們能夠利用下面的命令檢視其裝載後的情況: 
$ df -h /mnt/myEncryptedFilesystem 
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/myEncryptedFilesystem     97M  2.1M   90M   2% /mnt/myEncryptedFilesystem
非常好,我們看到裝載的檔案系統,儘管看起來和其他檔案系統無異,但實際上寫到/mnt/myEncryptedFilesystem /下的所有資料,在資料寫入之前都是經過透明的加密處理後才寫入磁碟的,因此,從該處讀取的資料都是些密文。
三、解除安裝方法

要解除安裝加密檔案系統,和平常的方法沒什麼兩樣:
$ sudo umount /mnt/myEncryptedFilesystem即便已解除安裝了塊裝置,在dm-crypt中仍然視為一個虛擬裝置。如若不信,你能再次執行命令sudo dmsetup ls來驗證一下,你會看到該裝置依然會被列出。因為dm-crypt快取了口令,所以機器上的其他使用者不必知道口令就能重新裝載該裝置。為了避免這種情況發生,你必須在解除安裝裝置後從dm-crypt中顯式的刪除該裝置。命令具體如下所示: 
$ sudo cryptsetup remove myEncryptedFilesystem此後,他將完全清除,要想再次裝載的話,你必須再次輸入口令。為了簡化該過程,我們能利用一個簡單的指令碼來完成解除安裝和清除工作: 
#!/bin/sh
umount /mnt/myEncryptedFilesystem 
cryptsetup remove myEncryptedFilesystem四、重新裝載
在解除安裝加密裝置後,我們非常可能還需作為普通使用者來裝載他們。為了簡化該工作,我們需要在/etc/fstab檔案中新增下列內容: 
/dev/mapper/myEncryptedFilesystem  /mnt/myEncryptedFilesystem  ext3 noauto,noatime 0 0此外,我們也能通過建立指令碼來替我們完成dm-crypt裝置的建立和卷的裝載工作,方法是用實際裝置的名稱或檔案路徑來替換/dev/DEVICENAME: 
#!/bin/sh
cryptsetup create myEncryptedFilesystem  /dev/DEVICENAME
mount /dev/mapper/myEncryptedFilesystem  /mnt/myEncryptedFilesystem如果你使用的是回送裝置的話,你還能利用指令碼來捆綁裝置: 
#!/bin/sh 
losetup /dev/loop/0 ~/secret.img
cryptsetup create myEncryptedFilesystem  /dev/loop/0
mount /dev/mapper/myEncryptedFilesystem  /mnt/myEncryptedFilesystem如果你收到訊息“ioctl: LOOP_SET_FD: Device or resource busy”,這說明回送裝置非常可能仍然裝載在系統上。我們能利用sudo losetup -d /dev/loop/0命令將其刪除。
五、加密主目錄
如果設定了PAM(Pluggable Authentication Modules,即可插入式鑑別模組)子系統在你登入時裝載主目錄的話,你甚至還能加密整個主目錄。因為libpam-mount模組允許PAM在使用者登入時自動裝載任意裝置,所以我們要連同openssl一起來安裝該模組。命令如下所示:
$ sudo apt-get install libpam-mount openssl接下來,編輯檔案/etc/pam.d/common-auth,在其末尾新增下列一行: 
auth    optional        pam_mount.so use_first_pass然後在檔案/etc/pam.d/common-session末尾新增下列一行內容: 
session optional        pam_mount.so
目前,我們來設定PAM,告訴他需要裝載哪些卷、及裝載位置。對本例而言,假設使用者名稱是Ian,要用到的裝置是/dev/sda1,要新增到/etc/security/pam_mount.conf檔案中的內容如下所示:
volume Ian crypt - /dev/sda1 /home/Ian cipher=aes aes-256-ecb /home/Ian.key如果想使用磁碟映象,你需要在此規定回送裝置(比如/dev/loop/0),並確保在Ian登入之前系統已執行losetup。為此,你能將 losetup /dev/loop/0 /home/secret.img放入/etc/rc.local檔案中。因為該卷被加密,所以PAM需要金鑰來裝載卷。最後的引數用來告訴PAM金鑰在 /home/Ian.key檔案中,為此,通過使用OpenSSL來加密你的口令來建立金鑰檔案:
$ sudo sh -c "echo 

YOUR PASSPHRASE
’ 
| openssl aes-256-ecb > 
/home/Ian.key"這時,提示你輸入密碼。注意,這裡的口令必需和想要的使用者登入密碼一致。原因是當你登入時,PAM需要你提供這個密碼,用以加密你的金鑰檔案,然後根據包含在金鑰檔案中的口令用dm-crypt裝載你的主目錄。
需要注意的是,這樣做會把你的口令以明文的形式暴露在.history檔案中,所以要及時利用命令history -c清晰你的歷史記錄。此外,要想避免把口令存放在加密的金鑰檔案中的話,能讓建立加密檔案系統的口令和登入口令完全一致。這樣,在身份認證時,PAM 只要把你的密碼傳給dm-crypt就能了,而不必從金鑰檔案中抽取密碼。為此,你能在/etc/security/pam_mount.conf檔案中使用下面的命令列:
volume Ian crypt - /dev/sda1 /home/Ian cipher=aes - -最後,為了確保在退出系統時自動解除安裝加密主目錄,請編輯/etc/login.defs檔案使得CLOSE_SESSIONS項設定如下: 
CLOSE_SESSIONS yes
六、小結
資料加密是一種強而有力的安全手段,他能在各種環境下非常好的保護資料的機密性。而本文介紹的Ubuntu Linux 下的加密檔案系統就是一種非常有用的資料加密保護方式,相信他能夠在保護資料機密性相方面對你有所幫助。