一个文件系统,它提供了一个加密视图的目录——与EncFS相反。

目前我正在使用EncFS将我的目录“confidential”加密为“.encconfidential”,并使用在线服务(例如Dropbox、UbuntuOne等)同步该加密目录。然而,我的整个磁盘已经被LUKS加密,因此双重加密会对性能产生影响。

我想知道是否有一种“倒置”的EncFS选项?一个未加密的目录被挂载,在挂载的目录中,您只能看到加密的文件。因此,我可以在未加密的文档中工作,而同步工具只能看到和读/写加密的文件。

澄清:我的主要用例是同步而不是备份。我希望能够安全地保持机器同步,而不会在本地操作时遭受双重加密的惩罚(当我点击保存时,我必须等待,与传输时间相比,加密操作是时间的最小增量 - 而且它是后台时间,而不是用户时间)

4个回答

实际上,Encfs确实有一个“反转”选项。来自Encfs的man页面:
   --reverse
       Normally EncFS provides a plaintext view of data on demand.  Normally it stores enciphered data and displays plaintext data.  With --reverse it
       takes as source plaintext data and produces enciphered data on-demand.  This can be useful for creating remote encrypted backups, where you do
       not wish to keep the local files unencrypted.

       For example, the following would create an encrypted view in /tmp/crypt-view.

           encfs --reverse /home/me /tmp/crypt-view

       You could then copy the /tmp/crypt-view directory in order to have a copy of the encrypted data.  You must also keep a copy of the file
       /home/me/.encfs5 which contains the filesystem information.  Together, the two can be used to reproduce the unencrypted data:

           ENCFS5_CONFIG=/home/me/.encfs5 encfs /tmp/crypt-view /tmp/plain-view

       Now /tmp/plain-view contains the same data as /home/me

       Note that --reverse mode only works with limited configuration options, so many settings may be disabled when used.

我尚未尝试过同步功能,但我认为只要在另一端使用相同的.encfs5配置文件夹,它应该是可行的。

好的,教训已经吸取:在询问Ubuntu论坛之前请先查阅资料。谢谢你的指出,我会检查是否可以同步,并且回报结果。 - stwissel
我试过使用UbuntuOne连接两个目录,效果非常好。 - stwissel
@stwissel 很酷,我得记住它可以与同步一起工作。我引用了man页面并不是因为我想说RTFM,而是因为我懒得再次写出man页面上的内容。 :) - Azendale
我对自己说了一句RTFM(请参阅文档);-)并指出在哪里找到文档是一个很好的风格。 - stwissel
在当前版本中,它不是.encfs5而是.encfs6.xml。 - stwissel
1重要提示:请使用1.7.4或更高版本。据我所知,1.7.2存在反向加密数据损坏的错误。 - user1338062

现在来讲一下如何按照您的要求进行操作:
您所要求的是一个只读文件系统视图,通过它读取的任何文件都会自动加密:
~/
    confidential/
        secret_file.txt      # Stored unencrypted
    .enc_confidential/       # Read-only view of files in confidential/
        secret_file.txt      # Encrypted view of corresponding file

标准的做法是使用 FUSE(用户空间文件系统)。

对于您的用例,已经存在一个可以实现您想要的功能的 FUSE 文件系统,即 fusefltfuseflt为每个读取的文件应用任意用户指定的过滤器,提供只读视图。

在您的情况下,您需要的过滤器是像 gpg 这样的加密程序。

请参阅 文档 了解如何编写配置文件。基本上,使用 flt_cmd = gpg --encrypt [... 您选择的加密设置] 作为过滤器命令。

请小心;如果配置出错,可能会将明文数据暴露给您的互联网服务。我建议您查看我关于一般用途的其他答案。


由于您还需要写入支持以使同步工作,看起来您将不得不编写自己的FUSE文件系统。修改fuseflt源代码以添加写入支持可能不难;只需填写未实现的写入函数即可。这将与读取支持相同,调用解密过滤器而不是加密过滤器。
有几个教程可供您编写FUSE文件系统。此外,还可以查看FUSE维基百科获取更多文档。
完成后,请将您的FUSE文件系统挂载命令添加到您的.profile文件中,以便在登录时自动挂载。

非常感激您对问题的努力回答。fuseflt 差不多就可以了... 如果没有 'sync'(在我原始问题的第一行很容易忽略)。我要求的是一个读/写而不是只读的加密视图。所以类似 fusefltrw 的东西将会是解决方案。 - stwissel
我认为你需要自己编写你自己的FS,但这并不难。 - Mechanical snail
你对我的能力的信任很好,但是我的开发技能局限于文件系统开发中不使用的语言(你怎么称呼COBOL中的Fuse :-))。无论如何,谢谢你的帮助。我真的很感激。 - stwissel
嗯,OpenCOBOL 使用 C 的调用约定,所以应该可以用 COBOL 写一个 FUSE 文件系统 ☺。 - Mechanical snail

原则上是可能的(使用FUSE文件系统),但更简单的选择是使用现成的加密备份程序,将您的在线服务作为备份目标。
我知道有两个适合的备份程序。这两个程序还可以提供您文件的完整历史记录。

Duplicity / Deja-Dup

DuplicityUbuntu软件包)是一个备份程序,它可以高效地将压缩、加密的增量备份写入远程位置。增量备份具有节省空间的特点,因为它使用rsync算法生成二进制差异。
您还可以使用默认包含在最新的Ubuntu版本中的Deja-Dup前端。
Duplicity支持写入许多远程位置,或称为后端。特别是,Duplicity有一个Ubuntu One后端。我不认为它直接支持Dropbox,但您可以告诉它备份到Dropbox同步的本地目录。
如果你要备份大量数据,Duplicity并不适合。由于它在存储增量备份时存在限制,需要定期运行完整备份,这意味着需要上传所有的数据。

Obnam

对于较大的备份,请考虑使用Obnam。它将加密的数据去重存储在备份仓库中。要将其与远程存储服务一起使用,请告诉Obnam将备份到一个Dropbox/Ubuntu One会同步的位置的仓库中。由于Obnam使用基于B树的仓库格式,只需将新的/更改的数据写入仓库,同步速度应该很快。

缺点是需要在硬盘上存储两份数据副本(原始副本和备份仓库中的副本)。

Ubuntu软件包链接。还有一个PPA源


如果只是备份的话,那可能还行。但它们都无法实现同步,而同步才是更有趣的使用情景。当我直接备份到UbuntuOne时,Duplicity让我非常失望,因为它以25M的流式写入,并且在慢速连接上超时(这在我的地区是正常情况)。 - stwissel
顺便说一句:感谢修改,现在更清楚了。 - stwissel

另一个现成的同步工具是Seafile。它是一个类似于Dropbox的一台服务器多个客户端的解决方案。在最新版本中,有一种选项可以以一种服务器不知道密钥的方式共享加密文件夹。
请参阅Seafile安全功能
提示:Seafile将共享文件夹称为“库”,以更好地理解文档。