如何配置加密的ZFS池DigitalOcean块存储在FreeBSD

ZFS是一个文件系统和卷管理器,支持高存储容量,支持压缩,并可以防止数据损坏。 ZFS,与DigitalOcean的合并块存储 ,提供的存储解决方案,易于设置和扩展。

在本指南中,您将为FreeBSD上的ZFS配置块加密的存储卷,以确保数据安全。

先决条件

  • 在支持块存储的数据中心中的FreeBSD Droplet(具有至少4GB的RAM)作为ZFS往往是非常内存密集型的,特别是如果你有兴趣做块重复数据删除。 我们将使用当你创建一个FreeBSD的Droplet将被自动创建默认的FreeBSD帐户。 要了解更多关于登录到您的FreeBSDDroplet和基础管理,检查出入门FreeBSD的系列教程。
  • 100 GB卷附加到您的Droplet。 当您创建Droplet您可以创建此卷,也可以使用本指南创建和附加卷。

本教程还将使用第二个100GB卷演示如何向池中添加卷,但不需要预先设置它; 在第5步期间将在上下文中覆盖指令。

第1步 - 分区卷

即使我们将整个卷用于单个文件系统,通常一个好主意是在卷上放置一个分区映射。 这使我们可以应用我们创建的有意义的标签分区。

首先,我们确认音量已附加并可用。 登录您的Droplet。

ssh freebsd@your_server_ip

登录后,确认该卷已连接通过查看输出dmesg命令。 对于FreeBSD的Droplet本地SSD出现vtbd0和任何附加卷将出现da的设备。

使用grep过滤结果dmesg的命令da0 ,这是我们的附着量。 了解更多关于grep在我们的教程使用grep和正则表达式搜索在Linux文本模式

dmesg | grep ^da0

您将看到类似于以下内容的输出:

Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1
da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

验证卷可用后,使用GPT格式创建分区映射。 执行以下命令:

sudo gpart create -s gpt da0

接下来,为ZFS创建单个分区。

sudo gpart add -t freebsd-zfs -l volume-nyc1-01 da0

-t标志让我们指定分区类型和-l选项让我们应用标签的分区。 标签可以是我们喜欢的任何东西。 在这种情况下,我们将使它与卷的名称匹配,以帮助保持一致。

现在让我们保护我们将放置在这个分区上的数据免于窥探。

第2步 - 设置加密

加密数据有很多好处,并且易于设置。 让我们来激活AESNI驱动程序,所以我们可以利用硬件加速AES加密:

sudo kldload aesni

现在,我们可以配置格力的分区加密。 我们将使用geli命令并指定密钥的长度,我们要加密的分区:

sudo geli init -l 256 /dev/gpt/volume-nyc1-01

-l选项指定密钥的长度,其中,必须为128位或256位的AES-XTS算法。 我们使用我们之前指定的标签引用分区。

当您执行命令时,将提示您输入密码:

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
can be restored with the following command:

    # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01

每当您的Droplet重新启动,您将需要输入此密码以重新附加加密分区。 这是一个小小的不便,以换取更好的安全。

现在附加加密分区:

sudo geli attach /dev/gpt/volume-nyc1-01

系统将提示您输入在初始化分区时输入的密码:

OutputEnter passphrase:

这将设置/dev/gpt/volume-nyc1-01.eli ,这是分区的解密版本。 写入该块设备的数据被加密并写入到底层设备。 这是我们将附加到我们的存储池的路径,我们将在下面创建它。

第3步 - 设置ZFS池

ZFS存储池或zpool是卷的集合,这是ZFS如何管理其文件系统。 它们很容易创建。 由于DigitalOcean卷实现了自己的数据冗余,因此无需创建多个卷并对其进行镜像,或者以RAID-Z配置运行它们; 我们可以直接在池中使用单个卷。

zpool create命令创建一个新的zpool。 它接收池的名称和要添加到池的卷。

sudo zpool create tank /dev/gpt/volume-nyc1-01.eli

我们使用的通用名称tank为我们的泳池,但你可以用你喜欢的任何名称。

由于卷通过网络连接,文件访问将比本地SSD上的慢。 为了最小化通过网络写入设备的数据量,让我们在ZFS文件系统层启用压缩。 这是完全可选的,并且可以基于每个文件系统设置。

我们将使用LZ4压缩算法,该算法针对速度进行了优化,同时仍然提供了令人满意的压缩。 对于其他选项,请参考zfs手册页。

sudo zfs set compression=lz4 tank

现在让我们来看看我们的游泳池。 我们可以用得到一些详细资料zpool list命令:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  99.5G  98.5K  99.5G         -     0%     0%  1.00x  ONLINE  -

由于分区和格式化开销,池的总大小略小于总卷大小。

我们也可以看到了ZFS文件系统在该池中使用zfs list命令:

zfs list
OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank    61K  96.4G    19K  /tank

或使用df命令:

df -h
OutputFilesystem         Size    Used   Avail Capacity  Mounted on
/dev/gpt/rootfs     57G    2.2G     50G     4%    /
devfs              1.0K    1.0K      0B   100%    /dev
tank                96G     19K     96G     0%    /tank

您将经常使用这些命令来检查新文件系统的运行状况。

在我们继续之前,让我们确保ZFS内核模块在我们启动操作系统时启动。 该模块是,当我们跑了为我们自动加载zpool create与命令sudo ,但如果模块自动加载它会更好。

要做到这一点,编辑文件/etc/rc.conf

sudo vi /etc/rc.conf

在文件中任何现有行之后添加此行:

/etc/rc.conf
zfs_enable="YES"

然后将更改保存到文件。 当服务器重新启动时,ZFS内核模块将加载。

ZFS的一个好处是能够随着我们的需求增加而向池中添加更多存储。 让我们探讨它是如何工作的。

第4步 - 向池中添加其他卷

如果我们需要更多的空间,我们可以用额外的卷扩展池。 使用ZFS,只需要向池中添加一个额外的设备。

首先,我们需要另一个设备。 将一个新的100GB卷附加到您的Droplet。 请参见本指南 ,了解如何做到这一点的详细信息。

一旦卷准备就绪,请返回到服务器的终端并验证新卷是否存在并已连接。 新的卷将被认定为da1

dmesg | grep ^da1
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2
da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

接下来,使用与用于第一个卷相同的过程分区和标记新卷。 首先创建分区:

sudo gpart create -s gpt da1

然后创建卷:

sudo gpart add -t freebsd-zfs -l volume-nyc1-02 da1

由于现有卷已加密,请在此新卷上启用加密:

sudo geli init -l 256 /dev/gpt/volume-nyc1-02

再次提示您输入密码,以便对卷进行解密和附加。

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
can be restored with the following command:

    # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02

然后附加此新卷,提示时提供密码:

sudo geli attach /dev/gpt/volume-nyc1-02

最后将其添加到ZFS池:

sudo zpool add tank /dev/gpt/volume-nyc1-02.eli

文件系统自动扩展为池的大小,您可以使用以下命令验证:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank   199G   140K   199G         -     0%     0%  1.00x  ONLINE  -

我们可以用仔细检查zfs list命令:

zfs list

输出显示tank容积和空间的正确用量:

OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank  62.5K   193G    19K  /tank

当您需要更多空间时,只需重复此过程即可向池中添加更多卷。

我们已经将加密分区添加到池中,所以让我们看看如何在服务器重新启动后重新连接它们。

第5步 - 处理重新启动

重新启动服务器时,将不再附加加密分区。 您必须手动附加它们。 对于实践,让我们通过重新启动,以便您可以看到该过程。

使用shutdown命令,重新启动服务器,这将断开SSH会话。

sudo shutdown -r now

系统可能需要大约一分钟才能重新启动。 一旦机器恢复在线,请重新登录到您的Droplet。

ssh freebsd@your_server_ip

然后附加加密分区。

sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02

附加每个分区时,将提示您输入在初始化分区时输入的密码。

现在看看使用池的结果zpool

sudo zpool list

一旦分区连接,ZFS将自动查看池并装入文件系统。

OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank   199G  95.5K   199G         -     0%     0%  1.00x  ONLINE  -

如果我们没有加密卷,我们不必担心在重新启动过程中这些额外的步骤。 我们为了提高安全性而交易便利; 没有人可以附加卷并查看没有密码短语的内容。

结论

如您所见,ZFS和DigitalOcean的块存储使您可以轻松地根据需要创建可扩展的加密文件系统。 您可以了解更多关于在FreeBSD上的ZFS FreeBSD使用手册

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏