當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-crypt
dm-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
這時,提示你輸入密碼。注意,這裡的口令必需和想要的用戶登錄密碼一致。原因是當你登錄時,PAM需要你提供這個密碼,用以加密你的密鑰文件,然後根據包含在密鑰文件中的口令用dm-crypt裝載你的主目錄。
'
YOUR PASSPHRASE
'
| openssl aes-256-ecb >
/home/Ian.key"
需要注意的是,這樣做會把你的口令以明文的形式暴露在.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 下的加密文件系統就是一種非常有用的數據加密保護方式,相信它能夠在保護數據機密性相方面對您有所幫助。