Tarsnap:为真正偏执狂提供的在线备份

作者: Andrew Fabbro

将备份存储在云端需要一定程度的信任,并非所有人都有意愿给予这种信任。虽然自动化异地备份的便利性和低成本非常吸引人,但将个人数据交给完全陌生的人掌握的现实,对于某些人来说始终难以接受。

Tarsnap 应运而生——“为真正偏执狂提供的在线备份”。Tarsnap 是前 FreeBSD 安全官 Colin Percival 博士的心血结晶。2006 年,他开始研发一种新的“加密快照远程备份”解决方案,最终于 2008 年发布了 Tarsnap。

与其他在线备份解决方案不同,Tarsnap 采用开放、有据可查的密码学设计,可以安全地加密您的文件。您无需信任供应商的密码学声明,而是可以完全访问源代码,该源代码使用开源库和行业认可的协议,例如 RSA、AES 和 SHA。

Tarsnap 提供了一个命令行客户端,其操作方式非常类似于传统的 UNIX tar 命令。用户熟悉的语法,例如 tarsnap cftarsnap xvf,其工作方式与用户预期的一致,只不过客户端处理的是基于云的存档,而不是本地 tarball。这些存档存储在 Amazon S3 上,并使用 EC2 服务器来处理客户端连接。为了最大限度地降低带宽成本,Tarsnap 使用类似 rsync 的智能、面向块的快照操作,仅上传数据集更改,并最大限度地降低传输成本。

虽然您可以通过加密数据、异地运行 rsync 服务器等方式来构建自己的备份系统,但 Tarsnap 的可脚本化、专业的密码学设计和实用定价使其成为精明用户的有吸引力的服务。

开源强加密

Tarsnap 会压缩、加密并以密码学方式签名您发送给它的每个字节。无需密码学协议知识,但如果您是一位感兴趣的爱好者,或者如果您想深入了解其内部机制会感到更放心,那么您可以在 http://tarsnap.com 上找到源代码和完整的设计文档。

在安装过程中,用户创建一个密钥文件,可以选择使用密码进行保护。该文件包含两个 2048 位 RSA 密钥,用于签名和加密。AES-256 会话密钥在运行时创建,并使用 RSA 密钥进行加密。HMAC-SHA-256 哈希函数用于验证数据块并防止篡改,并且相同的哈希函数也在其他地方用于验证客户端和服务器之间的通信。

如果这些密码学术语让您感到眼花缭乱,那么简单的描述是,Tarsnap 使用行业标准协议在传输和静态状态下加密和验证您的数据。从用户的角度来看,唯一需要保护的是密钥文件。正如您可能预料到的那样,如果密钥文件丢失,则用于解密存储在 Tarsnap 中的数据的密钥将不可用,并且您的数据将不再可用。生成后,理想情况下应将此密钥文件安全地存储在异地。

高效设计

Tarsnap 备份可变长度的、重复数据删除的数据块。这意味着如果您更改目录中的一个文件,则只会备份该文件。实际上,如果该文件之前存在,则只会备份对该文件的更改。如果您移动文件,Tarsnap 足够智能,可以识别并跳过以前备份的数据块。在您希望的任何时候,您都可以对目录进行备份,这将创建一个新的存档。在后台,Tarsnap 将保留使该存档完整所需的任何文件。

假设您有一个包含 100MB 文件的目录,并且每日更改率为 10%。如果您每天为该目录创建一个 Tarsnap 存档,您将看到以下消耗模式

  • 星期一(初始):创建 100MB 存档(上传 100MB,存储 100MB)。

  • 星期二:创建 10MB 存档(上传 10MB 新数据,存储 110MB 总数据)。

  • 星期三:创建 10MB 存档(上传 10MB 新数据,存储 120MB 总数据)。

如果在星期四您删除星期一的存档,星期二的存档将通过保留星期一所需的任何文件来“完整化”。这使您可以非常灵活地选择还原点。当然,您可以保留多个存档,并根据需要设置任意数量的还原点。

您当前的账户余额为 $4.992238237884881224

Tarsnap 采用预付费的公用事业计量模式。订阅者至少存入 5.00 美元,并且仅按其消耗的存储和带宽付费。虽然成本高于普通的 Amazon S3 服务,但它反映了 Tarsnap 在密码学、压缩和重复数据删除方面的附加值。在撰写本文时,Tarsnap 的存储成本为每千兆字节每月 30 美分,传输成本为每千兆字节 30 美分。

对于大型、整个服务器的 TB 级备份,此成本可能使 Tarsnap 不可行。但是,对于必须持久、可用且安全的关键敏感文件而言,它是理想的选择,以防攻击者成功入侵。由于没有最低收费或月费,Tarsnap 对于小型数据集或易于压缩的数据非常经济。一些示例

  • 以 10% 的每日更改率备份 100MB 的文件一个月只需 30 美分。

  • 每周备份一次,更改率为 20% 的千兆字节每月将花费 1.40 美元。

Tarsnap 以阿托美元(quintillionths of a dollar,十亿亿分之一美元)计费,以避免通过四舍五入获利。这意味着您的账户余额将精确到小数点后 18 位。这不仅仅是“按需付费”的云定价——实际上是“按原子付费”。一些用户发现一小笔存款可以使用数月或数年。

重要的灵活性

Tarsnap 最好的功能之一是它易于编写脚本。将 tarsnap cf 命令放入 shell 脚本的能力使在 cron 作业中使用非常简单,这鼓励了无人值守的自动化备份——这是最好的备份方式。

至关重要的是,Tarsnap 还支持职责划分。您可以使用 tarsnap-keymgmt 工具创建具有有限权限的密钥文件。您可能有一个密钥文件位于您的服务器上,具有创建存档的权限,但没有删除它们的权限。具有完全权限的主密钥可以保存在异地,这样,如果攻击者入侵您的服务器,他们将无法销毁您的备份。

使用 Tarsnap

要开始使用 Tarsnap,请在 tarsnap.com 上注册,向您的帐户存入一些资金,并下载客户端。

客户端仅以源代码形式提供,但简单的 ./configure ; make install 过程非常容易。客户端在所有主要的 Linux 发行版(以及基于 BSD 的系统)上都受支持。快速浏览一下下载页面,以确保您拥有所需的操作系统软件包,因为某些开发软件包未安装在典型的 Linux 配置中。

如果您正在使用防火墙,请注意 Tarsnap 通过端口 9279 上的 TCP 进行通信。

只有两个关键的配置项:您的密钥文件的位置和您的 Tarsnap 缓存的位置。两者都在 /usr/local/etc/tarsnap.conf 中设置。提供了一个 tarsnap.conf.example,您可能只需按原样复制该示例即可。它将您的 Tarsnap 密钥定义为 /root/tarsnap.key,并将您的缓存目录定义为 /usr/local/tarsnap-cache,如果该目录不存在,则将创建该目录。cachedir 是一个小型的状态跟踪目录,允许 Tarsnap 跟踪备份。

接下来,按如下所示注册您的机器。在本例中,我正在为一台名为 helicarrier 的机器设置 Tarsnap 服务。电子邮件地址和密码是我注册 Tarsnap 服务时使用的地址和密码


# tarsnap-keygen --keyfile /root/tarsnap.key 
 ↪--user andrew@fabbro.org --machine helicarrier
Enter tarsnap account password:
#

我有一个目录想要使用 Tarsnap 进行备份


# ls -l /docs
total 2092
-rw-rw---- 1 andrew 1833222 Jun 14 16:38 2011 Tax Return.pdf
-rw------- 1 andrew 48568 Jun 14 16:41 andrew_passwords.psafe3
-rw------- 1 tina   14271 Jun 14 16:42 tina_passwords.psafe3
-rw-rw-r-- 1 andrew 48128 Jun 14 16:41 vacation_hotels.doc
-rw-rw-r-- 1 andrew 46014 Jun 14 16:35 vacation_notes.doc
-rw-rw-r-- 1 andrew 134959 Jun 14 16:44 vacation_reservation.pdf

要备份,我只需告诉 Tarsnap 我想将我的存档命名为什么名称(在本例中为“docs.20120701”)以及要备份哪个目录。存档名称中没有必要使用日期字符串,但这使版本控制变得简单明了,您将看到


# tarsnap cf docs.20120701 /docs
tarsnap: Removing leading '/' from member names
                                 Total size  Compressed size
All archives                        2132325          1815898
  (unique data)                     2132325          1815898
This archive                        2132325          1815898
New data                            2132325          1815898

在我的 tarsnap.conf 中,我启用了 print-stats 指令,该指令提供了显示的帐户报告。请注意压缩,这降低了存储成本并提高了密码学安全性。“唯一数据”的“压缩大小”显示了实际存储在 Tarsnap 上的数据量,您只需为压缩大小付费。

第二天,我再次将 docs 备份到“docs.20120702”。如果我没有做太多更改,备份将进行得非常快,并且几乎不占用额外的空间


# tarsnap cf docs.20120702 /docs
tarsnap: Removing leading '/' from member names
                                 Total size  Compressed size
All archives                        4264650          3631796
  (unique data)                     2132770          1816935
This archive                        2132325          1815898
New data                                445             1037

正如您所看到的,虽然“所有存档”的数据量有所增长,但“唯一数据”的实际数量几乎没有增加。Tarsnap 足够智能,可以避免备份未更改的数据。

现在让我们列出 Tarsnap 存储的存档


# tarsnap --list-archives
docs.20120701
docs.20120702

为了进一步演示 Tarsnap 的智能存储方法,我将删除最旧的备份


# tarsnap df docs.20120701
                                 Total size  Compressed size
All archives                        2132325          1815898
  (unique data)                     2132325          1815898
This archive                        2132325          1815898
Deleted data                            445             1037

“所有存档”的数量已下降,因为现在我只有一个存档,但“唯一数据”没有太大变化,因为它仍然保留满足我的“docs.20120702”存档所需的所有文件。如果我列出它,我可以看到我的数据仍然在那里


# tarsnap tvf docs.20120702
drwxrwxr-x  0 andrew 0 Jun 14 20:52 docs/
-rw-------  0 andrew 48568 Jun 14 16:41 docs/andrew_passwords.psafe3
-rw-rw-r--  0 andrew 46014 Jun 14 16:35 docs/vacation_notes.doc
-rw-rw-r--  0 andrew 134959 Jun 14 16:44 docs/vacation_reservation.pdf
-rw-rw-r--  0 andrew 48128 Jun 14 16:41 docs/vacation_hotels.doc
-rw-------  0 tina   14271 Jun 14 16:42 docs/tina_passwords.psafe3
-rw-rw----  0 andrew 1833222 Jun 14 16:38 docs/2011 Tax Return.pdf

我使用日期字符串是为了方便版本控制,但我也可以轻松地为存档使用任何命名约定,例如“docs.1”、“docs.2”等等。对于我的个人备份,我有一个 cron 作业,该作业每晚使用日期字符串命名的存档调用 Tarsnap


tarsnap cf docs.`date '%+Y%m%d'` /docs

如果我遇到本地灾难并想恢复该数据,那么只需另一个简单的 Tarsnap 命令即可取回我的文件。请注意,与传统的 tar 一样,Tarsnap 会删除前导斜杠,以便所有文件都相对于当前工作目录恢复


# cd /
# rm -rf docs
# tarsnap xvf docs.20120702
x docs/
x docs/andrew_passwords.psafe3
x docs/vacation_notes.doc
x docs/vacation_reservation.pdf
x docs/vacation_hotels.doc
x docs/tina_passwords.psafe3
x docs/2011 Tax Return.pdf
提示

如果您想以非 root 用户身份运行 Tarsnap,请在您的主目录中创建一个 .tarsnaprc 文件。语法与上面讨论的 tarsnap.conf 相同。例如


$ cat ~/tarsnap.conf
cachedir /home/andrew/tarsnap-cache
keyfile /home/andrew/tarsnap.key
print-stats

如果您有其他服务或用户争用您的 Internet 连接,请使用 --maxbw-rate 来指定 Tarsnap 允许使用的最大字节/秒数。

print-stats 命令在交互使用时为您提供帐户状态信息,但对于批处理操作(例如从 cron 运行 Tarsnap),您可以通过从 tarsnap.conf 中删除该指令或使用 --no-print-stats 调用 Tarsnap 来禁止输出。

最后,您可以尝试使用 --dry-run-v 标志来模拟 Tarsnap 备份操作,而无需实际消耗网络和磁盘。一旦您将命令构造得完全符合您的要求,请删除 --dry-run

许可证

Tarsnap 未在开源许可证下分发,尽管提供了所有客户端源代码(并在安装期间由用户编译)。但是,该公司会定期向其使用的代码项目(例如 libarchive)做出贡献。Tarsnap 还开源了自己的一些项目,包括 scrypt 包、spiped 安全管道守护程序和 kivaloo NoSQL 数据存储。

更多信息

Tarsnap 主页 (http://tarsnap.com) 包含丰富的文档和信息,以及指向 Tarsnap IRC 频道、邮件列表和 FAQ 的链接。“技术细节”部分对于那些对 Tarsnap 的密码学方法和历史的深入细节感兴趣的人来说是引人入胜的读物。

Tarsnap 还为产品中发现的错误支付丰厚的现金奖励,从小 cosmetic 错误的几美元到如果有人发现严重的安全性缺陷的数千美元不等。这种透明的方法对于真正偏执狂的人来说是进一步的安慰。

Tarsnap 的当前版本为 1.0.32,于 2012 年 2 月 22 日发布,适用于 Linux、BSD、OS X、Solaris、Minix 和 Cygwin。

与 Colin Percival 博士的问答

Colin Percival 博士

答:我听说“初创公司”的定义是“收入或用户数量翻倍的时间以月为单位衡量”,我还听说“非常成功的初创公司”的定义是“收入或用户数量翻倍的时间以周为单位衡量”。按照这些定义,Tarsnap 是一家初创公司,但不是一家非常成功的公司。

是的,这有点回避问题,但 Tarsnap 是我的主要收入来源,我来自一种认为个人收入是私事的文化,所以我不想公布精确的数字。

问:查看您的漏洞赏金页面,您已向提交错误报告的用户支付了超过 2,000 美元。为什么要采用“漏洞赏金”系统,而不是开源项目中的传统错误报告?

答:我曾在 BSDCan'12 和 AusCERT'12 上就此发表演讲(在连续几周内,而且相隔 10,000 英里——一句忠告,永远不要尝试参加相隔 10,000 英里的背靠背会议)。简而言之,漏洞赏金有助于让更多人查看代码,并有助于鼓励人们报告他们看到的任何似乎不正确的内容。

可能更好的问题是,为什么我为所有错误提供赏金,而不仅仅是安全错误——除了 Knuth 的著名奖项外,我不知道还有其他任何赏金扩展到安全漏洞之外的情况。但这里的答案大致相同——很多人不会寻找安全漏洞,因为他们没有安全背景,但是为所有错误提供现金奖励会让他们感兴趣……而且我在 FreeBSD 方面的经验是,许多安全漏洞不是由安全人员发现的,而是由其他开发人员只是说“这里有些东西看起来很奇怪”发现的。

问:从安全角度来看,您认为 Tarsnap 设计中最薄弱的环节是什么?有什么东西应该让真正偏执狂的人夜不能寐吗?

毫无疑问,Tarsnap 安全性中最薄弱的环节是我。我编写了 Tarsnap 客户端代码来加密和签名客户端端的所有内容,但您如何知道它是否像我声称的那样工作?

如果您是偏执狂,您应该自己查看代码,并确保它像我声称的那样工作。当我发布新版本时,您也应该查看它——与以前的版本进行比较,并确保更改是合理的。

如果中央情报局绑架我并威胁要对我施加酷刑,直到我解密某人的数据,我将无法做任何事情来帮助他们。但是,如果中央情报局绑架我并威胁要对我施加酷刑,除非我在下一个版本的 Tarsnap 中插入特洛伊木马……好吧,我对自己的抗压能力并不乐观。

问:Tarsnap 的客户端非常 UNIX 极客友好,具有熟悉的 tar 语法。您是否有兴趣或计划为不太复杂的用户提供图形界面?

答:这绝对是我计划在未来做的事情。我对任何 GUI 都几乎没有经验,所以我最终可能会付费请人制作 GUI——理想情况下是 tar 的开源 GUI,因为 Tarsnap 使用几乎完全相同的命令行界面,而且我认为一个好的 tar GUI 前端本身也很有用。

问:为什么是阿托美元而不是飞母托美元或仄普托美元?

答:使用阿托美元,我可以将所有内容表示为一对 64 位整数。

问:您是否正在为即将发布的 Tarsnap 版本开发任何新功能?

答:这些天我主要致力于性能改进。有一些经常被请求的功能我可能会添加,但总的来说,当功能不存在时,总是有充分的理由——要么它们是不可能的(例如,旧存档的服务器端过期——当删除旧存档时,服务器无法知道应该释放哪些块),要么需要进行重大的重新设计(例如,重命名存档——客户端-服务器协议具有写入事务和删除事务,但重命名需要原子地写入某些文件并删除其他文件)。

备份图片,通过 Shutterstock.com。

加载 Disqus 评论