2009年8月29日 星期六

dm-crypt 與加密磁區容器

因為之前我新買不到一年的硬碟毫無預警地(HDD SMART 都還在良好)就壞掉了,所以我現在對所有的硬碟商都抱持不信任的態度,硬碟只能當作耗材。所以我昨天我又去買了一個隨身硬碟用來備分我的重要資料。不過隨身硬碟有一個問題就是為了要讓 Windows 也能讀取,所以我必需要讓隨身硬碟本身的檔案系統是 NTFS 或 FAT32,可是我又希望我在 Linux 之下的檔案屬性、權限不要亂動,所以我只好使用一個折衷的方案:建立一個容器,再把這一個容器當成 device,mount 到我的系統樹上面。在 Linux 之下,這很容易。

建立步驟:
  1. dd if=/dev/zero of=TARGET bs=1G count=40
  2. sudo mkfs.ext3 TARGET

使用步驟:
  1. sudo mkdir /media/DISKNAME
  2. sudo mount TARGET /media/DISKNAME -o loop
  3. ... (做你想做得事)
  4. sudo umount /media/DISKNAME
  5. sudo rmdir /media/DISKNAME


不過我後來又想到我想要把資料加密,因為我不想要我的資料被偷看。印象中有一個叫 dm-crypt 的 Linux 2.6 的模組可以把一個普通檔案映射成一個加密硬碟,只要 umount 之後,沒有你的密碼,誰也不能讀取。

事前準備:
  1. sudo aptitude install dmsetup cryptsetup
這二個套件一定要先安裝起來,dmsetup 是 device mapper 的工具;cryptsetup 是 dm_crypt 的工具。另外因為我用得 Linux 發行版是 Ubuntu (9.04),Ubuntu 有把 aes 還有 dm_crypt 編譯成模組,如果你的系統沒有把這二個功能編入核心,也沒有編為模組,你可能需要重新編譯你的 Linux Kernel。


掛載系統模組:
  1. sudo modprobe aes
  2. sudo modprobe dm_crypt


建立步驟:
  1. sudo dd if=/dev/zero of=TARGET bs=1G count=40
  2. sudo losetup /dev/loop0 TARGET
    備註: 這個步驟的 /dev/loop0 可以用任何一個 LOOP device 取代。
  3. sudo cryptsetup -y create CRYPTDEVNAME /dev/loop0 -c aes
    備註: 你必須要輸入密碼二次。
  4. sudo mkfs.ext3 /dev/mapper/CRYPTDEVNAME
  5. sudo cryptsetup remove CRYPTDEVNAME
  6. sudo losetup -d /dev/loop0


使用步驟:
  1. sudo losetup /dev/loop0 TARGET
  2. sudo cryptsetup create CRYPTDEVNAME /dev/loop0 -c aes
    備註: 即使你輸入的密碼是錯誤的也不會有任何提示。
  3. sudo mkdir /media/MNTNAME
  4. sudo mount /dev/mapper/CRYPTDEVNAME /media/MNTNAME
    備註: 如果這時有錯誤,不要急著修復檔案系統,如果亂動,資料就一去不復返了。這一個錯誤有可能是因為之前在 cryptsetup 的時候,你輸入的密碼是錯誤的,使用 cryptsetup remove,然後回到 2 重新輸入一次你的密碼。
  5. ... (做你想做得事)
  6. sudo umount /media/MNTNAME
  7. sudo rmdir /media/MNTNAME
  8. sudo cryptsetup remove CRYPTDEVNAME
  9. sudo losetup -d /dev/loop0
我稍微講解一下,losetup 是用來把一個檔案「掛載」成為 LOOP device 的指令,我們一開始要先把檔案「掛載」成一個「裝置」。然後,cryptsetup 是利用 device mapper (裝置對映) 功能來進行加密,所以經過一次對映之後,我們的裝置會出現在 /dev/mapper 之中,我們可以用 sudo dmsetup ls 來觀察。剩下的就是我們要把 /dev/mapper 之中的那一個裝置,mount 到我們的系統樹,也就是 / 的上面,我遵照 Ubuntu 的習慣把它 mount 在 /media 之中的一個子資料夾。

另外,第 8, 9 二步是不能少的,不然有 root 權限的有心人士不用輸入密碼也可以 mount 你的資料。

備註: 用 losetup mount 起來的 device,其根目錄是只有 root 才有寫入權限的,解決方法是在根目錄用 sudo mkdir 建立一個子目錄,然後用 sudo chown 把使用權轉移給其他使用者。


後讀工作(可選):
  1. sudo modprobe -r dm_crypt
  2. sudo modprobe -r aes
這二個步驟是要用來卸載 dm_crypt 還有 aes 這二個系統模組。

1 則留言:

  1. [quote]
    備註: 用 losetup mount 起來的 device,其根目錄是只有 root 才有寫入權限的,解決方法是在根目錄用 sudo mkdir 建立一個子目錄,然後用 sudo chown 把使用權轉移給其他使用者。
    [/quote]
    其實只要chown account:account /media/xxxx
    就可以了...

    回覆刪除