Linux 系统如何使用 LUKS 加密分区?
对于一些敏感数据,最常见的方法就是对它进行加密,尤其是将这些服务存在公有云环境。以下为如何使用 LUKS 套件来加密我们私密信息。
安装 cryptsetup 软件包
- 安装
cryptsetup
apt-get install cryptsetup
RHEL / CentOS / Oracle / Scientific Linux 系统请使用以下命令来安装cryptsetup
yum install cryptsetup-luks
- 配置 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