如何使用 Duplicity 和 GPG 在 Ubuntu 上安全地自动备份如何使用 Duplicity 和 GPG 在 Ubuntu 上安全地自动备份如何使用 Duplicity 和 GPG 在 Ubuntu 上安全地自动备份如何使用 Duplicity 和 GPG 在 Ubuntu 上安全地自动备份
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何使用 Duplicity 和 GPG 在 Ubuntu 上安全地自动备份

介绍

Duplicity 是一个多功能的本地和远程备份程序,可以实现多种传输协议和第三方存储解决方案。

在本指南中,我们将讨论如何在 Ubuntu 12.04 VPS 上安装 duplicity。我们将从源代码安装,然后配置它以利用 GPG 加密。

接下来,您需要访问两台机器,一台 Ubuntu 12.04 VPS,将进行备份,另一台 Linux 机器或任何类型的 VPS 都可以通过 SSH 访问。

如何在 Ubuntu 上从源代码安装 Duplicity

我们在本指南中使用的是 Ubuntu 12.04 VPS。默认存储库中的口是心非的包已经过时了,实际上由于后端的变化,在连接到远程主机时遇到了一些问题。

我们将通过获取源文件并手动安装来避免这些问题。

以 root 身份登录到您将要备份的 Ubuntu 12.04 VPS。

安装先决条件包

虽然我们是从源代码安装 duplicity,但我们将从默认的 Ubuntu 存储库中获取先决条件。

更新源数据库,然后使用以下两个命令安装所需的包:

apt-get update
apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev

这会安装许多不同的处理程序,用于将数据传输到远程计算机。我们不会在本指南中使用其中的大部分内容,但它们是不错的选择。

从源代码下载并安装 Duplicity

口是心非的源文件位于 launchpad.net。我们会将它们下载到 root 用户的主目录。

cd /root
wget http://code.launchpad.net/duplicity/0.6-series/0.6.22/+download/duplicity-0.6.22.tar.gz

解压源代码并移动到创建的包目录中:

tar xzvf duplicity*
cd duplicity*

接下来,我们将使用以下命令完成实际安装:

python setup.py install

因为这是从源码安装的包,所以会放在/usr/local/bin/目录下。

创建 SSH 和 GPG 密钥

我们的口是心非的配置将使用两种不同的密钥来实现便利性和安全性之间的良好交集。

我们将使用 SSH 密钥与远程系统安全地进行身份验证,而无需提供密码。在将数据传输到备份位置之前,我们还将使用 GPG 对数据进行加密。

创建 SSH 密钥

我们将为我们的根用户生成一个 RSA 加密的 SSH 密钥,以允许无密码登录到将托管备份的机器。

如果您还没有这样做,请确保您在要将数据传输到的机器上配置了 root 密码。您可以通过以 root 身份登录机器(如果这是 VPS,则通过 SSH 或 droplets 页面上的 Console Access 按钮)并发出以下命令来执行此操作:

passwd

回到口是心非的液滴中,我们将使用以下命令生成密钥对:

ssh-keygen -t rsa

在提示时按 Enter 以使用默认设置创建无密码 SSH 密钥。

使用此命令将其传输到将托管您的备份的系统:

ssh-copy-id root@backupHost

回答 yes 接受未经验证的主机,然后输入远程系统的 root 密码以传输您的公钥。

通过发出以下命令,测试您现在是否可以在不使用密码的情况下从口是心非的 Droplet 登录:

ssh root@backupHost

您应该已登录,而无需提供任何进一步的凭据。

当您通过 SSH 登录时,创建将存放我们的备份文件的目录结构:

mkdir -p /remotebackup/duplicityDroplet

您可以随意命名该目录,但请记住该值以便稍后指定。

完成后,返回到你的口是心非的液滴中:

exit

创建 GPG 密钥

我们将使用 GPG 来提供额外的安全性和加密。这些命令会将我们的密钥存储在 /root/.gnupg/ 的隐藏目录中:

gpg --gen-key

您将被问到一系列配置密钥对参数的问题。

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

按 enter 键接受默认的“RSA 和 RSA”密钥。再次按 enter 键两次接受默认密钥大小和无到期日期。

键入 y 以确认您的参数。

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Your Name
Email address: your_email@example.com
Comment: 
You selected this USER-ID:
    "Your Name <your_email@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

输入姓名、电子邮件地址以及可选的将与此密钥相关联的评论。输入 O 以确认您的信息。

接下来,您将设置一个用于 GPG 的密码。与 SSH 密钥不同,在 SSH 密钥中,我们默认没有密码允许在后台进行重复操作,您应该为此步骤提供密码以允许对数据进行安全加密和解密。

Enter passphrase:
Repeat passphrase:

此时,系统会要求您生成熵。熵基本上是一个描述系统中不可预测性的词。您的 VPS 需要熵来创建实际上是随机的密钥。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)

如果您需要一些帮助来创建熵,这里有一个关于使用 Haveged 生成熵的指南。根据我的经验,只需从 apt 安装一些软件包就足以生成所需的熵。使用新终端通过 SSH 登录来执行此操作。

当您生成了足够多的随机信息后,您的密钥将被创建:

gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 05AB3DF5 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/05AB3DF5 2013-09-19
      Key fingerprint = AF21 2669 07F7 ADDE 4ECF  2A33 A57F 6998 05AB 3DF5
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

上面突出显示的部分是您的公钥 ID。稍后您将需要它来加密您将要传输的数据。

如果你忘记记下你的公钥 ID,你可以通过查询 gpg keyring 重新获取它:

gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/05AB3DF5 2013-09-19
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

我们现在拥有所有必要的组件,可以使用口是心非来安全备份。

如何使用口是心非

运行初始测试

我们将通过创建一个虚拟文件文件夹进行备份来运行我们口是心非的系统的初始测试。运行以下命令:

cd ~
mkdir test
touch test/file{1..100}

这会在根主目录中创建一个名为 test 的目录。然后它用编号为 1-100 的文件填充目录。

我们会将文件移动到远程服务器,首先没有我们生成的 GPG 密钥。我们将使用 \sftp,它是 SSH 中包含的一种安全协议,可复制 ftp 的功能。

duplicity /root/test sftp://root@backupHost//remotebackup/duplicityDroplet

注意远程主机和文件路径之间的双斜杠。这是因为我们指定了绝对路径。如果它是 sftp 将我们放入的默认目录的相对路径,我们可以只使用一个斜杠。

系统将要求您接受远程主机,然后要求您创建并确认用于加密数据的密钥。如您所见,GPG 仍将被使用,除非我们明确告诉它不要这样做。唯一的区别是我们没有使用我们创建的密钥,我们可以在这里输入任何密码。

Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
The authenticity of host '162.243.2.14' can't be established.
SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
Are you sure you want to continue connecting (yes/no)? yes
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase: 
Retype passphrase to confirm:

然后备份运行,当过程完成时,您将看到统计信息:

No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
ElapsedTime 0.11 (0.11 seconds)
SourceFiles 101
SourceFileSize 4096 (4.00 KB)
NewFiles 101
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 101
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 1022 (1022 bytes)
Errors 0
-------------------------------------------------

如果我们通过 SSH 进入远程系统,我们可以看到备份成功完成:

ssh root@backupHost
cd /remotebackup/duplicityDroplet
ls

duplicity-full.20130919T181705Z.manifest.gpg
duplicity-full.20130919T181705Z.vol1.difftar.gpg
duplicity-full-signatures.20130919T181705Z.sigtar.gpg

这些文件包含备份信息。由于这只是一个测试,我们可以通过运行删除它们:

rm duplicity*

退回口是心非的液滴:

exit

我们现在可以删除测试目录及其所有内容:

rm -r /root/test

创建您的第一个备份

我们将使用以下通用语法创建我们的第一个真正的备份:

duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityDroplet

我们将备份整个根目录,/proc、/sys 和 /tmp 除外。我们将使用我们创建的 GPG 密钥。为此,我们在命令中指定 ID,并在命令前加上密码:

PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

上面的命令需要一些时间。因为这是我们第一次运行备份,口是心非会创建一个完整的备份。 Duplicity 将数据块分成多个卷以简化文件传输。

--------------[ Backup Statistics ]--------------
StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
ElapsedTime 185.38 (3 minutes 5.38 seconds)
SourceFiles 33123
SourceFileSize 813465245 (776 MB)
NewFiles 33123
NewFileSize 813464221 (776 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 33123
RawDeltaSize 802133584 (765 MB)
TotalDestinationSizeChange 369163424 (352 MB)
Errors 0
-------------------------------------------------

在一个新的 Droplet 上,我的配置创建了 15 个卷,这些卷被传输到远程系统。

因为我们现在在远程系统上进行了完整备份,所以我们的下一次备份将自动成为增量备份。这些速度更快,需要的数据传输更少。我的第一次运行用了三分钟多,而我的增量备份用了不到八秒。

--------------[ Backup Statistics ]--------------
StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
ElapsedTime 7.57 (7.57 seconds)
SourceFiles 33128
SourceFileSize 820560987 (783 MB)
NewFiles 11
NewFileSize 12217723 (11.7 MB)
DeletedFiles 3
ChangedFiles 1
ChangedFileSize 600 (600 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15
RawDeltaSize 12197851 (11.6 MB)
TotalDestinationSizeChange 12201207 (11.6 MB)
Errors 0
-------------------------------------------------

要强制进行另一次完整备份,您可以在任何选项之前将 \full 命令添加到口是心非的调用中:

PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

恢复备份

口是心非使恢复变得容易。您可以通过简单地反转远程和本地参数来恢复。

我们不需要加密密钥选项,因为我们只是解密数据。我们也不需要排除参数,因为它们最初不包含在备份中。

例如,如果我们想完整地恢复刚刚备份的数据,我们可以使用这个命令:

PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityDroplet /

也许更安全的选择是只恢复您需要的文件或目录。您可以通过向上述命令添加一个选项来执行此操作:

PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityDroplet /path/to/restore/file

确保你测试了你正确恢复的能力,这样当你处于可怕的境地时就不会遇到问题。

自动备份

我们可以通过创建一些 cron 作业来自动化口是心非。单击此处了解有关如何配置 cron 的更多信息。

创建密码文件

我们将创建一个受保护的文件来存储我们的 GPG 密码,这样我们就不必将其直接放在我们的自动化脚本中。

转到 root 用户的主目录并使用文本编辑器创建一个新的隐藏文件:

cd /root
nano .passphrase

我们唯一需要放入此文件的是您在口是心非的命令之前使用的密码规范:

PASSPHRASE="passphrase_for_GPG"

保存并关闭文件。

通过执行以下命令使其只能由 root 读取:

chmod 700 /root/.passphrase

设置每日增量备份

我们将设置口是心非来创建每日增量备份。这将使我们的备份保持最新。

/etc/cron.daily 中列出的脚本每天运行一次,因此这是创建备份脚本的最佳位置。

导航到该文件夹并创建一个名为 duplicity.inc 的文件:

cd /etc/cron.daily
nano duplicity.inc

将以下 bash 脚本复制到文件中。将 duplicity 命令替换为您要用于备份系统的命令。

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

保存并关闭文件。

通过键入以下命令使其可执行:

chmod 755 duplicity.inc

通过调用它来测试它:

./duplicity.inc

它应该没有任何错误地完成。

设置每周完整备份

增量备份建立在完整备份之上。这意味着随着变化的叠加,它们将变得越来越笨拙。我们将配置每周完整备份以刷新基础。

我们将通过在 /etc/cron.weekly 目录中创建一个类似的脚本来做到这一点。

导航到目录并创建一个新文件:

cd /etc/cron.weekly
nano duplicity.full

将以下 bash 脚本复制到文件中。请注意,我们包含了 \full 命令以强制口是心非地运行完整备份。

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

我们还将在最后添加一个额外的口是心非的命令来清除旧的备份文件。我们将保留总共三个完整备份及其关联的增量备份。

将此添加到文件末尾

$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet

保存并关闭文件。

使用以下命令使其可执行:

chmod 755 duplicity.full

通过调用测试它:

./duplicity.full

它应该进行完整备份,然后删除任何必要的文件。

结论

您现在应该拥有一个完全可操作的自动化备份解决方案。请务必定期验证您的备份,以免成为错误的安全感的牺牲品。

还有许多其他可用的备份工具,但 duplicity 是一种灵活、简单的解决方案,可以满足许多用户的需求。

©2015-2025 艾丽卡 support@alaica.com