如何使用DM-Crypt在UbuntuVPS上创建加密卷
状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
对于存储在可访问 Internet 的计算机上的任何类型的数据,安全性应该是首要考虑的问题。 虽然每个存储提供商都应该注意保护他们的数据,但这只是在未经授权的访问可能通过服务器上服务的软件缺陷、社会工程和许多其他途径发生的情况下进行。 简而言之,您应该拥有任何您无法承受落入坏人之手的数据的加密和安全性。
有很多方法可以在 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
命令。 这会立即为文件分配您想要的磁盘数量,并为其分配您给它的文件名。
例如,要在我们的根用户的主目录中创建一个 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 统一密钥设置是磁盘加密的标准。 这是我们所有其他数据都将位于其之上的基础层。
dm-crypt
工具提供了一种非常简单的方法来创建这个层。 我们可以使用此命令创建容器。
cryptsetup -y luksFormat /root/test1
您需要确认您希望覆盖文件的内容。 仔细检查您引用的文件,以免意外覆盖错误的文件。 确认后,键入“YES”继续。
然后将要求您设置解密数据所需的密码。 记住:如果您丢失了这个密码,任何保存到我们将创建的文件系统中的数据都将丢失。 将此密码安全地存储在不会丢失的地方或确保记住它。 -y
选项将允许我们验证密码以确保我们没有犯任何错误。
如果我们现在检查该文件,我们可以看到它现在被称为 LUKS 加密文件:
file /root/test1
test1: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: 1851db36-3223-4ee1-8e3e-cc65c49e05f3
现在我们已经在文件之上构建了容器,我们可以像这样打开容器:
cryptsetup luksOpen /path/to/LUKS/file mapping_name
在我们的例子中,我们将使用我们的 /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 服务器的安全性。