[实验] Linux 硬盘的加密 (通过 crypt 实现)

纪念:站主于 2019 年 11 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

步骤一:硬盘加密后的注意事项

1) 加密后不能直接挂载
2) 加密后硬盘丢失也不用担心数据被盗
3) 加密后必须做映射才能挂载

步骤二:生成一个新的分区

2.1 显示现有的分区

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   10G  0 disk 
└─vda1 253:1    0   10G  0 part /
vdb    253:16   0   10G  0 disk 

(补充:在这里是加了一个 vdb 硬盘用来进行分区并加密)

2.2 创建一个新的分区

# fdisk /dev/vdb
命令(输入 m 获取帮助):n
分区号 (1-8,默认 1):
起始 扇区 (0-20971440,默认 0):
Last 扇区 or +扇区 or +size{K,M,G,T,P} (0-20971440,默认 20971440):+5G
分区 1 已设置为 Linux native 类型,大小设为 5 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

2.2 显示新的分区

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   10G  0 disk 
└─vda1 253:1    0   10G  0 part /
vdb    253:16   0   10G  0 disk 
└─vdb1 253:17   0    5G  0 part 

步骤三:创建逻辑卷

3.1 创建卷组

# vgcreate mysqldatavg /dev/vdb1
WARNING: sun signature detected on /dev/vdb1 at offset 508. Wipe it? [y/n]: y
  Wiping sun signature on /dev/vdb1.
  Physical volume "/dev/vdb1" successfully created.
  Volume group "mysqldatavg" successfully created

3.2 创建逻辑卷

# lvcreate -n mysqldatalv -L 1G mysqldatavg
  Logical volume "mysqldatalv" created.

步骤四:给逻辑卷加密

4.1 给逻辑卷加密

# cryptsetup luksFormat /dev/mapper/mysqldatavg-mysqldatalv

WARNING!
========
这将覆盖 /dev/mapper/mysqldatavg-mysqldatalv 上的数据,该动作不可取消。

Are you sure? (Type uppercase yes): YES
输入 /dev/mapper/mysqldatavg-mysqldatalv 的口令:
确认密码:

4.2 解锁逻辑卷

# cryptsetup luksOpen /dev/mapper/mysqldatavg-mysqldatalv mysqldata

之后输入 /dev/mapper/mysqldatavg-mysqldatalv 的解密密码

(补充:这里的 mysqldata 是解锁后的虚拟硬件名)

4.3 格式化逻辑卷

# mkfs.ext4 /dev/mapper/mysqldata

(注意:要先解锁了逻辑卷以后才能格式化逻辑卷)

4.4 锁住逻辑卷

# cryptsetup luksClose mysqldata

(补充:这里的 mysqldata 是要锁住的虚拟硬件名)

内容五:自动挂载加密逻辑卷

5.1 修改系统自动挂载文件

# vim /etc/fstab

添加以下内容:

......
/dev/mapper/mysqldata /var/lib/mysql ext4 defaults 0 0

(补充:这里以将硬盘 /dev/mapper/mysqldata 挂载到目录 /var/lib/mysql 为例)

5.2 创建一个映射器

# vim /etc/cypttab

添加以下内容:

......
mysqldata /dev/mapper/mysqldatavg-mysqldatalv /root/keyfile luks


补充:这里的 4 个参数分别代表:
1) 虚拟设备名,这里是 mysqldata
2) 真实设备,这里是硬盘 /dev/mapper/mysqldatavg-mysqldatalv
3) 密码的存储文件,这里是密钥 /root/keyfile
4) 加密类型,这里是 luks

5.3 创建随机密钥文件

# dd if=/dev/urandom of=/root/keyfile bs=1024 count=4

(补充:这里以生成名为 /root/keyfile 的密钥文件为例)

5.4 将密钥文件设为只读

# chmod 0400 /root/keyfile

(补充:这里的 /root/keyfile 是刚刚生成的密钥文件)

5.5 将密钥添到 luks 中,让刚刚生成的密钥生效

5.5.1 将密钥文件添到 luks 中
# cryptsetup luksAddKey /dev/mysqldatavg/mysqldatalv /root/keyfile

或者:

# cryptsetup luksAddKey /dev/mysqldatavg/mysqldatalv --key-file /root/keyfile


补充:
1) 这里的 /dev/mysqldatavg/mysqldatalv 是要添加密钥的硬盘
2) 这里的 /root/keyfile 是要添加的密钥

5.5.2 将密钥文件添到 luks 中 (同时添加 1 个密码)
# cryptsetup luksAddKey /dev/mysqldatavg/mysqldatalv UUID="2eg8c60ac-103k-4771-k31r-14t93b06226a" --key-file /root/keyfile


补充:
1) 这里的 /dev/mysqldatavg/mysqldatalv 是要添加密钥的硬盘
2) 这里的 /root/keyfile 是要添加的密钥
3) 这里的 2eg8c60ac-103k-4771-k31r-14t93b06226a 是添加的密码

5.6 测试挂载效果

5.6.1 挂载加密逻辑卷
# mount -a
5.6.2 测试加密效果
# df -h