笔记本电脑的在线加密备份

作者:Ben Martin

文件系统上的信息可以被加密,以防止笔记本电脑被盗时意外泄露;然而,这样做并不能让您在笔记本电脑被盗后访问您一直在处理的文件。如果您出差几周,使用笔记本电脑修改源代码或办公文档,并且笔记本电脑丢失或被盗,当您回家时,您仍然需要能够访问这些更新的文件。另一方面,如果您的笔记本电脑没有被盗,您可能希望安心,因为知道笔记本电脑中的硬盘不是您重要更改的单点故障。

本文介绍了如何设置一个系统,允许备份到一个或多个在线存储提供商。您可以选择免费的在线存储提供商或付费服务,具体取决于丢失数据或无法保证立即访问备份的后果。

您可能会发现,当您旅行时可用的许多互联网连接都有非常“保护性”的数据包过滤系统。例如,一些酒店会过滤所有非 HTTP 或 HTTPS 流量。许多在线存储系统都可以通过 HTTP 访问,使用与 Web 浏览器执行的相同的 HTTP 操作。因此,即使在使用非常严格的互联网连接时,您仍然可以上传您的更改。在这种情况下,其他解决方案,例如直接使用基于 SSH 的 rsync,很可能会被过滤掉。

这里描述的组合之一应该适用于最严格的互联网连接。在线备份的两种应用场景浮现在脑海中。如果您正在处理一些文档或一个较小的代码树,使用 Omnidrive 进行存储是一个很好的免费备份解决方案。如果您有一台不错的数码相机和一个更大的在线存储空间,您可以随着旅行的进行增量备份数码照片。因此,如果您用于传输数码照片的 80GB 外部驱动器丢失了,您也不会丢失您的回忆。后者需要在您入住的酒店有相当快的(且免费的)互联网连接,并且您需要让笔记本电脑开机过夜以上传。

使存储访问变得容易的关键是使用 FUSE 挂载在线存储服务。使用 FUSE 使所有存储服务看起来相同(或者更准确地说,相似)于更高级别的加密和同步软件。然而,一些用于挂载在线存储的 FUSE 文件系统提供了略有不同的实现,这可能需要在更高级别进行一些变通。

因为您要将重要数据备份到您不控制或可能不完全信任的服务器,所以下一层应该为您的宝贵数据提供安全性。《Linux Journal》2007 年 4 月刊描述了 eCryptfs 文件系统。EncFS 是一个提供文件系统加密的 FUSE 文件系统。eCryptfs 和 EncFS 都采用现有的文件系统(基础文件系统),并提供一个新的文件系统(加密文件系统)。任何写入加密文件系统的数据都会被透明地加密并存储到基础文件系统上。读取数据将从基础文件系统透明地解密信息。

因此,您可以将存储挂载为 FUSE(称之为 ~/rawfs),然后使用 EncFS 重新挂载(在另一个挂载点,~/backupfs)。复制到 ~/backupfs 的文件将被加密并保存到 ~/rawfs,然后 ~/rawfs 将它们保存到在线存储(Omnidrive、GMailfs、sshfs、Openomy、Amazon S3——无论您使用 FUSE 在 ~/rawfs 挂载哪个)。

保持备份更新的最简单方法是使用 rsync(1) 从本地数据(可能在 ~/documents 中)同步到您的加密在线文件系统。

本文的测试是在 Fedora 7 机器上进行的。这里显示的一些命令,例如软件包安装命令,可能特定于 Fedora 发行版。

挂载 Web 存储

根据您的 Linux 发行版,您可能需要将您的用户添加到 fuse 组,以便能够以非 root 用户身份挂载 FUSE 文件系统。在 Fedora 7 上,您需要运行以下命令来允许用户 ben 挂载 FUSE 文件系统

usermod -a -G fuse ben

接下来,让我们检查一些不同的在线存储提供商以及如何使用 FUSE 挂载它们。

OmniFS

OmniFS 允许您将 Omnidrive 存储提供商挂载为 FUSE 文件系统。OmniFS 的安装和使用方式如下

$ tar xjvf omnifs-0.3.0.tar.bz2
$ cd ./omnifs-0.3.0
$ ln -s /usr/include/fuse /usr/local/include/fuse
$ ./configure
$ make

$ su -l
# make install
# ldconfig

# cp sample.cfg ~ben/my-omnifs.cfg
# chown ben.ben ~ben/my-omnifs.cfg
# exit

$ id -u -n
ben
$ cd ~
$ edit my-omnifs.cfg
...
change login, password, api-key and api-private-key
set
omnifs-log-file = /home/ben/omnifs.log

either comment out the proxy setting
or set proxy settings to be valid

...
$ mkdir ~/rawfs
$ omnifs -c my-omnifs.cfg ~/rawfs

除非我在 /usr/local 中创建链接,否则构建 omnifs 时无法在配置期间找到 FUSE。

要配置 FUSE 文件系统,首先登录 Omnidrive 的 Web 界面 (web.omnidrive.com),并记下 API 和 API 私钥,以便在配置文件中使用。登录后,单击浏览器右上角的“Settings”按钮,然后单击屏幕中央的“API”选项卡,即可获得密钥。

默认情况下,omnifs 命令在前台运行,因此只要 FUSE 挂载点有效,它就会阻塞终端。运行 omnifs 可执行文件以挂载 FUSE 文件系统后,远程存储就像任何文件系统一样显示

$ cd ~/rawfs
$ date >| foo.txt
$ cat foo.txt
Thu Aug 23 17:50:23 EDT 2007
$ ls -l
total 0
drwx------ 0 ben ben  0 2007-08-31 03:15 Downloads
-rwx------ 0 ben ben 29 2007-08-31 08:50 foo.txt

我发现 omnifs 有时会在其日志文件中挂起在“DEBUG: OMNI_ReadDir Called”。重新启动 omnifs 可执行文件通常有助于重新启动。

SSH FUSE 文件系统

使用 SSH 作为 FUSE 文件系统的底层传输将使用范围限制为不过滤非 Web 流量的互联网连接。

考虑到您可以直接将 SSH 与 rsync 一起使用,您可能想知道为什么还要使用 FUSE。使用 SSH 可以保护您的信息传输到 SSH 服务器。请注意,一旦您 rsync 到服务器的文件被发送,它们就不会在服务器的文件系统上加密。如果您对 SSH 服务器的安全性没有完全的信心,使用 sshfs 提供 FUSE 访问可以让您使用下一节讨论的相同密码学来保护 SSH 服务器上的备份。此外,通过 FUSE 访问所有在线存储可以让您快速更改在线备份的存储位置,而不会影响系统的其余部分。

在 Fedora 中,sshfs 已经打包,可以使用 yum 安装。从源代码安装遵循标准的配置路径

# yum install fuse-sshfs

$ ./configure && make;
$ su -l
# make install

假设您在要 ssh 连接的服务器上使用公钥,则开始使用 sshfs 很简单。如列表 1 所示,我首先将服务器的密钥添加到我的 SSH 代理,然后再 ssh 连接到服务器并创建一个目录以用于我的在线存储。我退出连接并将 SSH 服务器挂载到 ~/rawfs,并以可预测的方式 touch 一个文件。最后一个命令是再次 ssh 连接到服务器,以验证日期是否已添加到在线存储目录中的文件中。

sshfs 的挂载可以隐藏在脚本文件中,如列表 2 所示。如果您在 SSH 密钥上没有密码,或者如果您并非总是将(或想要将)该 SSH 密钥添加到您的 SSH 代理,则这可能很方便。

列表 1. 使用 sshfs 挂载 SSH 服务器

local$ ssh-agent bash
local$ ssh-add .ssh/myserv
...
local$ ssh myserv.example.com
ex.com$ mkdir online-storage
ex.com$ exit

local$ sshfs \
 ben@myserv.example.com::/home/ben/online-storage \
 ~/rawfs -o idmap=user

local$ date >| ~/rawfs/datefile1.txt
local$ fusermount -u ~/rawfs
local$ ssh myserv.example.com
ex.com$ cat online-storage/*txt
Fri Aug 24 17:16:40 EDT 2007

列表 2. 用于挂载 sshfs 的小程序

$ cat ~/bin/mount-sshfs-example.sh
#!/usr/bin/ssh-agent bash
ssh-add .ssh/myserv
sshfs \
ben@myserv.example.com:/home/ben/online-storage \
  ~/rawfs -o idmap=user
安全性

如果您运行的是 2.6.20 或更高版本的内核,则 eCryptfs 应该可以随时使用,无需任何设置工作。运行 2.6.22 Fedora 7 更新的内核,我在让 eCryptfs 正常工作方面遇到了重大问题,其中基础文件系统存储在 FUSE 文件系统上。当我成功挂载 eCryptfs 时,尝试使用 rsync 同步到 eCryptfs 文件系统时出现错误,最终导致内核崩溃。我已成功使用本地 ext3 文件系统来存储其加密数据,因此我怀疑这是 eCryptfs 和 FUSE 交互的问题。根据您运行的发行版,设置 eCryptfs 以允许非 root 用户挂载加密文件系统也可能需要对 PAM 进行一些调整。

EncFS 是一个 FUSE 文件系统,它接受一个“原始”文件系统并呈现一个新的文件系统。在新文件系统上创建的任何文件都将被加密并存储到原始文件系统。EncFS 需要 FUSE、OpenSSL 和 rlog。FUSE EncFS 文件系统可以从您的发行版的软件包存储库安装,也可以手动安装,如下所示

yum install fuse-encfs

tar xzvf rlog-1.3.7.tgz
cd rlog-1.3.7
./configure && make
make install
cd ..
tar xzvf encfs-1.3.2-1.tgz
cd encfs-1.3.2
./configure && make
make install

首次尝试将原始文件系统挂载到加密文件系统时,EncFS 会询问您想要的密码学级别以及要使用的密码。相同的命令用于创建加密文件系统和挂载文件系统。后续使用 EncFS 挂载原始文件系统时,只会提示您输入密码。此处显示了在 rawfs(当时由 sshfs 支持)上初始挂载和重新挂载 EncFS 的过程

$ encfs ~/rawfs ~/backupfs
Creating new encrypted volume.
Please choose from one of the following options:
 enter "x" for expert configuration mode,
 enter "p" for pre-configured paranoia mode,
 anything else... will select standard mode.
?> 

Standard configuration selected.

Configuration finished.  
The filesystem ... has the following properties:
Filesystem cipher: "ssl/blowfish", version 2:1:1
Filename encoding: "nameio/block", version 3:0:1
Key Size: 160 bits
Block Size: 512 bytes
Each file contains 8 byte header with unique IV data
Filenames encoded using IV chaining mode.

Now you will need to enter a password ...
You will need to remember this password, ...
no recovery mechanism.  
However, the password can be changed
later using encfsctl.

New Encfs Password: 
Verify Encfs Password: 
$ date > backupfs/datetest.txt
$ cat backupfs/datetest.txt
Fri Aug 24 20:44:33 EDT 2007
$ ls -l rawfs
total 4
-rw-rw---- 1 ben 505 37 2007-08-24 06:27 K9dmA...
$ fusermount -u backupfs
$ encfs ~/rawfs ~/backupfs
EncFS Password: 
$ ls -l ~/backupfs
-rw-rw---- 1 ben 505 29 2007-08-24 06:27 datetest.txt
执行备份:同步

我们现在有一个 ~/backupfs 文件系统,它可以加密写入其中的任何内容,并将其存储在某处的在线存储系统中。用于保持您的在线备份更新的一个出色工具是 rsync(1)。

rsync 手册页指出:“rsync 远程更新协议允许 rsync 仅通过网络连接传输两组文件之间的差异。”

在我们的例子中,要备份的数据和我们要备份到的位置都通过 Linux 内核显示。由于 ~/backupfs 需要读取和写入互联网,我们非常希望限制写入其中的数据量。

正常的 Linux 内核文件系统(如 ext3)与我们的分层设置之间的一些差异可能需要通过 rsync 的命令行选项来解决。列表 3 显示了在 EncFS 上运行 rsync 的情况,EncFS 使用 sshfs 提供在线存储。第一次运行 rsync 时,整个文件都会上传到在线存储。第二次运行时,仅发送和接收一些元数据。

rsync 的 -a 选项类似于 cp 命令的 -a 选项;它尝试在目标位置保留源文件系统中的所有内容。rsync 的 --no-g 命令行选项告诉它不要尝试将目标文件的组同步到源文件的组。在这种情况下,sshfs 不允许我更改目标文件的组,因此 rsync 在未能设置远程文件的组时会生成警告。--delete-after 清理在线存储文件系统中仅存在的文件。在本例中,我还使用 --include 仅同步纯文本文件。这对于仅在较大的文件系统中保留 OpenOffice.org 文档的备份非常方便。

列表 3. 使用 rsync 将数据备份到加密的在线文件系统

$ rsync -av --delete-after \
  --include="*.txt" --no-g  \
  small/ ~/backupfs
...
boysw10.txt

sent 49056 bytes  received 48 bytes
total size is 48923

$ rsync -av ...
sent 83 bytes  received 26 bytes
total size is 48923

另一个可能非常宝贵的 rsync 选项是 --modify-window=n,其中参数 n 是本地文件和远程文件之间时间戳可以不同的秒数,并且仍然被认为是相同的。当使用显示在线存储的文件系统时,修改时间可能从不完全准确到相差几天不等。正确设置 --modify-window 可以隐藏这些轻微的时间戳漂移或较大的固定时间戳偏移,并允许 rsync 继续高效工作。

结论

在 OmniFS 之上运行 EncFS 在首次挂载 EncFS 时需要一些特殊参数。我发现使用 EncFS 的默认设置的主要问题是,回读文件内容时,有时会出现尾部垃圾。当使用 OmniFS 并首次创建 EncFS 时,选择专家模式,密码=AES,密钥大小=256,块大小=4096,文件名编码=Stream,文件名 IV 链接=Yes,每个文件 IV=no 和块身份验证代码标头=no。主要问题似乎源于每个文件 IV 设置以及 OmniFS 往返延迟中丢失的一些东西。列表 4 显示了使用 OmniFS 作为基础文件系统时 EncFS 的一些专家模式设置组合以及生成的文件系统交互。

列表 4. 使用 OmniFS 挂载在线存储时的一些 EncFS 选项及其结果

x, 1, 256, 4096, 2, R, n, R == OK
x, 1, 256, 4096, 1, n, R, R == BAD
x, 1, 256, 4096, 3, n, n, R == OK
x, 1, 256, 4096, 3, R, n, R == OK

一些文件系统人员不喜欢 FUSE,因为它会引入额外的上下文切换。如本文所示,在彼此之上分层使用两个 FUSE 文件系统意味着要实际将数据传输到网络,需要进行大量的上下文切换。对于本文的目的而言,与互联网连接速度相比,这些上下文切换的开销是无关紧要的。

如果您的笔记本电脑被盗,加密您的主目录可以让人安心。通过在线备份,您还可以防止丢失重要的更改以及笔记本电脑或其崩溃的硬盘。

通过使用 FUSE 将在线存储公开为文件系统,当您决定更改在线存储提供商时,加密和同步可以保持不变。OmniFS 文件系统使用 HTTP 与在线存储提供商通信,因此即使您的互联网连接具有严格的数据包过滤,它也应该可以工作。

资源

Mike Halcrow 的“eCryptfs:堆叠式加密文件系统”,LJ,2007 年 4 月:www.linuxjournal.com/article/9400

以非 Root 用户身份挂载 eCryptfs:ecryptfs.sourceforge.net/ecryptfs-faq.html#nonroot

Openomy 存储服务:www.openomy.com

OpenomyFS:Openomy 的 FUSE 文件系统:mauricecodik.com/projects/ofs

GMailFS,挂载您的 Gmail 帐户:richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html

FUSE:用户空间文件系统:fuse.sourceforge.net

Ruby FUSE 绑定:rubyforge.org/projects/fusefs

在 Berkeley DB 文件中创建文件系统:www.kernel.org/pub/linux/kernel/people/jgarzik/fs

Omnidrive,免费在线存储:www.omnidrive.com

OmniFS 主页:users.tpg.com.au/panyam/omnifs.html

用于挂载 SSH 的 FUSE 文件系统:fuse.sourceforge.net/sshfs.html

EncFS FUSE 文件系统主页:arg0.net/wiki/encfs

Ben Martin 从事文件系统工作已超过十年。他目前正在攻读博士学位,将语义文件系统与形式概念分析相结合,以改善人与文件系统之间的交互。

加载 Disqus 评论