介绍
安全性应该是存储在互联网可访问计算机上的任何类型的数据的主要关注点。 虽然每个存储提供商都应该注意从他们的末端保护数据,但是这只会导致未经授权的访问可能发生在服务器上的服务器,社交工程和许多其他渠道的软件缺陷。 简而言之,您应该拥有所有数据的加密和安全性,您不能承受这些数据落入错误的手中。
有许多方法可以在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
量。
创建Non-Sparse空文件
为了存储我们的加密数据,我们需要创建一个文件作为我们的存储设备。
我们想创建一个空文件,但是我们不能是一个稀疏文件,它在创建时实际上不会分配完整的文件大小。 我们可以通过各种方式做到这一点。
最简单的和要对这个操作最快的方法是用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容器
在我们的格式,我们刚刚创建的文件,我们应该创建该文件中的陆氏分区。 陆氏或Linux统一密钥设置,是磁盘加密的标准。 这是我们所有其他数据的基本层。
在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
现在我们已经在我们的文件之上构建了容器,我们可以这样打开容器:
cryptsetup luksOpen /path/to/LUKS/file mapping_name
在我们的例子中,我们将使用我们的/root/test1
文件并将其命名volume1
:
cryptsetup luksOpen /root/test1 volume1
您将必须提供您为文件设置的密码,这是解密它需要的。
这将打开陆氏设备,并将其映射到我们供货,我们的情况下,建立在文件的名称/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服务器上的安全性。