cryptsetup 是 linux 下的一个常用加密工具,它通过调用内核中的 dm-crypt 来实现对磁盘的加密。
它既可以加密真实的物理磁盘、分区,也可以加密用文件来虚拟的磁盘、分区。
本文介绍一下加密整个磁盘的过程。
格式化 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 Sectors Size Type
/dev/mapper/udisk1 2048 3000000 2997953 1.4G Linux filesystem
/dev/mapper/udisk2 3000320 5860500366 5857500047 2.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
后续的用法没什么区别。