Linux

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中使用 Cryptsetup 與 LUKS2 格式加密 USB 隨身碟,保護機密資料不外洩。

確認 USB 隨身碟設備檔

將 USB 隨身碟插入 Linux 系統的電腦中。

USB 隨身碟

使用 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

使用 cryptsetupluksFormat 指令建立 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 加密磁碟之後,我們可以使用 cryptsetupluksDump 指令查看磁碟內的 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

接著使用 cryptsetupopen 指令開啟加密磁碟,並且建立一個映射檔:

# 開啟加密磁碟,建立映射檔
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 隨身碟一樣掛載使用,相當方便。

掛載加密 USB 隨身碟

檢查碼

在加密檔案系統中,複製或搬移重要的資料時,建議都以 MD5 或 SHA1 檢查碼進行檢查,避免資料因為硬體問題而損毀。

# 計算所有目錄與子目錄下每個檔案的 MD5 檢查碼(複製檔案前)
find . -type f -exec md5sum \{\} \; > md5sum.txt

# 驗證 MD5 檢查碼(複製檔案後)
md5sum -c md5sum.txt

參考資料

Share
Published by
Office Guide
Tags: 資訊安全

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup 與 LUKS 加密磁碟教學與範例

介紹如何使用 Cryptset...

1 年 ago