Stratis 入门 – 加密

Stratis 在其上描述 官方网站 作为“易于使用的 Linux 本地存储管理”。 看到这个 短视频 快速演示基础知识。 该视频是在 Red Hat Enterprise Linux 8 系统上录制的。 视频中显示的概念也适用于 Stratis Fedora.

Stratis 2.1 版引入了对加密的支持。 继续阅读以了解怎样开始在 Stratis 中使用加密。

先决条件

加密需要 Stratis 2.1 或更高版本。 这篇文章中的例子使用了一个预发布的 Fedora 33. Stratis 2.1 将在最终版本中提供 Fedora 33.

您还需要至少一个可用的块设备来创建加密池。 下面显示的示例是在具有 5 GB 虚拟磁盘驱动器 (/dev/vdb) 的 KVM 虚拟机上完成的。

在内核密钥环中创建密钥

Linux 内核密钥环用于存储加密密钥。 有关内核密钥环的更多信息,请参阅密钥环手册页 (man keyrings)。

使用stratis key set 命令在内核密钥环中设置密钥。 您必须指定应从何处读取密钥。 要从标准输入读取密钥,请使用 –capture-key 选项。 要从文件中检索密钥,请使用 –keyfile-path 选项。 最后一个参数是关键描述。 稍后在您创建加密的 Stratis 池时将使用它。

为了 example,要创建一个描述为 pool1key 的密钥,并从标准输入中读取密钥,你需要输入:

# stratis key set --capture-key pool1key
Enter desired key data followed by the return key:

该命令提示我们输入密钥数据/密码,然后在内核密钥环中创建密钥。

要验证密钥是否已创建,请运行stratis key list:

# stratis key list
Key Description
pool1key

这将验证 pool1key 是否已创建。 请注意,这些键不是持久的。 如果主机重新启动,则需要再次提供密钥才能访问加密的 Stratis 池(此过程稍后介绍)。

如果您有多个加密池,它们可以具有单独的密钥,也可以共享相同的密钥。

也可以使用以下 keyctl 命令查看密钥:

# keyctl get_persistent @s
318044983
# keyctl show
Session Keyring
 701701270 --alswrv      0     0  keyring: _ses
 649111286 --alswrv      0 65534   _ keyring: _uid.0
 318044983 ---lswrv      0 65534   _ keyring: _persistent.0
1051260141 --alswrv      0     0       _ user: stratis-1-key-pool1key

创建加密的 Stratis 池

现在已经为 Stratis 创建了密钥,下一步是创建加密的 Stratis 池。 加密池只能在创建池时完成。 当前无法加密现有池。

使用stratis pool create 命令创建一个池。 添加 –key-desc 和您在上一步中提供的密钥描述 (pool1key)。 这将向 Stratis 发出信号,应使用提供的密钥对池进行加密。 下面 example 在 /dev/vdb 上创建 Stratis 池,并将其命名为 pool1。 请务必在您的系统上指定一个空的/可用的设备。

# stratis pool create --key-desc pool1key pool1 /dev/vdb

您可以使用 stratis pool list 命令验证池是否已创建:

# stratis pool list 
Name                     Total Physical   Properties
pool1   4.98 GiB / 37.63 MiB / 4.95 GiB      ~Ca, Cr

在上面显示的示例输出中,~Ca 表示缓存已禁用(波浪号否定该属性)。 Cr 表示启用了加密。 请注意,缓存和加密是相互排斥的。 不能同时启用这两个功能。

接下来,创建一个文件系统。 下面 example,演示了创建一个名为 filesystem1 的文件系统,将它挂载到 /filesystem1 挂载点,并在新文件系统中创建一个测试文件:

# stratis filesystem create pool1 filesystem1
# mkdir /filesystem1
# mount /stratis/pool1/filesystem1 /filesystem1
# cd /filesystem1
# echo "this is a test file" > testfile

重启后访问加密池

当您重新启动时,您会注意到 Stratis 不再显示您的加密池或其块设备:

# stratis pool list
Name   Total Physical   Properties
# stratis blockdev list
Pool Name   Device Node   Physical Size   Tier

要访问加密池,首先使用您之前使用的相同密钥描述和密钥数据/密码重新创建密钥:

# stratis key set --capture-key pool1key
Enter desired key data followed by the return key:

接下来,运行stratis pool unlock 命令,并验证您现在可以看到池及其块设备:

# stratis pool unlock
# stratis pool list
Name                      Total Physical   Properties
pool1   4.98 GiB / 583.65 MiB / 4.41 GiB      ~Ca, Cr
# stratis blockdev list
Pool Name   Device Node   Physical Size   Tier
pool1       /dev/dm-2          4.98 GiB   Data

接下来,挂载文件系统并验证您是否可以访问之前创建的测试文件:

# mount /stratis/pool1/filesystem1 /filesystem1/
# cat /filesystem1/testfile 
this is a test file

使用 systemd 单元文件在启动时自动解锁 Stratis 池

无需人工干预即可在启动时自动解锁 Stratis 池。 但是,包含密钥的文件必须可用。 在某些环境中,将密钥存储在文件中可能是一个安全问题。

下面显示的 systemd 单元文件提供了一种在启动时解锁 Stratis 池并挂载文件系统的简单方法。 欢迎对更好/替代方法的反馈。 您可以在本文末尾的评测部分提供建议。

首先使用以下命令创建密钥文件。 请务必使用您之前输入的相同密钥数据/密码替换密码。

# echo -n passphrase > /root/pool1key

确保文件只能被 root 读取:

# chmod 400 /root/pool1key
# chown root:root /root/pool1key

在 /etc/systemd/system/stratis-filesystem1.service 创建一个 systemd 单元文件,内容如下:

[Unit]
Description = stratis mount pool1 filesystem1 file system
After = stratisd.service

[Service]
ExecStartPre=sleep 2
ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key
ExecStartPre=stratis pool unlock
ExecStartPre=sleep 3
ExecStart=mount /stratis/pool1/filesystem1 /filesystem1
RemainAfterExit=yes

[Install]
WantedBy = multi-user.target

接下来,启用该服务,使其在启动时运行:

# systemctl enable stratis-filesystem1.service

现在重新启动并验证 Stratis 池是否已自动解锁并且其文件系统已挂载。

总结与结论

在当今的环境中,加密是许多人和组织的必需品。 这篇文章展示了怎样在 Stratis 2.1 中启用加密。

相关阅读:

Posted in: LinuxTags: ,