如何在 Linux 上使用 gocryptfs 加密文件

Gocryptfs 在文件级别进行加密,因此同步操作可以在每个文件上高效工作。
153 位读者喜欢这篇文章。
Filing papers and documents

Gocryptfs 是一个用户空间文件系统 (FUSE) 挂载的文件级加密程序。FUSE 挂载意味着加密文件存储在一个单一的目录树中,该目录树像 USB 密钥一样使用 FUSE 接口挂载。这允许任何用户进行挂载——你不需要成为 root 用户。由于 gocryptfs 在文件级别进行加密,因此复制文件的同步操作可以在每个文件上高效工作。这与磁盘级加密形成对比,在磁盘级加密中,整个磁盘作为一个单一的大型二进制 blob 进行加密。

当你在正常模式下使用 gocryptfs 时,你的文件以加密格式存储在你的磁盘上。但是,当你挂载加密文件时,你可以像访问计算机上的任何其他文件一样,获得对文件的未加密访问权限。这意味着你所有的常规工具和程序都可以使用你的未加密文件。更改、新文件和删除会实时反映在存储在你磁盘上的文件的加密版本中。

安装 gocryptfs

Fedora 上安装 gocryptfs 很简单,因为它已针对 Fedora 30 和 Rawhide 进行了打包。因此,sudo dnf install gocryptfs 完成所有必需的安装工作。如果你没有使用 Fedora,你可以在 快速入门 中找到从源代码安装、在 Debian 上安装或通过 Homebrew 安装的详细信息。

初始化你的加密文件系统

要开始使用,你需要决定将加密文件存储在哪里。此示例将文件保存在 ~/.sekrit_files 中,这样它们在执行普通 ls 时不会显示出来。

首先初始化文件系统。这将需要你选择一个密码。强烈建议你使用一个从未在其他任何地方使用过的唯一密码,因为这是你解锁文件的密钥。项目作者建议使用熵值在 64 到 128 位之间的密码。假设你使用大小写字母和数字,这意味着你的密码应该在 11 到 22 个字符之间。如果你使用密码管理器,这应该很容易通过生成的密码实现。

当你初始化文件系统时,你将看到一个唯一的密钥。将此密钥安全地存储在某处,因为它允许你在需要恢复文件但忘记密码时访问你的文件。该密钥无需密码即可工作,因此请保密!

初始化例程如下所示

$ mkdir ~/.sekrit_files
$ gocryptfs -init ~/.sekrit_files
Choose a password for protecting your files.
Password: 
Repeat: 

Your master key is:

    XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-
    XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX

If the gocryptfs.conf file becomes corrupted or you ever forget your password,
there is only one hope for recovery: The master key. Print it to a piece of
paper and store it in a drawer. This message is only printed once.
The gocryptfs filesystem has been created successfully.
You can now mount it using: gocryptfs .sekrit_files MOUNTPOINT

如果你查看 ~/.sekrit_files 目录,你将看到两个文件:一个配置文件和一个唯一的目录级初始化向量。你无需手动编辑这两个文件。请确保不要删除这些文件。

使用你的加密文件系统

要使用你的加密文件系统,你需要挂载它。这需要一个空目录,你可以在其中挂载文件系统。例如,使用 ~/my_files 目录。正如你从初始化中看到的那样,挂载很容易

$ gocryptfs ~/.sekrit_files ~/my_files
Password: 
Decrypting master key
Filesystem mounted and ready.

如果你查看 ~/my_files 目录,你会看到它是空的。配置和初始化向量文件不是数据,因此它们不会显示出来。让我们在文件系统中放入一些数据,看看会发生什么

$ cp /usr/share/dict/words ~/my_files/
$ ls -la ~/my_files/ ~/.sekrit_files/
~/my_files/:
.rw-r--r-- 5.0M bexelbie 19 Jul 17:48 words

~/.sekrit_files/:
.r--------@  402 bexelbie 19 Jul 17:39 gocryptfs.conf
.r--------@   16 bexelbie 19 Jul 17:39 gocryptfs.diriv
.rw-r--r--@ 5.0M bexelbie 19 Jul 17:48 xAQrtlyYSFeCN5w7O3-9zg

请注意,~/.sekrit_files 目录中有一个新文件。这是你复制到其中的字典的加密副本(文件名会有所不同)。随意使用 cat 和其他工具来检查这些文件,并尝试添加、删除和修改文件。请务必使用一些应用程序进行测试,例如 LibreOffice。

请记住,这是一个文件系统挂载,因此 ~/my_files 的内容不会保存到磁盘。你可以通过运行 mount | grep my_files 并观察输出来验证这一点。只有加密文件才会写入你的磁盘。FUSE 接口正在对文件进行实时加密和解密,并将它们作为文件系统呈现给你的应用程序和 shell。

卸载文件系统

当你完成文件操作后,你可以卸载它们。这将导致未加密的文件系统不再可用。~/.sekrit_files 中的加密文件不受影响。使用 FUSE 挂载程序 fusermount -u ~/my_files 卸载文件系统。

备份你的数据

gocryptfs 使用文件级加密的一个很酷的好处是,它使备份加密数据变得更容易。这些文件可以安全地存储在同步系统上,例如 OwnCloud 或 Dropbox。关于不要同时修改同一文件的标准免责声明仍然适用。但是,即使文件已挂载,也可以备份文件。你也可以使用通常备份文件的任何其他方式保存你的数据。你不需要任何特殊的东西。

当你进行备份时,请务必包含 gocryptfs.diriv 文件。此文件不是秘密,可以与备份一起保存。但是,你的 gocryptfs.conf 是秘密的。当你控制整个备份链时,例如使用磁带,你可以将其与其余文件一起备份。但是,当文件备份到云端或公开时,你可能希望省略此文件。理论上,如果有人得到此文件,唯一保护你的文件的是你的密码强度。如果你选择了 强密码,那可能就足够了;但是,你需要仔细考虑你的情况。有关更多详细信息,请参阅此 gocryptfs 上游问题

奖励:反向模式

gocryptfs 的一个巧妙功能是反向模式功能。在反向模式下,将 gocryptfs 指向你的未加密数据,它将创建一个挂载点,其中包含此数据的加密视图。这对于创建加密备份等操作非常有用。这很容易做到

$ gocryptfs -reverse -init my_files
Choose a password for protecting your files.
Password: 
Repeat: 

Your master key is:

    XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-
    XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX

If the gocryptfs.conf file becomes corrupted or you ever forget your password,
there is only one hope for recovery: The master key. Print it to a piece of
paper and store it in a drawer. This message is only printed once.
The gocryptfs-reverse filesystem has been created successfully.
You can now mount it using: gocryptfs -reverse my_files MOUNTPOINT

$ gocryptfs -reverse my_files sekrit_files
Password: 
Decrypting master key
Filesystem mounted and ready.

现在 sekrit_files 包含来自 my_files 的未加密数据的加密视图。这可以备份、共享或根据需要处理。该目录是只读的,因为除了备份之外,你无法对这些文件进行任何有用的操作。

一个新的文件 .gocryptfs.reverse.conf 已添加到 my_files 中,以提供稳定的加密视图。此配置文件将确保每个反向挂载都将使用相同的加密密钥。这样你就可以例如仅备份更改的文件。

Gocryptfs 是一个灵活的文件加密工具,允许你以加密方式存储数据,而无需显着更改你的工作流程或流程。该设计已经过安全审计,并且开发人员具有其他系统(例如 encfs)的经验。我鼓励你立即将 gocryptfs 添加到你的系统中,并开始保护你的数据。

标签
User profile image.
Brian "bex" Exelbierd 是 RHEL 社区业务负责人,致力于通过社区工作为 RHEL 路线图提供信息,并支持操作系统社区。在红帽,Brian 曾担任技术作家、软件工程师、内容策略师、社区架构师,现在担任产品经理。

6 条评论

这太棒了。我一直在使用 LUKS 来做这件事,但这似乎值得一看。

感谢这篇文章!

在我的个人笔记本电脑上,我两者都在使用。LUKS 保护我的机器,尤其是在关机时。我使用 gocryptfs 加密一些我正在备份到云存储空间的文件以及我的机器设置 Ansible playbook 的文件。这样,当我的配置暴露数据时,当它们在存储我的 playbook 的 git 存储库中时,它们是安全的。我一直在考虑写一篇关于此的后续文章...

回复 作者 sethkenlon

我不知道 gocrypts。我会试试看!

© . All rights reserved.