Contents

如何在Linux中加密分区

1. 概述

在本文中,我们将学习如何在 Linux 中加密驱动器或分区。我们将通过使用 Cryptsetup 和 VeraCrypt 来解释驱动器的加密和解密机制。

最后,我们将了解如何在 Linux 安装过程中加密驱动器。

2. 加密设置

Cryptsetup 是我们可以用于磁盘加密的工具。它基于 DM-Crypt,这是 Linux 内核中的一个加密子系统。它不仅可以加密硬盘驱动器,还可以加密可移动媒体和文件。

Cryptsetup 使用 LUKS(Linux 统一密钥设置)标准。**LUKS 旨在提供磁盘加密规范,以促进各种发行版之间的兼容性。**因此,我们应该更倾向于使用 LUKS 进行分区加密。

2.1. 安装

cryptsetup包在大多数 Linux 发行版的官方存储库中可用,可以使用yumapt 安装。

安装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 应该在我们发行版的官方存储库中可用。我们可以简单地使用yumapt 来安装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 -llsblk命令获取卷路径。在我们的例子中,我们将使用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”选项来启用加密,如下图所示:

/uploads/encrypt_partition/1.png

在下一步中,我们需要为加密设置密码:

/uploads/encrypt_partition/2.png

一旦我们设置了密钥并安装了 Ubuntu,我们将被要求输入密钥以在启动 Ubuntu 时解密我们的分区:

/uploads/encrypt_partition/3.jpg

尽管不同 Linux 发行版的加密方法可能会有所不同,但我们始终可以参考我们发行版的官方安装文档。