阡陌 发表于 2023-12-26 00:07:19

使用 cryptsetup 加密硬盘



![](https://file.mculoop.com/images/2022/03/ede44e35ece6d671.png)

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]
查看完整版本: 使用 cryptsetup 加密硬盘