LUKS(Linux Unified Key Setup)是Redhat Linux提供的一种标准的设备加密系统。在文件系统被挂载之前一个被LUKS加密的分区或者卷必须先被解密,否则这个分区或者卷无法被挂载。
LUKS相关操作
1. 创建一个加密的分区
我们以虚拟机中的/dev/vdb1分区作为示例,将/dev/vdb1分区作为加密分区映射到/dev/mapper/mytest设备,需要设置加密密码,并且加密密码需要符合规范,需要注意yes需要大写。
[root@localhost ~]# cryptsetup luksFormat /dev/vdb1
WARNING! ========
This will overwrite data on /dev/vdb1 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/vdb1:
Verify passphrase:
2. 打开创建好的/dev/mapper映射
需要输入密码
[root@localhost ~]# cryptsetup open /dev/vdb1 mytest
Enter passphrase for /dev/vdb1:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 252:16 0 20G 0 disk
└─vdb1 252:17 0 20G 0 part
└─mytest 253:2 0 20G 0 crypt
sr0 11:0 1 1024M 0 rom
vda 252:0 0 20G 0 disk
├─vda2 252:2 0 1G 0 part /boot
├─vda3 252:3 0 19G 0 part
│ ├─centos-swap 253:1 0 2G 0 lvm [SWAP]
│ └─centos-root 253:0 0 17G 0 lvm /
└─vda1 252:1 0 4M 0 part
加密分区打开后能够通过lsblk看到对应的映射设备是mytest
对创建好的加密分区进行格式化
mkfs.ext4 /dev/mapper/mytest
然后直接对/dev/mapper/mytest进行挂载即可。
3. 关闭luks加密分区
cryptsetup close /dev/mapper/mytest
4. 检查一个分区是否是LUKS加密分区
[root@localhost ~]# cryptsetup isLuks /dev/vdb1 -v
Command successful.
[root@localhost ~]# cryptsetup isLuks /dev/vdb1 -v
Command failed with code -1 (wrong or missing parameters).
返回successful表示是加密分区,否则非加密分区。
上述操作是采用的在交互界面输入密码的方式进行加密解密,也可以采用密钥文件的方式,我们创建一个密钥文件/home/keyfile,将密钥写入到这个文件中
创建加密分区
[root@localhost home]# cryptsetup luksFormat /dev/vdb1 -d /home/keyfile
WARNING!
========
This will overwrite data on /dev/vdb1 irrevocably.
Are you sure? (Type uppercase yes): YES
打开加密分区
[root@localhost home]# cryptsetup open /dev/vdb1 mytest -d /home/keyfile
5. 查看LUKS加密分区状态
LUKS的加密分区一共提供了8个slot来用于加密,使用任意一个slot都可以用来解密,查看当前slot的使用情况,下面展示了/dev/vdb1的情况,可以看到只使用了slot0这一个密码槽位。可以使用一个密码来重启其他密码。
[root@localhost home]# cryptsetup luksDump /dev/vdb1
LUKS header information for /dev/vdb1
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 256
MK digest: 6b c0 2f 4b 62 0a f6 88 eb 9c 41 08 e7 65 76 f6 c2 17 98 e7
MK salt: 55 1e 20 10 fb 76 02 78 00 62 4e 97 11 de b1 32
7b 0d 5e 64 34 d6 d6 7b 25 fc c7 5c a5 d9 c0 59
MK iterations: 26903
UUID: f4172eb3-0194-489f-82e3-ef9704687369
Key Slot 0: ENABLED
Iterations: 431156
Salt: d3 69 cc e6 ee 9c 1f ae 70 a2 b0 11 f7 10 7a 8a
ea 6b ad 42 17 68 55 9e ca c5 ff 36 c8 af 6c 8a
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
6. 添加密码
由于LUKS加密一共有8个槽位,因此可以添加密码,也可以指定密码的槽位
[root@bogon home]# cryptsetup luksAddKey /dev/vdb1 -d /home/keyfile --key-slot=1
Enter new passphrase for key slot:
Verify passphrase:
添加完成后使用luksDump查看能够看到新的slot被启动,以后界面这个LUKS分区可以使用任意一个密码。
[root@bogon home]# cryptsetup luksDump /dev/vdb1
LUKS header information for /dev/vdb1
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 256
MK digest: 6b c0 2f 4b 62 0a f6 88 eb 9c 41 08 e7 65 76 f6 c2 17 98 e7
MK salt: 55 1e 20 10 fb 76 02 78 00 62 4e 97 11 de b1 32
7b 0d 5e 64 34 d6 d6 7b 25 fc c7 5c a5 d9 c0 59
MK iterations: 26903
UUID: f4172eb3-0194-489f-82e3-ef9704687369
Key Slot 0: ENABLED
Iterations: 431156
Salt: d3 69 cc e6 ee 9c 1f ae 70 a2 b0 11 f7 10 7a 8a
ea 6b ad 42 17 68 55 9e ca c5 ff 36 c8 af 6c 8a
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 429040
Salt: b0 7c 48 fd e8 5c f7 3d 69 28 6c 40 50 e1 01 76
cd 65 df 49 71 57 d7 00 bb 38 2a 14 59 ec a2 ce
Key material offset: 264
AF stripes: 4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
LUKS开机自动加载分区
在系统启动的时候如果需要被LUKS加密的卷能够自动挂载,需要执行以下操作:
1. /etc/crypttab文件中必须包含在boot的时候需要解密的设备,每行列出一个设备,格式如下:
name /dev/vdaN /path/to/keyfile
其中,name表示设备需要在/dev/mapper中映射的设备名称,/dev/vdaN表示需要解密的设备,/path/to/keyfile表示用于解密设备使用的密钥文件,如果此字段为空,则在启动的时候会提示用户输入解密密码。
2. 使用用户提供的密码或者使用keyfile中提供的密钥,加密的卷或者分区会被解密并映射到/dev/mapper/name设备
3. 如果加密卷解密成功,则会创建对应的解密后的映射设备,然后其内容可以直接提供访问。可以在/etc/fstab中编写条目进行挂载,可以通过映射文件名称或者直接使用设备的UUID进行挂载。例如:
/dev/mapper/name /secret ext4 default 1 2
或者
UUID="d8fc433d-2f08-480a-a631-20f3e102518e" /secret ext4 defaults 1 2
例如我们需要将/dev/vdb1这个LUKS加密后的分区挂载到/mnt目录下,/dev/vdb1映射后的设备是/dev/mapper/mytest,对应的加密文件是/home/keyfile,则我们需要在/etc/crypttab文件中添加如下内容:
[root@localhost ~]# cat /etc/crypttab mytest /dev/vdb1 /home/keyfile
/etc/fstab文件内容如下:
[root@localhost ~]# cat /etc/fstab
……………………
/dev/mapper/centos-root / xfs defaults 0 0
UUID=22284215-208d-405b-b482-c375b174a0d0 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/mapper/mytest /mnt ext4 defaults 0 0
LUKS配置备份与还原
当LUKS的加密被损坏,如果提前有备份可以通过备份的头文件来恢复损坏的部分。
1. LUKS头部备份
cryptsetup luksHeaderBackup /dev/vdb1 --header-backup-file=/home/luks.backup
2. LUKS头部还原
如果存在备份文件需要进行还原,最好先尝试使用备份的头文件进行解密,然后再还原
使用指定的头文件解密:
cryptsetup open /dev/vdb1 mytest --header-backup-file /home/luks.backup
还原指定的头文件
[root@bogon home]# cryptsetup luksHeaderRestore /dev/vdb1 --header-backup-file /home/luks.backup
WARNING!
========
Device /dev/vdb1 already contains LUKS header. Replacing header will destroy existing keyslots.
Are you sure? (Type uppercase yes): YES