4 min read

Linux 系统如何使用 LUKS 加密分区?

Linux 系统如何使用 LUKS 加密分区?

对于一些敏感数据,最常见的方法就是对它进行加密,尤其是将这些服务存在公有云环境。以下为如何使用 LUKS 套件来加密我们私密信息。

安装 cryptsetup 软件包

  1. 安装cryptsetup
apt-get install cryptsetup

RHEL / CentOS / Oracle / Scientific Linux 系统请使用以下命令来安装cryptsetup

yum install cryptsetup-luks
  1. 配置 LUKS 分区
 cryptsetup -y -v luksFormat /dev/sdb

可以使用指定参数:

cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 /dev/sdb

输出样例:

WARNING!
========
This will overwrite data on /dev/sdb irrevocably.
 
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
Verify passphrase: 
Command successful.

提示 :输入的YES 为大写。

此命令初始化卷,并设置初始密钥或密码短语。请注意,密码短语不可恢复,因此不要忘记它。请键入以下命令创建映射:

cryptsetup luksOpen /dev/sdb backup2

输出样例:

Enter passphrase for /dev/sdb:

这里已经系统已经存在一个mapper设备

# ls -l /dev/mapper/backup2

输出样例:

lrwxrwxrwx 1 root root 7 Oct 19 19:37 /dev/mapper/backup2 -> ../dm-0

此时可以使用以下命令来查看mapper状态:

# cryptsetup status backup2

输出样例:

/dev/mapper/backup2 is active.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/sdb
  offset:  4096 sectors
  size:    419426304 sectors
  mode:    read/write
Command successful.

可以使用以下命令来导出 KUKS 头部信息

# cryptsetup luksDump /dev/sdb

输出样例:

LUKS header information for /dev/sdb
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	256
MK digest:     	21 07 68 54 77 96 11 34 f2 ec 17 e9 85 8a 12 c3 1f 3e cf 5f 
MK salt:       	8c a6 3d 8c e9 de 16 fb 07 fd 8e d3 72 d7 db 94 
               	7e e0 75 f9 e0 23 24 df 50 26 fb 92 f8 b5 dd 70 
MK iterations: 	222000
UUID:          	4dd563a9-5bff-4fea-b51d-b4124f7185d1
 
Key Slot 0: ENABLED
	Iterations:         	2245613
	Salt:               	05 a8 b4 a2 54 f7 c6 ee 52 db 60 b6 12 7f 2f 53 
	                      	3f 5d 2d 62 fb 5a b1 c3 52 da d5 5f 7b 2d 38 32 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

3. 格式化LUKS分区

使用以下命令来清空分区上的数据(可选)

# dd if=/dev/zero of=/dev/mapper/backup2

以上命令可能会消耗大量时间,且看不到进度,可以使用以下命令:

# pv -tpreb /dev/zero | dd of=/dev/mapper/backup2 bs=128M

或者

# dd if=/dev/zero of=/dev/mapper/backup2 status=progress

完成后,可以对分区进行格式化了并进行挂载

# mkfs.ext4 /dev/mapper/backup2
# mkdir /backup2
# mount /dev/mapper/backup2 /backup2

QA

如何对数据进行安全卸载?

# umount /backup2
# cryptsetup luksClose backup2

如何对数据分区进行挂载?

# cryptsetup luksOpen /dev/sdb backup2
# mount /dev/mapper/backup2 /backup2
# df -H
# mount

如何修复 LUKS 分区?

# umount /backup2
# fsck -vy /dev/mapper/backup2
# mount /dev/mapper/backup2 /backu2

如何对加密分区更改加密密码?

# cryptsetup luksDump /dev/sdb
# cryptsetup luksAddKey /dev/sdb

输出样例:

Enter any passphrase: 
Enter new passphrase for key slot: 
Verify passphrase: 

移动旧密码

# cryptsetup luksRemoveKey /dev/sdb

如何使用本地文件块来进行加密?

分配10GB文件

fallocate -l 10G /root/encrypted-container

创建10GB文件容器的另一种方法是使用以下命令:

truncate -s 10G /root/encrypted-container

此命令的优点是文件以占用文件系统上的0个字节开始,并根据需要增长。

如何对LUKS标头进行备份和还原?

**警告:**请仔细遵循这些步骤。

由于LUKS标头非常重要而丢失它意味着丢失整个容器,请将其备份:

cryptsetup luksHeaderBackup /dev/sdX --header-backup-file sdX-luks-header

测试意外覆盖LUKS标头的场景:

dd conv=notrunc if=/dev/zero of=/dev/sdX bs=128 count=1

尝试打开容器现在将返回错误:

cryptsetup luksOpen /dev/sdX sdX-luks

恢复有效标头:

cryptsetup luksHeaderRestore /dev/sdX --header-backup-file sdX-luks-header

再次打开容器:

cryptsetup luksOpen /dev/sdX sdX-luks

关于LUKS密钥

LUKS提供了八个密钥槽,每个槽都可用于存储可用于访问和解密数据的密码。添加和删除这些密码的基本命令。

要更改密码:

cryptsetup luksChangeKey /dev/sdX

要设置可以解锁容器的其他密码:

cryptsetup luksAddKey /dev/sdX

要从密钥槽中删除密码:

cryptsetup luksRemoveKey /dev/sdX

要查看正在使用的密钥槽:

cryptsetup luksDump /dev/sdX