如何在Linux中加密分区
1. 概述
在本文中,我们将学习如何在 Linux 中加密驱动器或分区。我们将通过使用 Cryptsetup 和 VeraCrypt 来解释驱动器的加密和解密机制。
最后,我们将了解如何在 Linux 安装过程中加密驱动器。
2. 加密设置
Cryptsetup 是我们可以用于磁盘加密的工具。它基于 DM-Crypt,这是 Linux 内核中的一个加密子系统。它不仅可以加密硬盘驱动器,还可以加密可移动媒体和文件。
Cryptsetup 使用 LUKS(Linux 统一密钥设置)标准。**LUKS 旨在提供磁盘加密规范,以促进各种发行版之间的兼容性。**因此,我们应该更倾向于使用 LUKS 进行分区加密。
2.1. 安装
cryptsetup包在大多数 Linux 发行版的官方存储库中可用,可以使用yum或apt 安装。
安装cryptsetup后,验证它:
$ cryptsetup --version
cryptsetup 2.3.6
2.2. 创建加密分区
现在,让我们首先使用lsblk 列出我们当前连接的驱动器:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 256M 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 115G 0 part /
sdb 8:16 1 29.3G 0 disk
└─sdb1 8:17 1 29.3G 0 part
正如我们所见,sda是主硬盘,而sdb是外接可移动硬盘。在本教程的其余部分,我们将使用sdb1分区。确保备份我们要加密的分区中的数据,因为我们将格式化该分区。
现在,我们将使用cryptsetup 格式化驱动器。这将为 LUKS 加密创建一个容器:
$ cryptsetup luksFormat --type luks1 /dev/sdb1
WARNING: Device /dev/sdb1 already contains a 'ntfs' superblock signature.
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdb1:
Verify passphrase:
让我们分解命令:
- 我们使用cryptsetup命令初始化了加密过程
- luksFormat标志告诉cryptsetup为 LUKS 格式化分区
- –type选项指定我们要使用第一个版本的LUKS
- 最后,我们指定了将成为 LUKS 容器的分区
请注意,该命令应以root访问权限运行。首先,我们会被警告,操作后数据将无法恢复。我们通过在提示符处提供YES来确认它,然后设置密码。之后,我们提供了加密密码。**密码越强,加密效果越好。*此外,我们可以通过提供-y*标志来抑制警告。
2.3. 解锁和挂载加密卷
该驱动器被格式化为LUKS,因此我们无法直接访问它。出于这个原因,我们需要使用cryptsetup为实际驱动器创建一个映射器。让我们打开加密驱动器:
$ cryptsetup -v luksOpen /dev/sdb1 my_drive
Enter passphrase for /dev/sdb1:
Key slot 0 unlocked.
Command successful.
让我们分解命令选项和参数:
- -v选项是启用详细执行
- luksOpen选项将创建一个我们可以用来访问分区的设备映射器
- / dev/sdb1是源(LUKS 卷)
- my_drive参数是目标名称
运行命令后,系统将提示我们输入为加密设置的密码。之后,cryptsetup将创建一个名为my_drive的映射器设备,该设备 位于*/dev/mapper*目录中。我们可以为目标名称选择任何名称。
让我们看看*/dev/mapper*目录里面有什么:
$ ls -l /dev/mapper
lrwxrwxrwx root 7B Sat Sep 4 21:36:42 2021 <em>my_drive</em> ⇒ ../dm-1
crw------- root 0B Sat Sep 4 20:55:01 2021 control
正如我们所见,my_drive是指向设备映射器的符号链接。** dm-1文件是一个虚拟文件,它映射到连接到系统的实际块设备。我们可以将 my_drive视为我们的加密分区。因此,我们可以将它安装在我们想要的任何位置。**
目前,我们的驱动器上没有任何文件系统。所以,让我们继续在上面创建一个文件系统:
$ mkfs.vfat -F32 /dev/mapper/my_drive
现在,我们可以挂载它并将我们的数据复制到其中:
$ mkdir -p /mnt/encrypted
$ mount /dev/mapper/my_drive /mnt/encrypted
再次运行lsblk,我们可以检查my_drive的类型:
$ lsblk | grep my_drive
└─my_drive 9:7 0 29.3G 0 crypt
2.4. 卸载卷
我们可以像任何其他卷一样卸载卷:
$ umount -R /dev/mapper/my_drive
虽然现在已卸载卷,但我们仍然需要关闭卷以从内核内存中删除映射和密钥。为此,我们可以使用特定于 LUKS 的luksClose命令:
$ cryptsetup luksClose my_drive
3. VeraCrypt
作为命令行上的一个简单替代方案,我们可以使用 VeraCrypt。VeraCrypt 可用于多种平台,例如 Linux、macOS 和 FreeBSD。因此,如果我们经常在多个平台之间切换,它是一个易于使用的选择。
VeraCrypt 带有图形界面和命令行工具。我们将在本节中使用命令行版本。
3.1. 安装
VeraCrypt 应该在我们发行版的官方存储库中可用。我们可以简单地使用yum或apt 来安装veracrypt包。
安装后,我们可以通过检查版本来验证它:
$ veracrypt --version
VeraCrypt 1.24-Update8
3.2. 创建加密卷
在创建vo之前虽然我们可以使用单行命令来创建一个加密分区,但是使用VeraCrypt的文本界面会更方便。我们可以通过将*–text*或 -t标志传递给 veracrypt来启动它:
$ veracrypt --text --create
Volume type:
1) Normal
2) Hidden
Select [1]: 1
–create或*-c标志告诉veracrypt创建一个卷。我们将使用正常*音量。在下一步中,我们将选择卷路径:
Enter volume path: /dev/sdb1
我们可以通过fdisk -l 或lsblk命令获取卷路径。在我们的例子中,我们将使用sdb1分区。在下一步中,输入帐户密码:
$ Enter your user password or administrator password:
接下来,我们将选择加密算法。我们将使用默认的 AES 加密:
Encryption Algorithm:
1) AES
2) Serpent
3) Twofish
4) Camellia
5) Kuznyechik
6) AES(Twofish)
7) AES(Twofish(Serpent))
8) Camellia(Kuznyechik)
9) Camellia(Serpent)
10) Kuznyechik(AES)
11) Kuznyechik(Serpent(Camellia))
12) Kuznyechik(Twofish)
13) Serpent(AES)
14) Serpent(Twofish(AES))
15) Twofish(Serpent)
Select [1]:
只需按Return即可选择默认值。对于散列算法,我们将使用默认的 SHA-512 选项:
Hash algorithm:
1) SHA-512
2) Whirlpool
3) SHA-256
4) Streebog
Select [1]:
在下一步中,我们将为卷选择一个文件系统:
Filesystem:
1) None
2) FAT
3) Linux Ext2
4) Linux Ext3
5) Linux Ext4
6) NTFS
7) exFAT
8) Btrfs
Select [2]:
在下一步中,我们将为卷设置密码:
Enter password:
WARNING: Short passwords are easy to crack using brute force techniques!
We recommend choosing a password consisting of 20 or more characters. Are you sure you want to use a short password? (y=Yes/n=No) [No]: y
Re-enter password:
Enter PIM:
Enter keyfile path [none]:
我们可以通过输入y来确认短密码。对于 PIM 和keyfile字段,按Return将它们留空。在下一步中,输入或粘贴有助于提高加密强度的秘密文本。这一步可以通过从*/dev/urandom读取并使用*xclip 复制内容来轻松完成。让我们打开另一个终端窗口并输入命令:
$ cat /dev/urandom | head -c320 | xclip -selection c
现在,我们可以将内容粘贴到该字段中:
$ Please type at least 320 randomly chosen characters and then press Enter: ~5�Q0~>۲,�DVGf�2�'�xf|O��⋱e�_�O] ...
一旦我们输入秘密文本,VeraCrypt 将开始创建分区。这将需要一段时间,具体取决于卷的大小:
Done: 100.000% Speed: 113 MiB/s Left: 0 seconds
The hidden VeraCrypt volume has been successfully created and is ready for use.
创建卷后,我们就可以挂载它了。
3.3. 解密和挂载卷
我们可以使用veracrypt命令挂载加密卷:
$ veracrypt /dev/sdb1 /mnt/my_drive
Enter password for /dev/sdb1:
Enter PIM for /dev/sdb1:
Enter keyfile [none]:
Protect hidden volume (if any)? (y=Yes/n=No) [No]:
第一个参数是卷,而第二个参数指定安装点。我们将被要求输入密码。对于其他字段,我们将按Return获取默认值,因为在这种情况下我们不需要它们。我们现在可以将数据复制到卷中。
3.4. 卸载卷
对于卸载,我们可以传递*-d或–dismount*标志,后跟卷路径:
$ veracrypt --dismount /dev/sdb1
4. 在 Linux 安装期间加密驱动器
我们可以加密根或主分区的最简单方法是在分发安装期间。在实时安装介质中启动时,我们会看到在磁盘分区期间加密磁盘的选项。
例如,在 Ubuntu 安装程序中,我们可以选中“Encrypt the new Ubuntu installation for security”选项来启用加密,如下图所示:
在下一步中,我们需要为加密设置密码:
一旦我们设置了密钥并安装了 Ubuntu,我们将被要求输入密钥以在启动 Ubuntu 时解密我们的分区:
尽管不同 Linux 发行版的加密方法可能会有所不同,但我们始终可以参考我们发行版的官方安装文档。