使用 cryptsetup 加密硬盘

cryptsetup 是 linux 下的一个常用加密工具,它通过调用内核中的 dm-crypt 来实现对磁盘的加密。
它既可以加密真实的物理磁盘、分区,也可以加密用文件来虚拟的磁盘、分区。
本文介绍一下加密整个磁盘的过程。
<!--more-->
## 格式化 LUKS 设备
```
cryptsetup luksFormat /dev/sda
```
如果是要加密分区 1 那就是 `/dev/sda1`
```
root@ubuntu:~# cryptsetup luksFormat /dev/sda
WARNING: Device /dev/sda already contains a 'crypto_LUKS' superblock signature.
WARNING!
========
This will overwrite data on /dev/sda irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sda:
Verify passphrase:
```
因为要对磁盘做破坏性数据覆盖,所以会有确认提示,输入大写的 `YES` 确认一下,然后会提示输入加密密码。
## 打开加密设备
```
cryptsetup luksOpen /dev/sda udisk
```
该命令会打开加密设备并将其映射到 `/dev/mapper/udisk`
查看磁盘信息:
```
fdisk -l
Disk /dev/sda: 2.75 TiB, 3000592982016 bytes, 5860533168 sectors
Disk model: WDC WD30EZRZ-00G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mapper/udisk: 2.75 TiB, 3000576204800 bytes, 5860500400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
```
查看映射设备信息:
```
cryptsetup status udisk
/dev/mapper/udisk is active.
type: LUKS2
cipher:aes-xts-plain64
keysize: 512 bits
key location: keyring
device:/dev/sda
sector size:512
offset:32768 sectors
size: 5860500400 sectors
mode: read/write
```
接下来格式化磁盘:
```
mkfs.ext4 /dev/mapper/udisk
```
或者也可以创建几个分区(只是举个例子,后续不分区):
```
Disk /dev/sda: 2.75 TiB, 3000592982016 bytes, 5860533168 sectors
Disk model: WDC WD30EZRZ-00G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mapper/udisk: 2.75 TiB, 3000576204800 bytes, 5860500400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 71FE272D-1ACF-E847-ADA1-70F7AEF8D5AD
Device Start End SectorsSize Type
/dev/mapper/udisk1 2048 3000000 29979531.4G Linux filesystem
/dev/mapper/udisk2 3000320 5860500366 58575000472.7T Linux filesystem
```
挂载后就可以使用了:
```
mount /dev/mapper/udisk /mnt/udisk
```
## 关闭加密设备
关闭前先卸除文件系统:
```
umount /mnt/udisk
```
再关闭映射设备:
```
cryptsetup luksClose udisk
```
如果磁盘 udisk 创建了多个分区,那么先把分区逐个关闭,然后在关闭磁盘,否则关闭时会提示 `Device udisk is still in use.`
## 拓展:系统启动时自动挂载加密磁盘
首先需要一个秘钥文件,这样才不需要在开机时输入密码。但这有个问题,如果只是你的磁盘被盗走了,里边的数据是解不了密的,但整机被盗走了那就失去了加密的意义。也可以考虑其他办法,比如将秘钥文件放在内网其他放服务器,或放在U盘里随身携带。
生成并添加秘钥文件:
```
dd if=/dev/urandom of=/root/enc.key bs=1 count=4096
cryptsetup luksAddKey /dev/sda /root/enc.key
```
若要删除秘钥文件:
```
cryptsetup luksRemoveKey /dev/sda -d /root/enc.key
```
修改配置文件 `/etc/crypttab` 添加映射关系:
```
# <target name> <source device> <key file> <options>
udisk /dev/sda /root/enc.key
```
修改配置文件 `/etc/fstab` 添加自动挂载配置:
```
/dev/mapper/udisk /mnt/udisk ext4 defaults 0 0
```
检查 fstab 是否正确,挂载一下试试:
```
mount -a
```
没问题就重启一下试试看。
## 拓展:文件虚拟加密磁盘
方法一:使用循环设备
```
dd if=/dev/zero of=loop.img bs=1M count=100
losetup /dev/loop20 loop.img
```
然后就可以像使用 /dev/sda 设备那样使用 /dev/loop20 了。
不用时卸载方法:
```
losetup -d /dev/loop20
```
方法二:直接使用文件
```
dd if=/dev/zero of=crypt.img bs=1M count=100
cryptsetup luksFormat crypt.img
file crypt.img # 查看文件类型信息
crypt.img: LUKS encrypted file, ver 2 [, , sha256] UUID: e028a422-cc0c-4ba8-9026-addf155b8a24
cryptsetup luksOpen crypt.img crypt
```
后续的用法没什么区别。
页:
[1]