如何使用 DM-Crypt 在 Ubuntu VPS 上创建加密卷
状态:已弃用
本文涵盖不再受支持的 Ubuntu 版本。如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
- 升级到 Ubuntu 14.04。
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到支持的版本
原因:
请参阅:
介绍
对于存储在可访问互联网的计算机上的任何类型的数据,安全性应该是首要考虑的问题。虽然每个存储提供商都应该注意从他们的端保护数据,但这仅限于通过服务器上的服务软件缺陷、社会工程和许多其他途径发生未经授权的访问。简而言之,您应该对任何数据的加密和安全负责,以免落入坏人之手。
有许多方法可以在 Linux 系统上加密内容。其中许多选项依赖于加密单独的分区、设备或文件系统。如果您正在处理像 VPS 这样的系统,这可能不是一个选项。但是,还有其他选择,例如创建一个文件作为设备来存储加密数据。
在本指南中,我们将使用 dm-crypt
工具创建一个可用于存储敏感数据的大型加密文件。然后我们可以像挂载普通分区一样挂载这个文件。我们将在 Ubuntu 12.04 VPS 实例上进行演示,但类似的过程也适用于其他发行版。
基本理念
dm-crypt
是一种提供透明磁盘加密的内核级加密机制。这意味着文件在安装后无需任何额外交互即可立即可用。
虽然大多数加密方案都依赖于分区级别的加密,但我们可以通过使用挂载为设备映射目标的文件来解决这个问题。我们通过将文件挂载为循环设备来完成此操作。然后我们可以将数据存储在这个挂载的“设备”上,就像我们对任何其他分区或设备所做的那样。
在考虑实施任何类型的加密时,您需要权衡一些利弊。首先,加密总是会带来性能开销。这可能重要也可能不重要,我们建议您先创建一个小文件来运行测试,然后再大规模实施。
另一个考虑因素是恢复。加密,由于其主要功能,使恢复更加困难。如果您忘记了密码,您的数据实际上将永远丢失。如果您的 LUKS 标头被覆盖或损坏,您的数据也将永远丢失。如果您的系统没有启动,而您需要访问加密文件中的信息,您将必须通过更复杂的过程才能获得访问权限。
在决定加密数据时,您需要意识到如果出现问题可能会丢失该数据。您一定要备份任何数据,dm-crypt 在这里提供了很多关于如何备份的信息。
安装 dm-crypt 工具
虽然内核级功能应该在您的发行版中可用,但默认情况下可能未安装实际的前端工具。本指南中的所有命令都将以 root 身份执行。
我们可以通过更新本地包索引并安装 dm-crypt
工具来获取必要的工具:
apt-get update
apt-get install cryptsetup
这将引入使用 dm-crypt
卷所需的所有依赖项和辅助实用程序。
创建一个非稀疏的空文件
为了存储我们的加密数据,我们需要创建一个文件作为我们的存储设备。
我们想创建一个空文件,但我们不能让它成为一个稀疏文件,它在创建时实际上并没有分配完整的文件大小。我们可以通过多种方式做到这一点。
进行此操作的最简单和最快捷的方法是使用 fallocate
命令。这会立即为文件分配您想要的磁盘数量,并为其分配您给它的文件名。
例如,要在 root 用户的主目录中创建一个 512MB 的文件,我们可以键入:
fallocate -l 512M /root/test1
这是非常快的,但它确实有一个缺点,即它不会用零或随机数据覆盖那些块曾经使用的任何旧的、已删除的数据。这可能不符合您的目的,因为我们不希望人们能够分辨出文件的哪个部分写入了加密数据。
另一种选择是使用无处不在的 dd
命令。我们可以使用 /dev/zero
伪设备将零写入我们为文件配置的整个区域。我们可以通过键入以下内容来创建与上述文件类似的文件:
dd if=/dev/zero of=/root/test2 bs=1M count=512
相反,如果您想写入随机数据,这应该模仿实际写入的加密数据,您可以改用随机伪设备之一。这将花费更长的时间,特别是如果您正在分配一个大文件,但使用随机设备可能是为此目的配置文件的最佳方式:
dd if=/dev/urandom of=/root/test3 bs=1M count=512
使用 /dev/random
伪设备是一种更安全的方法,同样以时间为代价:
dd if=/dev/random of=/root/test4 bs=1M count=512
在文件中创建一个 dm-crypt LUKS 容器
在我们格式化刚刚创建的文件之前,我们应该在文件中创建一个 LUKS 分区。 LUKS,即 Linux Unified Key Setup,是磁盘加密的标准。这是我们所有其他数据都位于其上的基本层。
dm-crypt
工具提供了一种创建该层的非常简单的方法。我们可以使用此命令创建容器。
cryptsetup -y luksFormat /root/test1
您将需要确认您希望覆盖文件的内容。仔细检查您引用的文件,以免意外覆盖错误的文件。确认后,输入“是”继续。
然后,系统会要求您设置解密数据所需的密码。请记住:如果您丢失了此密码,则保存到我们将创建的文件系统中的所有数据都将丢失。将此密码安全地存储在不会丢失或一定要记住的地方。 -y
选项将允许我们验证密码以确保我们没有犯任何错误。
如果我们现在检查该文件,我们可以看到它现在被称为 LUKS 加密文件:
file /root/test1
test1: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: 1851db36-3223-4ee1-8e3e-cc65c49e05f3
现在我们已经在文件之上构建了容器,我们可以像这样打开容器:
<前>
在我们的例子中,我们将使用我们的 /root/test1
文件并将其命名为 volume1
:
cryptsetup luksOpen /root/test1 volume1
您将必须提供为文件设置的密码,这是解密文件所必需的。
这将打开 LUKS 设备,并将其映射到我们提供的名称,在我们的例子中,在 /dev/mapper/volume1
中创建一个文件。这基本上将文件作为本地环回设备打开,以便系统的其余部分现在可以像处理真实设备一样处理文件。
创建和挂载文件系统
现在我们已经创建了一个 LUKS 容器并且它在我们的系统中作为常规设备打开,我们可以开始对其进行常规设备操作。
首先,我们需要在我们的设备上格式化并创建一个文件系统。你可以选择任何你喜欢的文件系统。我们将使用标准的 Ext4 文件系统,但您可以使用您的服务器配置为正常处理的任何文件系统。
出于我们的目的,我们要使用的命令是:
mkfs.ext4 -j /dev/mapper/volume1
我们现在有一个文件系统写在我们文件中包含的 LUKS 容器之上。由于它像设备一样被处理,我们的下一步逻辑上是安装设备。
让我们创建一个有意义的安装位置:
mkdir /mnt/files
现在,我们只需要挂载我们的文件系统:
mount /dev/mapper/volume1 /mnt/files
您现在可以将我们的文件视为可用文件系统的一部分:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 2.7G 54G 5% /
udev 2.0G 12K 2.0G 1% /dev
tmpfs 791M 216K 791M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
/dev/mapper/volume1 486M 2.3M 459M 1% /mnt/files
您可以看到我们文件中的一些可用空间已被加密开销和文件系统开销占用。不过,我们仍然拥有大部分空间。
如果我们检查我们安装文件的位置,我们可以看到它的配置与任何其他 Ext4 文件系统完全一样:
cd /mnt/files
ls
lost+found
已创建正常的 lost+found
恢复目录。我们现在可以将数据写入此位置,它将被加密放置在我们的文件中。例如,我们可以将我们的 /etc
目录复制到挂载位置:
cp -r /etc/* /mnt/files
卸载文件系统并关闭 LUKS 容器
当我们完成写入或读取数据时,我们使用正常方法卸载文件系统:
cd
umount /mnt/files
这会将 /dev/mapper/volume1
位置从我们位于 /mnt/files
的挂载点分离:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 2.7G 54G 5% /
udev 2.0G 12K 2.0G 1% /dev
tmpfs 791M 216K 791M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
但是,我们的文件仍处于打开状态,并且可以作为 /dev/mapper/volume1
供系统使用。
ls /dev/mapper/
control volume1
control
设备是用于创建其他映射设备的设备。我们可以安全地忽略它,因为它应该在这里。
要关闭 volume1
文件并保护其内容,我们必须关闭该文件,基本上从文件中删除设备映射。这意味着您将无法再访问文件的内容,直到您再次提供密码:
cryptsetup luksClose volume1
如果我们检查我们的设备映射目录,我们将看到我们的 volume1
设备已被删除:
ls /dev/mapper
control
我们的卷现在已卸载,LUKS 容器已关闭,我们的数据已完全加密并受密码保护。
直接使用程序
为了将初始创建过程与日常使用分开,我们将快速运行您使用该文件所需的过程。
现在你有了LUKS文件,当你想使用它的时候,你可以直接打开LUKS文件:
cryptsetup luksOpen /root/test1 volume1
您可以在此处选择与第一次使用不同的名称,只要文件处于打开状态,它就会起作用。输入卷的密码。
然后,挂载已映射的设备:
mount /dev/mapper/volume1 /mnt/files
您现在可以访问和读取或写入文件的内容。
完成后,您必须再次卸载设备:
umount /mnt/files
卸载设备后,您可以再次关闭 LUKS 文件以加密数据:
cryptsetup luksClose volume1
结论
您现在应该能够创建一个加密文件来存储您的敏感数据。请记住,通常需要在性能、易用性和安全性之间进行权衡。另外,请记住,您绝不能丢失您设置的密码,因为绝对没有办法恢复它。
虽然这不是保护数据所需的唯一考虑因素,但希望您可以将其添加到工具箱中以加强 Linux 服务器的安全性。