[Linux]如何使用 LUKS 建立加密的磁碟映像檔
全磁碟加密固然很方便,但如果你手頭上沒有新的硬碟呢?何不使用一個映像檔(.img
)來試試這個酷東西。
設定流程(需要 sudo)
-
建立一個空的映像檔:
12fallocate -l 10G ~/encrypted.img -
格式化/初始化 LUKS 裝置,並設定密碼:
12sudo cryptsetup -vy luksFormat ~/encrypted.img選項(更多):
123-v, --verbose 詳細輸出,方便出問題的時候可以判斷-y, --verify-passphrase 要求使用者輸入兩次以驗證密碼範例輸出:
123456789101112$ sudo cryptsetup -vy luksFormat ~/encrypted.imgWARNING!========This will overwrite data on /home/play_pc/encrypted.img irrevocably.Are you sure? (Type uppercase yes): YESEnter passphrase for /home/play_pc/encrypted.img:Verify passphrase:Key slot 0 created.Command successful. -
開啟 LUKS 裝置:
12sudo cryptsetup luksOpen ~/encrypted.img encrypted_img # 不一定要是 encrypted_img,你也可以設定成別的選項(更多):
123-v, --verbose 詳細輸出,方便出問題的時候可以判斷-y, --verify-passphrase 要求使用者輸入兩次以驗證密碼範例輸出:
123$ sudo cryptsetup luksOpen ~/encrypted.img encrypted_imgEnter passphrase for /home/play_pc/encrypted.img: -
格式化裝置:
12sudo mkfs -t ext4 /dev/mapper/encrypted_img # 請使用上一步設定的名稱選項(更多):
123-t, --type type檔案系統格式,預設為 ext2範例輸出:
123456789101112$ sudo mkfs -t ext4 /dev/mapper/encrypted_imgmke2fs 1.45.5 (07-Jan-2020)Creating filesystem with 2617344 4k blocks and 655360 inodesFilesystem UUID: 322266d8-a9a1-4a70-b95b-7cacdb25e8f7Superblock backups stored on blocks:32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632Allocating group tables: doneWriting inode tables: doneCreating journal (16384 blocks): doneWriting superblocks and filesystem accounting information: done -
掛載裝置:
12sudo mount /dev/mapper/encrypted_img /mnt成功!
12345$ df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/encrypted_img 9.8G 37M 9.3G 1% /mnt...略... -
卸載裝置:
怎麼來的,就怎麼回去!
123sudo umount /mnt # 卸載檔案系統sudo cryptsetup luksClose encrypted_img # 關閉 LUKS 裝置
掛載流程(不用 sudo)
-
開啟磁碟映像檔:
12udisksctl loop-setup -f ~/encrypted.img選項(更多):
12345-f, --file=FILE要開啟的映像檔(loop device)-r, --read-only以唯獨方式開啟範例輸出:
12345678$ udisksctl loop-setup -f ~/encrypted.img==== AUTHENTICATING FOR org.freedesktop.udisks2.loop-setup ===Authentication is required to set up a loop deviceAuthenticating as: Play-PC (play_pc)Password:==== AUTHENTICATION COMPLETE ===Mapped file /home/play_pc/encrypted.img as /dev/loop6. -
開啟 LUKS 裝置:
12udisksctl unlock -b /dev/loopXX # 請將 loopXX 替換成上一步的輸出選項(更多):
123-b, --block-device=DEVICE要開啟的裝置(block),例如:/dev/sda.範例輸出:
123456789$ udisksctl unlock -b /dev/loop6Passphrase:==== AUTHENTICATING FOR org.freedesktop.udisks2.encrypted-unlock ===Authentication is required to unlock the encrypted device /dev/loop6Authenticating as: Play-PC (play_pc)Password:==== AUTHENTICATION COMPLETE ===Unlocked /dev/loop6 as /dev/dm-0. -
掛載 LUKS 裝置:
12udisksctl mount -b /dev/dm-X # 請將 dm-X 替換成上一步的輸出範例輸出:
12345678$ 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-eac50c0c4d06Authenticating as: Play-PC (play_pc)Password:==== AUTHENTICATION COMPLETE ===Mounted /dev/dm-0 at /media/play_pc/322266d8-a9a1-4a70-b95b-7cacdb25e8f7.成功!
12345$ df -hFilesystem Size Used Avail Use% Mounted on/dev/dm-0 9.8G 37M 9.3G 1% /media/play_pc/322266d8-a9a1-4a70-b95b-7cacdb25e8f7...略... -
卸載:
怎麼來的,就怎麼回去!
1234udisksctl unmount -b /dev/dm-X # 卸載檔案系統,請將 dm-X 替換成第 2 步的輸出udisksctl lock -b /dev/loopX # 鎖住裝置,請將 loopX 替換成第 2 步的輸出udisksctl loop-delete -b /dev/loopX # 解除 loop 裝置(磁碟映像檔),請將 loopX 替換成第 2 步的輸出範例輸出:
12345678$ udisksctl unmount -b /dev/dm-0Unmounted /dev/dm-0.$ udisksctl lock -b /dev/loop6Locked /dev/loop6.$ udisksctl loop-delete -b /dev/loop6
找不到指令 cryptsetup
如果你安裝的是桌面/圖形界面版的 Ubuntu,預設情形下可能不會安裝它,請手動安裝:
1 2 |
sudo apt install cryptsetup |
找不到指令 udisksctl
如果你安裝的是伺服器/文字界面版的 Ubuntu,預設情形下可能不會安裝它,請手動安裝:
1 2 |
sudo apt install udisks2 |
Q: 如何確認 loop 裝置已經被解除
A: 可以使用 udisksctl
提供的 info
功能,如果有裝置的話才會有 IdUUID
等訊息(以下是有的情況)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ 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. 筆電)是不可能達成的目標,我可不想有一天需要重視資料安全的時候才開始發現,原來許多舊的習慣是行不通的。