自动化可靠备份解决方案

作者:Andrew De Ponte

如今,用电影、音乐、视频、软件、文档和许多其他形式的数据填满巨大的硬盘驱动器是很常见的。由于克服媒体大小限制和数据完整性问题需要耗时的人工干预,因此通常会忽略手动备份到 CD 或 DVD。因此,大多数这些数据没有定期备份。我是一名安全专业人士,专门从事软件开发领域。在业余时间,我是一位开源爱好者,并开发了许多开源项目。鉴于我广泛的兴趣,我在家中拥有一个由 12 台计算机组成的网络,这些计算机运行 Linux、Mac OS X 和 Windows 的组合。丢失我的工作成果是不可接受的!

为了在我的环境中发挥作用,备份解决方案必须适应不同机器的多个用户,运行不同的操作系统。所有用户都必须能够以灵活和无人值守的方式备份和恢复数据。这要求可以恢复的数据粒度范围从单个文件到存储在任何指定日期和时间的整个存档。由于多个用户可以访问备份系统,因此纳入安全功能非常重要,特别是数据保密性(防止用户查看其他用户的数据)和数据完整性(确保用户从备份中恢复的数据最初是由他们创建的,并且没有被更改)。

除了安全性之外,可靠性是另一个关键要求。该解决方案必须能够容忍个别硬件故障。在这种情况下,最容易发生故障的组件是硬盘驱动器,因此该解决方案应实施硬盘驱动器容错。最后,该解决方案应有效利用驱动器空间和网络带宽。有效利用带宽允许更多用户同时备份他们的数据。同样,如果每个用户有效地利用硬盘空间,则可以备份更多数据。我对我的所有项目施加的一些附加要求是它们在视觉上具有吸引力、尺寸合适且价格合理。

我首先尝试寻找现有的解决方案。我发现许多解决方案分为两类:单驱动器网络备份设备和 RAID 阵列网络备份设备。第一类解决方案的一个主要例子是 Western Digital NetCenter 产品。我在这一类别中找到的所有产品在功能性、安全性、可靠性和性能要求的大部分(如果不是全部)方面都失败了。第二类中的设备通常是为企业使用而设计的,而不是个人使用。因此,它们往往比第一类中的设备贵得多。Snap Server 2200 是第二类设备中低端版本的一个例子。它通常以大约 1,000 美元的价格出售,并具有相当数量的硬盘空间。我在第二类中找到的产品在功能性、安全性、性能和一般要求的大部分(如果不是全部)方面也失败了。

由于现成解决方案的成本过高和要求问题,我决定使用 Linux、Duplicity 和商用现货 (COTS) 硬件构建自己的无人值守、加密、冗余、基于网络的备份解决方案。使用这些工具,我创建了一个网络设备,可以进行完全和增量备份,这些备份都是加密和数字签名的。增量备份是指仅保存自上次备份以来更改的备份。这减少了每次备份所需的存储空间和所需的带宽。完全备份是指备份完整文件,而不仅仅是更改的文件。这些工具还提供了恢复整个存档和在指定时间备份的单个文件的能力。例如,假设我最近感染了病毒,并且我知道一周前我没有病毒。此解决方案可以轻松地让我将系统恢复到一周前、两个月前,或者最早可以追溯到我的第一次备份时的状态。

An Automated Reliable Backup Solution

图 1. Silver Venus 668 机箱(正面)

根据 Duplicity 项目的网页,Duplicity 是一个备份实用程序,它通过加密 tar 格式的卷并将它们上传到远程或本地文件服务器来备份目录。Duplicity 是此解决方案的基石,它与 librsync、GnuPG 和许多文件传输机制集成在一起。Duplicity 提供了一种满足我的功能性、安全性和性能要求的机制。

Duplicity 首先使用 librsync 创建一个 tar 格式的卷,该卷由完全备份或增量备份组成。然后,它使用 GnuPG 对 tar 格式的卷进行加密和数字签名,从而提供所需的数据保密性和完整性。一旦 tar 格式的卷被加密和签名,Duplicity 就会使用其许多支持的文件传输机制之一将备份传输到指定的位置。在本例中,我使用了 SSH 文件传输机制,因为它确保备份在传输过程中被加密。这不是必需的,因为备份在传输之前已经加密和签名,但它确实为试图入侵系统的人增加了另一层保护和复杂性。此外,SSH 是一种常用的服务,它消除了安装另一个服务(例如 FTP、NFS 或 rsync)的需要。

An Automated Reliable Backup Solution

图 2. Silver Venus 668 机箱(背面)

硬件

一旦我决定构建此备份解决方案,我就必须决定要使用哪些硬件组件。鉴于我的功能性、可靠性、性能和一般要求,我决定构建一个基于 RAID 1—镜像—阵列的网络解决方案。这意味着我需要两个硬盘驱动器和一个 RAID 控制器,该控制器至少支持两个硬盘驱动器。

我首先查看了可能使用的小型主板。我在许多其他项目中使用过 Mini-ITX 主板,并且知道它几乎完全支持 Linux。鉴于此项目不需要快速 CPU,我决定使用 EPIA Mini-ITX ML8000A 主板,它具有 800MHz CPU、100Mb 网络接口和一个内置的 32 位 PCI 插槽。这满足了我的主板、CPU 和网络接口要求,并为 RAID 控制器提供了一个 PCI 插槽。

在确定了外形尺寸和主板之后,我必须选择一个机箱和电源,该机箱和电源将提供足够的空间来安装 PCI 硬件 RAID 控制器、Mini-ITX 主板和两个全尺寸硬盘驱动器,同时符合我的一般要求。我比较了大量的 Mini-ITX 机箱。我只找到一个 Silver Venus 668,它足够灵活以支持我需要的一切。选择主板和机箱后,我查看了 RAM 要求,我选择了 512MB 的 DDR266 RAM。我很难找到美国的 Mini-ITX 分销商。幸运的是,我找到了一家公司 Logic Supply,该公司以 301.25 美元(包括运费)的总价向我提供主板、机箱、电源和 RAM 的捆绑销售。此时,除了 RAID 控制器和硬盘驱动器之外,我已经拥有了所有组件。

找到令人满意的 RAID 控制器极其困难。许多 RAID 控制器实际上是在操作系统级别的驱动程序而不是 RAID 控制器卡本身的芯片中进行处理的。3ware 8006-2LP SATA RAID 控制器是一款双驱动器 SATA 控制器,它在控制器卡上进行处理。我从 Monarch Computer Systems 获得了 3ware 8006-2LP,总价为 127.83 美元,包括运费。

此时,我只需要硬盘驱动器。我最终决定从 Bytecom Systems, Inc. 购买两个 200GB Western Digital #2000JS SATA300 8MB 缓存驱动器,总价为 176.69 美元,包括运费。此时,我的所有硬件要求都已满足。最终,此系统的硬件组件总共花费了 604.77 美元——远低于 RAID 阵列网络设备的大约 1,000 美元成本,而这些设备未能满足我的大部分要求。

An Automated Reliable Backup Solution

图 3. Silver Venus 668 机箱(内部带硬件)

文件服务器

构建计算机后,由于 Debian stable 3.1r2 具有出色的软件包管理系统,因此我决定将 Debian stable 3.1r2 安装在新构建的服务器的 RAID 阵列上。然后我安装了一个 SSH 守护程序,以便可以安全地访问文件服务器。安装 SSH 软件包后,我在文件服务器上为自己创建了一个用户帐户。用户帐户主目录是备份数据存储的位置,所有想要备份到服务器的用户都将在文件服务器上拥有自己的帐户。

客户端设置

文件服务器设置完成后,我必须配置一台要备份的计算机。由于 Duplicity 与 GnuPG 和 SSH 集成,我配置了 GnuPG 和 SSH 以与 Duplicity 无人值守地工作。我在所有想要备份到新创建的文件服务器上的计算机上设置了以下配置。

安装 Duplicity

我在 Debian Linux 计算机上使用 apt-get 以超级用户身份使用以下命令安装了 Duplicity

# apt-get install duplicity
SSH DSA 密钥身份验证

安装 Duplicity 后,我创建了一个 DSA 密钥对并设置了 SSH DSA 密钥身份验证,以提供一种无需输入密码即可使用 SSH 的方法。有些人通过创建没有密码的 SSH 密钥来实现这一点。这非常危险,因为如果人们获得密钥,他们会立即拥有与原始密钥所有者相同的访问权限。使用受密码保护的密钥要求获得密钥的人也必须拥有密钥的密码才能获得访问权限。要创建 SSH 密钥对并设置 SSH DSA 密钥身份验证,我在客户端计算机上运行了以下命令序列

$ ssh-keygen -t dsa
$ scp ~/.ssh/id_dsa.pub <username>@<server>:
$ ssh <username>@<server>
$ cat id_dsa.pub >> ~/.ssh/authorized_keys2
$ exit

第一个命令创建 DSA 密钥对。第二个命令将先前生成的公钥复制到备份服务器。第三个命令在备份服务器上启动远程 shell。第四个命令将公钥附加到授权密钥列表,从而启用客户端计算机和备份服务器之间的密钥身份验证。第五个也是最后一个命令退出远程 shell。

GnuPG 密钥设置

设置 SSH 密钥身份验证后,我创建了一个 GnuPG 密钥,Duplicity 将使用该密钥对备份进行签名和加密。我以客户端计算机上的普通用户身份创建了一个密钥。将 GnuPG 密钥与普通用户帐户关联可以防止备份整个文件系统。如果我稍后决定要备份整个文件系统,我只需以客户端计算机上的 root 用户身份创建一个 GnuPG 密钥即可。要生成 GPG 密钥,我使用了以下命令

$ gpg --gen-key
Keychain

创建 GnuPG 和 SSH 密钥后,我做的第一件事是制作一张包含 SSH 和 GnuPG 密钥副本的 CD。然后我安装并设置了 Keychain。Keychain 是一个应用程序,用于管理 ssh-agent 和 gpg-agent 的长期实例,以提供一种机制,消除每次需要 GnuPG 或 SSH 密钥的命令都需要输入密码的需要。在 Debian 客户端计算机上,我首先必须安装 keychain 和 ssh-askpass 软件包。然后我编辑了 /etc/X11/Xsession.options 文件,并注释掉了 use-ssh-agent 行,以便每次我使用 Xsession 登录时都不会启动 ssh-agent。然后我将以下行添加到我的 .bashrc 文件中以正确启动 Keychain

/usr/bin/keychain ~/.ssh/id_dsa 2> /dev/null
source ~/.keychain/`hostname`-sh

之后,我向我的 gnome-session 添加了一个 xterm 实例化,以便 xterm 反过来启动一个 bash 实例,该实例读取 .bashrc 文件并运行 Keychain。当执行 Keychain 时,它会检查密钥是否已被缓存;如果未被缓存,则每次我启动计算机并登录时,它都会提示我输入一次密钥密码。

使用 Duplicity

安装和配置 Keychain 后,我能够通过配置 cron 执行 Duplicity 来简单地对目录进行无人值守备份。我使用以下命令备份了我的主目录

$ duplicity --encrypt-key AA43E426 \
--sign-key AA43E426 /home/username \
scp://user@backup_serv/backup/home

备份我的主目录后,我使用以下命令验证了备份

$ duplicity --verify --encrypt-key AA43E426 \
--sign-key AA43E426 \
scp://user@backup_serv/backup/home \
/home/username

假设我不小心删除了客户端计算机上的主目录。要从备份服务器恢复它,我将使用以下命令

$ duplicity --encrypt-key AA43E426 \
--sign-key AA43E426 \
scp://user@backup_serv/backup/home \
/home/username

但是,我的 GnuPG 和 SSH 密钥通常存储在我的主目录中。没有密钥,我无法恢复我的备份。因此,我首先从我之前保存密钥的 CD 中恢复了我的 GPG 和 SSH 密钥。

此解决方案还提供了清理备份服务器上指定日期和时间的文件的功能。鉴于此功能,我还将以下命令添加到我的 cron tab 中,以删除超过两个月的任何备份

$ duplicity --remove-older-than 2M \
--encrypt-key AA43E426 --sign-key AA43E426 \
scp://user@backup_serv/backup/home \
/home/username

此命令节省了磁盘空间,但它限制了我可以恢复数据的最早时间。

结论

此解决方案对我来说效果很好。它提供了我需要的关键功能,并满足了我所有的要求。然而,它并不完美。Duplicity 目前不支持硬链接;它将它们视为单独的文件。因此,在包含硬链接的备份恢复中,会生成单独的文件,而不是一个带有相关硬链接的文件。

尽管 Duplicity 缺乏对硬链接的支持,但这仍然是我选择的备份解决方案。Duplicity 的开发最近似乎已经加快了,也许这个开发阶段会增加硬链接支持。也许我会找到时间自己添加此支持。无论哪种方式,这都提供了一个无人值守、加密、冗余的网络备份解决方案,只需花费很少的金钱或精力即可设置。

Andrew J. De Ponte 是一位安全专业人士和狂热的软件开发人员。自 1997 年以来,他一直使用各种基于 UNIX 的发行版,并认为成功的关键通常在于设计和生产力的平衡。他等待着在 cyphactor@socall.rr.com 收到评论和问题。

加载 Disqus 评论