將 LVM 上的 /tmp、/swap 及 /home 加密

這份指引將會協助你採用 cryptsetup LUKS 將 /tmp、/swap 及 /home 加密。我會假設你已經擁有一個安裝好的系統,而需要將 /tmp、/swap 及 /home 加密。我也假設 /home 內 藏有你的資料,因此請小心地將 /home 備份才繼續前進。CentOS wiki 內有另一份指引,但它針對將檔案加密,而不是分割區,因此我希望有一份特別針對 /tmp、/swap 及 /home 的指引。這份指引假設你需要將整個分割區加密,因此它們現有的資料將會被刪除。

系統:

CentOS 5.x

參考:

Encrypted Filesystem
Encrypted /tmp & /swap

系統設置

除非你在安裝時沒有選取 base,而選擇不安裝任何東西,否則你應該已經擁有加密時所需的工具。請先檢查,然後繼續前進。

# rpm -q cryptsetup device-mapper util-linux
# modprobe dm_crypt
# lsmod | grep dm_crypt

將 /home 備份

我應該不必再告訴你,但請確定你已經將 /home 備份到一個外置儲存器,然後才繼續前進!就算你的本地磁碟有空間,你亦不應將備份放在現有磁碟上,因為你將要在本地的檔案系統上動工。

# cp -arfp /home /some/external/storage

將 /swap 加密

讓我們先將 /swap 加密,檢查它能運作,然後才轉移到 /tmp。我會建議你將主機關掉,雖然你不想的話也不是必須的。由於直到下次開機前 swap 都不會再被存取,你可以立即將它加密。請現在就建立 /etc/crypttab 這個檔案,並加入 swap 的參數。

# vim /etc/crypttab
swap    /dev/vg0/swap   /dev/urandom    swap,cipher=aes-cbc-essiv:sha256

請依照你的磁碟區群組名稱及佈局,修改路徑來迎合你的需要。這裡指定加密系統在開機時採用 AES 的 SHA 256 位元加密法。每次開機所產生的新密鑰將會在系統中一直生效。關機的時候,這條密鑰不再有效,因此 /swap 便受到保護。

接著,編輯 /etc/fstab 來反映這些改動。

/dev/mapper/swap     none     swap     defaults     0 0

這樣便完成了 swap 的加密。你現在可以重新開機並查看 swap 已被重新啟用,或者你可以直接改動 /tmp。

將 /tmp 加密

加密 /tmp 的步驟與 /swap 的稍有不同。你須要在 /etc/fstab 被讀取後,利用一個腳本來掛載 /tmp。這個腳本要歸功給 clasohm.com,也就是我找到它的地方。當 /etc/fstab 穫處理後,一個加密的磁碟區便會被建立起來。基於 /tmp 的存取方法(我假設),/tmp 需要特別的處理。

首先,在 /etc/crypttab 內加入所需的記錄,並從 /etc/fstab 中注釋掉用來正常掛載 /tmp 的記錄。

# vim /etc/crypttab
tmp     /dev/vg0/tmp    /dev/urandom    tmp,cipher=aes-cbc-essiv:sha256

# vim /etc/fstab
# 請緊記將下列一行改為註釋。
#/dev/vg0/tmp     /tmp     ext3     defaults     1 2

複製來自 clasohm.ocm 的腳本,並將它放置在 /etc/init.d 內。

# vim /etc/init.d/cryptotmp

#!/bin/bash
#
# cryptotmp setup crypted tmp partition
#
# chkconfig: 2345 01 90
# description: adds crypted tmp partition.

. /etc/init.d/functions

# See how we were called.
case "$1" in
    start)
        mount /dev/mapper/tmp /tmp
        restorecon /tmp

        action "Adding encrypted tmp"

        touch /var/lock/subsys/cryptotmp
        ;;
    stop)
        rm -f /var/lock/subsys/cryptotmp
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        exit 1
esac

exit 0

將腳本設為可執行的,並將 chkconfig 執行在它身上。

# chmod +x /etc/init.d/cryptotmp
# chkconfig --add cryptotmp

它的原理與設定 /swap 相同。系統開機時,將會產生一條新的密鑰來加密 /tmp。當系統關機的時候,這條密鑰將會被丟棄,因此 /tmp 便受到保護。然而,假若你的腳本將東西寫入 /tmp,請留意 /swap 及 /tmp 的內容在開機時將會被清除。另外,clasohm.co 聲稱當 /swap 及 /tmp 被密後,你便無法將系統懸置在磁碟上,這是可以理解的。要在加密 /home 分割區前檢查一切是否運作正常,請重新開機,並確定它能使用 /swap 及 /tmp 啟動服務。

將 /home 加密

接著讓我們將 /home 加密。同樣地,你可以立即進行這一步,但如果你登入了這台機器,請先登出你的帳戶,並進到 root 的指令行。你須要卸下 /home 好讓你能夠將這個分割區加密,然後在上面重新建立一個檔案系統。我在這裡再三警告,將你的 /home 備份安置在你本地磁碟以外的地方!

如果你仍未這樣做,請現在備份。然後卸下 /home。

# cp -arfp /home /some/external/storage
# umount /home

在容器上設置 LUKS 的密碼。請確定你選擇一個強效的密碼,意思就是它包含大寫字母、小寫字母、符號、及數字。你的加密靠賴它了,因此不防採用一個長的密碼。

# cryptsetup luksFormat /dev/vg0/home

WARNING!
========
This will overwrite data on /dev/vg0/home irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

接著,利用你建立的密碼開啟加密的分割區。

# cryptsetup luksOpen /dev/vg0/home home
Enter LUKS passphrase:

請將隨機數據寫入裝置內,好叫檢視磁碟的人無法估計當中藏有多少資料。如果你擁有一個大的分割區,這樣做需時頗長,因此請去喝杯咖啡、梳打、或啤酒才返回來。你可以跳過這一步,但花時間來做它能增強加密的功效。

# dd if=/dev/urandom of=/dev/mapper/home

由於 dd 不顯示狀況,下面是一個檢視程序進行了多久的技巧。首先,找出以上 dd 指令的進程編號,然後利用 watch 及 kill 來顯示狀況的資訊。

# ps uxa | grep dd
# watch -n 20 kill -USR1 PID

現在你須要在分割區上建立檔案系統。

# mke2fs -j -O dir_index /dev/mapper/home
# tune2fs -l /dev/mapper/home

最後,關閉已加密的分割區。

# crypsetup luksClose home

正如 /swap 一樣,你須要編輯 /etc/fstab 並加入正確的路徑。

# vim /etc/fstab

#/dev/vg0/home           /home                   ext3    defaults        1 2
/dev/mapper/home        /home                   ext3    defaults        1 2

最後,將路徑加入 /etc/crypttab 內。如果你單單指定分割區及 home 目錄這兩參數,那麼每次開機時你都會被問及用來保護資料的 LUKS 密碼。你可以做一些別出心裁的事情,例如將你的金鑰放置在 USB 儲存器上,並且在開機時自動掛載它。但我看不見有這個需要。

# vim /etc/crypttab

home    /dev/vg0/home

現在嘗試重新開機。它應該啟動並詢問 LUKS 密碼。輸入它,然後電腦使會掛載 /home 目錄。接著你可以與舊的資料進行同步,很快你便擁有透過加密而受保護的 /tmp、/swap 及 /home。假如有人偷了你的硬件,你的資料應該仍然安全。當然,如果你想將其它分割區加密,你只需取代 /home 這個路徑便是了。舉個例說,你將機器備份在家中的一個備份目錄裡。我會複製以上的設置到家中的桌上電腦,並且將那用來儲存筆記型電腦備份的 /srv 目錄也加密。此外,如果你依然不太明白加密這玩意,請用 Knoppix 等 live CD 開機,然後探索檔案系統並嘗試掛載 /home。

有關 Knoppix 及 LVM 的提示:當開機完成後,請執行以下兩個指令以確保 Knoppix 檢查磁碟區群組。

# vgscan
# vgchange -a y

現在你將會看見 /dev/vg0/home 分割區存在,但你不能直接用 mount 來掛載它。你須要用 cryptsetup luksOpen 及 luksClose 來存取這個分割區。因此,這就證明了你的分割區是安全的。一如既往,請修正任何錯漏、留下改善建議、等等。另外,也多謝 clasohm.net 協助將 /tmp 及 /swap 加密,以及提供在開機時掛載 /tmp 的腳本。

加入 LUKS 金鑰

你應該可以為一個加密的裝置加入四至五條金鑰,因此假若你需要允許另一個人存取磁碟,請這樣做。

# cryptsetup luksAddKey /dev/vg0/home

有關調整 LVM 大小的備註

由於你進行了加密,這個短小的備註是關於日後調整 LVM 大小。你可以使用正常的指令,但你須要緊記一件事:當你將邏輯磁碟區延伸後,你須要使用加密了的對映裝置來調整大小,而不是一般的 LVM 路徑。

# lvextend -L+512M /dev/vg0/home
# resize2fs /dev/mapper/home

普遍來說,你會以 /dev/vg0/home 作為 resize2fs 的路徑,但由於檔案系統並不是真的掛載在那裡,請以加密檔案系統的路徑取代它。

Translation of revision 6

zh-tw/HowTos/EncryptTmpSwapHome (last edited 2019-12-09 09:11:41 by anonymous)