介紹如何在 Linux 系統中使用 Cryptsetup 與 LUKS2 格式加密 USB 隨身碟,保護機密資料不外洩。
確認 USB 隨身碟設備檔
將 USB 隨身碟插入 Linux 系統的電腦中。
使用 lsblk
指令確認 USB 隨身碟在 Linux 系統中的設備路徑:
# 查看所有 block device
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 1 0B 0 disk sdb 8:16 1 0B 0 disk sdc 8:32 1 28.9G 0 disk nvme0n1 259:0 0 476.9G 0 disk ├─nvme0n1p1 259:1 0 260M 0 part /boot/efi ├─nvme0n1p2 259:2 0 16M 0 part ├─nvme0n1p3 259:3 0 195.3G 0 part ├─nvme0n1p4 259:4 0 1.1G 0 part ├─nvme0n1p5 259:5 0 200M 0 part ├─nvme0n1p6 259:6 0 279.1G 0 part / └─nvme0n1p7 259:7 0 977M 0 part [SWAP]
通常從磁碟的大小就可以判別 USB 隨身碟的設備是那一個,以這裡的例子來說,我們的 USB 隨身碟容量是 32GB,所以對應的設備是 /dev/sdc
。
另外也可以查看 dmesg
的訊息來判斷 USB 隨身碟的設備:
# 查看 dmesg 訊息
dmesg
[ 2751.533819] usb 4-2: new SuperSpeed USB device number 18 using xhci_hcd [ 2751.555333] usb 4-2: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.10 [ 2751.555343] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2751.555347] usb 4-2: Product: DataTraveler 3.0 [ 2751.555349] usb 4-2: Manufacturer: Kingston [ 2751.555351] usb 4-2: SerialNumber: AC220B280C83E2A1D93291BF [ 2751.558337] usb-storage 4-2:1.0: USB Mass Storage device detected [ 2751.558610] scsi host2: usb-storage 4-2:1.0 [ 2752.582880] scsi 2:0:0:0: Direct-Access Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6 [ 2752.583478] sd 2:0:0:0: Attached scsi generic sg2 type 0 [ 2752.583721] sd 2:0:0:0: [sdc] 60604416 512-byte logical blocks: (31.0 GB/28.9 GiB) [ 2752.584052] sd 2:0:0:0: [sdc] Write Protect is off [ 2752.584058] sd 2:0:0:0: [sdc] Mode Sense: 45 00 00 00 [ 2752.584321] sd 2:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 2752.749311] sd 2:0:0:0: [sdc] Attached SCSI removable disk
格式化 USB 隨身碟
確認 USB 隨身碟的設備檔之後,以 Cryptsetup 在 USB 隨身碟中建立一個 LUKS2 container,若系統上沒有 cryptsetup
指令,可以先使用 apt 安裝:
# 安裝 cryptsetup 套件
sudo apt install cryptsetup
使用 cryptsetup
的 luksFormat
指令建立 LUKS2 container,這個動作會抹除 USB 隨身碟中所有的資料,所以要先確認 USB 隨身碟中沒有重要資料,確認沒問題後,輸入大寫的 YES
執行:
# 在 /dev/sdc 磁碟中建立 LUKS2 container sudo cryptsetup -v -y --type luks2 luksFormat /dev/sdc
WARNING! ======== This will overwrite data on /dev/sdc irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sdc: Verify passphrase: Key slot 0 created. Command successful.
建立好 LUKS2 加密磁碟之後,我們可以使用 cryptsetup
的 luksDump
指令查看磁碟內的 LUKS 標頭資訊:
# 查看 /dev/sdc 磁碟中的 LUKS 標頭資訊
sudo cryptsetup luksDump /dev/sdc
LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: e1e5d761-5dc7-4c5e-b2c4-4117a950adba Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 0: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2id Time cost: 5 Memory: 1048576 Threads: 4 Salt: ad e2 72 02 eb 9f 43 70 5d b0 fd 5a b8 d0 67 35 77 58 5c 8b bd 54 1b ab 58 5c 6c 3b f7 89 40 d7 AF stripes: 4000 AF hash: sha256 Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 Tokens: Digests: 0: pbkdf2 Hash: sha256 Iterations: 230760 Salt: a6 22 af 15 92 d6 04 ab c3 c0 29 7a 0a 86 db 64 40 bb eb 7d 3e 66 a8 fc 49 30 c0 15 c2 84 73 63 Digest: 52 da a7 da 32 fc 18 bd bc cd f5 59 75 60 d8 d9 19 64 e8 cc 73 88 d4 75 85 7c 5c 00 5c 9a 65 8e
接著使用 cryptsetup
的 open
指令開啟加密磁碟,並且建立一個映射檔:
# 開啟加密磁碟,建立映射檔 sudo cryptsetup open --type luks /dev/sdc encUSBDisk
Enter passphrase for /dev/sdc:
開啟機磁碟時,要輸入密碼,密碼正確才能開啟加密磁碟。
接著以 dd
指令進行 USB 隨身碟的完整格式化(若不在意被外界偷看磁碟的使用狀況,也可以省略這一步驟):
# 完整磁碟格式化 sudo dd if=/dev/zero of=/dev/mapper/encUSBDisk bs=128M status=progress
使用 mkfs.ext4
指令在 USB 加密磁碟建立 Ext4 檔案系統:
# 在加密磁碟上建立 Ext4 檔案系統
sudo mkfs.ext4 /dev/mapper/encUSBDisk
mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 7571456 4k blocks and 1893120 inodes Filesystem UUID: 67420f69-1688-4f6e-a628-6447b323c7c2 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
最後建立掛載目錄,掛載加密的 USB 隨身碟:
# 建立掛載目錄 sudo mkdir /mnt/encUSBDisk # 掛載加密 USB 隨身碟 sudo mount /dev/mapper/encUSBDisk /mnt/encUSBDisk
透過 df
指令確認機的隨身碟是否有正常掛載:
# 檢查磁碟掛載狀況 df -h
檔案系統 容量 已用 可用 已用% 掛載點 udev 3.7G 0 3.7G 0% /dev tmpfs 764M 1.9M 762M 1% /run /dev/nvme0n1p6 274G 26G 235G 10% / tmpfs 3.8G 123M 3.7G 4% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/nvme0n1p1 256M 52M 205M 21% /boot/efi tmpfs 764M 92K 764M 1% /run/user/1000 /dev/mapper/encUSBDisk 29G 24K 27G 1% /mnt/encUSBDisk
由於 Ext4 檔案系統有支援使用者與群組權限,我們可以將其擁有者更改為自己平常用的使用者與群組,使用上會比較方便:
# 更改 USB 加密磁碟擁有者
sudo chown myuser:mygroup /mnt/encUSBDisk
確認加密的隨身碟可以正常使用後,可以使用以下指令卸載:
# 卸載加密磁碟 sudo umount /mnt/encUSBDisk # 關閉加密磁碟 sudo cryptsetup close encUSBDisk
桌面環境使用加密 USB 隨身碟
以 LUKS2 加密的 USB 隨身碟在一般的 Linux 桌面環境中通常都會被自動偵測出來,在掛載時只要輸入密碼,就可以像一般的 USB 隨身碟一樣掛載使用,相當方便。
檢查碼
在加密檔案系統中,複製或搬移重要的資料時,建議都以 MD5 或 SHA1 檢查碼進行檢查,避免資料因為硬體問題而損毀。
# 計算所有目錄與子目錄下每個檔案的 MD5 檢查碼(複製檔案前) find . -type f -exec md5sum \{\} \; > md5sum.txt # 驗證 MD5 檢查碼(複製檔案後) md5sum -c md5sum.txt