[Linux] 如何使用 LUKS 建立加密的磁碟映像檔
全磁碟加密固然很方便,但如果你手頭上沒有新的硬碟呢?何不使用一個映像檔(.img
)來試試這個酷東西。
設定流程(需要 sudo)
-
建立一個空的映像檔:
fallocate -l 10G ~/encrypted.img
-
格式化/初始化 LUKS 裝置,並設定密碼:
sudo cryptsetup -vy luksFormat ~/encrypted.img
選項(更多):
-v, --verbose 詳細輸出,方便出問題的時候可以判斷 -y, --verify-passphrase 要求使用者輸入兩次以驗證密碼
範例輸出:
$ sudo cryptsetup -vy luksFormat ~/encrypted.img WARNING! ======== This will overwrite data on /home/play_pc/encrypted.img irrevocably. Are you sure? (Type uppercase yes): YES Enter passphrase for /home/play_pc/encrypted.img: Verify passphrase: Key slot 0 created. Command successful.
-
開啟 LUKS 裝置:
sudo cryptsetup luksOpen ~/encrypted.img encrypted_img # 不一定要是 encrypted_img,你也可以設定成別的
選項(更多):
-v, --verbose 詳細輸出,方便出問題的時候可以判斷 -y, --verify-passphrase 要求使用者輸入兩次以驗證密碼
範例輸出:
$ sudo cryptsetup luksOpen ~/encrypted.img encrypted_img Enter passphrase for /home/play_pc/encrypted.img:
-
格式化裝置:
sudo mkfs -t ext4 /dev/mapper/encrypted_img # 請使用上一步設定的名稱
選項(更多):
-t, --type type 檔案系統格式,預設為 ext2
範例輸出:
$ sudo mkfs -t ext4 /dev/mapper/encrypted_img mke2fs 1.45.5 (07-Jan-2020) Creating filesystem with 2617344 4k blocks and 655360 inodes Filesystem UUID: 322266d8-a9a1-4a70-b95b-7cacdb25e8f7 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
-
掛載裝置:
sudo mount /dev/mapper/encrypted_img /mnt
成功!
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/encrypted_img 9.8G 37M 9.3G 1% /mnt ...略...
-
卸載裝置:
怎麼來的,就怎麼回去!
sudo umount /mnt # 卸載檔案系統 sudo cryptsetup luksClose encrypted_img # 關閉 LUKS 裝置
掛載流程(不用 sudo)
-
開啟磁碟映像檔:
udisksctl loop-setup -f ~/encrypted.img
選項(更多):
-f, --file=FILE 要開啟的映像檔(loop device) -r, --read-only 以唯獨方式開啟
範例輸出:
$ udisksctl loop-setup -f ~/encrypted.img ==== AUTHENTICATING FOR org.freedesktop.udisks2.loop-setup === Authentication is required to set up a loop device Authenticating as: Play-PC (play_pc) Password: ==== AUTHENTICATION COMPLETE === Mapped file /home/play_pc/encrypted.img as /dev/loop6.
-
開啟 LUKS 裝置:
udisksctl unlock -b /dev/loopXX # 請將 loopXX 替換成上一步的輸出
選項(更多):
-b, --block-device=DEVICE 要開啟的裝置(block),例如:/dev/sda.
範例輸出:
$ udisksctl unlock -b /dev/loop6 Passphrase: ==== AUTHENTICATING FOR org.freedesktop.udisks2.encrypted-unlock === Authentication is required to unlock the encrypted device /dev/loop6 Authenticating as: Play-PC (play_pc) Password: ==== AUTHENTICATION COMPLETE === Unlocked /dev/loop6 as /dev/dm-0.
-
掛載 LUKS 裝置:
udisksctl mount -b /dev/dm-X # 請將 dm-X 替換成上一步的輸出
範例輸出:
$ udisksctl mount -b /dev/dm-0 ==== AUTHENTICATING FOR org.freedesktop.udisks2.filesystem-mount === Authentication is required to mount /dev/mapper/luks-4043126f-f97e-4cbb-adba-eac50c0c4d06 Authenticating as: Play-PC (play_pc) Password: ==== AUTHENTICATION COMPLETE === Mounted /dev/dm-0 at /media/play_pc/322266d8-a9a1-4a70-b95b-7cacdb25e8f7.
成功!
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/dm-0 9.8G 37M 9.3G 1% /media/play_pc/322266d8-a9a1-4a70-b95b-7cacdb25e8f7 ...略...
-
卸載:
怎麼來的,就怎麼回去!
udisksctl unmount -b /dev/dm-X # 卸載檔案系統,請將 dm-X 替換成第 2 步的輸出 udisksctl lock -b /dev/loopX # 鎖住裝置,請將 loopX 替換成第 2 步的輸出 udisksctl loop-delete -b /dev/loopX # 解除 loop 裝置(磁碟映像檔),請將 loopX 替換成第 2 步的輸出
範例輸出:
$ udisksctl unmount -b /dev/dm-0 Unmounted /dev/dm-0. $ udisksctl lock -b /dev/loop6 Locked /dev/loop6. $ udisksctl loop-delete -b /dev/loop6
找不到指令 cryptsetup
如果你安裝的是桌面/圖形界面版的 Ubuntu,預設情形下可能不會安裝它,請手動安裝:
sudo apt install cryptsetup
找不到指令 udisksctl
如果你安裝的是伺服器/文字界面版的 Ubuntu,預設情形下可能不會安裝它,請手動安裝:
sudo apt install udisks2
Q: 如何確認 loop 裝置已經被解除
A: 可以使用 udisksctl
提供的 info
功能,如果有裝置的話才會有 IdUUID
等訊息(以下是有的情況)
$ udisksctl info -b /dev/loop6
/org/freedesktop/UDisks2/block_devices/loop6:
org.freedesktop.UDisks2.Block:
Configuration: []
CryptoBackingDevice: '/'
Device: /dev/loop6
...略...
IdType: crypto_LUKS
IdUUID: 4043126f-f97e-4cbb-adba-eac50c0c4d06
IdUsage: crypto
...略...
org.freedesktop.UDisks2.Loop:
Autoclear: false
BackingFile: /home/play_pc/encrypted.img
SetupByUID: 1000
參考資料
-
How to create an encrypted LUKS disk image – Shaakunthala’s Miniblog
- 這篇筆記很大一部份是參考這篇文章的步驟做的,不過有些指令改成自己習慣的形式
-
How to mount an image file without root permission? – Unix & Linux Stack Exchange
- 解釋了如何使用
udisksctl
設定 loop 裝置
- 解釋了如何使用
-
Mount encrypted volumes from command line? – Ask Ubuntu
- 解釋了如何使用
udisksctl
開啟 LUKS 裝置
- 解釋了如何使用
後記
時至今日,多數的智慧型手機都已經預設開啟全磁碟加密,相信有些人也會開始轉換桌面系統到這樣的環境之中,提前開始習慣這樣的使用情境。我也不例外,畢竟物理安全對帶著走的裝置(e.g. 筆電)是不可能達成的目標,我可不想有一天需要重視資料安全的時候才開始發現,原來許多舊的習慣是行不通的。