如何在GPG中使用Duplicity将数据备份到DigitalOcean空间

Duplicity是一个用Python编写的命令行实用程序,它产生加密的tar卷以存储在本地或远程存储库上。它使用GNU Privacy Guard(GPG)对其存档和rsync算法进行加密和签名,以创建增量,节省空间的备份。在本教程中,我们将安装Duplicity,并了解如何将项目数据备份到DigitalOcean Spaces。

介绍

Duplicity是一个用Python编写的命令行实用程序,它产生加密的tar卷以存储在本地或远程存储库上。 它使用GNU Privacy Guard(GPG)对其存档和rsync算法进行加密和签名,以创建增量,节省空间的备份。 备份可以传输到各种存储库,包括本地文件存储,SFTP或FTP服务器以及S3兼容对象存储。

在本教程中,我们将安装Duplicity,并了解如何将项目数据备份到兼容S3的对象存储服务DigitalOcean Spaces。 我们将为此创建一个Spaces存储库,并介绍如何手动备份数据。 最后,我们将通过创建一个脚本来自动执行此过程,该脚本将设置增量和每周完整备份计划。

先决条件

对于本教程,您将需要:

一旦你建立了空间并掌握了这些信息,就可以继续安装Duplicity。

安装Duplicity

要获得最新版本的Duplicity,我们可以从Duplicity发布个人包档案(PPA)中安装它:

sudo apt-add-repository ppa:duplicity-team/ppa

我们还将安装python-boto软件包以访问Boto ,这是一个为Amazon Web Services提供接口的Python软件包。 这将有助于我们利用Spaces与AWS S3 API的互操作性。 我们将从官方的Ubuntu存储库安装python-boto ,因为这个版本与我们Ubuntu服务器映像附带的Python版本兼容。 如果您更愿意使用Boto3 ,则可以从源代码安装它,但与Python 3.3+的功能兼容性仍在开发中。

除了python-boto ,我们还将安装Haveged ,这个工具将帮助我们生成创建GPG密钥所需的 为了创建这些密钥,GPG利用了我们系统中的熵或不可预测性。 安装haveged将帮助我们加快关键创建过程。

在安装这些软件包之前,请更新本地存储库索引:

sudo apt-get update

然后安装havegedpython-boto ,然后输入:

sudo apt-get install duplicity haveged python-boto

出现提示时按y确认安装。 我们现在已经在我们的系统上安装了Duplicity,并准备创建我们的项目文件夹和配置文件。

创建一个备份目录

为了演示备份过程如何工作,我们将在非root用户的主目录中创建一个备份目录以及一些示例数据。 我们将调用我们的目录sammy_backups

mkdir ~/sammy_backups

接下来,创建一个名为historical_sharks.txt的示例项目文件:

echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt

使用我们的备份目录和测试数据,我们准备为我们的非root用户生成一个GPG密钥。

生成GPG密钥

接下来,我们将为我们的用户生成一个GPG密钥对。 为确保信息的安全传输,GPG使用公钥加密。 这意味着在我们的上下文中,数据将被加密到我们的公钥并发送到我们的存储库。 有关GPG密钥和加密的更多信息,请参阅我们的关于如何使用GPG签署和加密消息的教程。

我们的钥匙圈将被存储在我们的用户帐户的一个名为~/.gnupg的目录中,该目录将在我们生成密钥时创建。 当我们使用duplicity命令时,我们将指定一个指向我们密钥对的公钥标识符。 使用此标识符可启用数据加密和验证我们对私钥的所有权的签名。 加密的数据将被传输到我们的存储库,在这里很难从文件本身推断远远大于文件大小和上传时间。 这保护了我们的数据,我们的用户可以随时用私钥全面恢复数据。

GPG应默认安装在我们的服务器上。 要测试这个,输入:

gpg --version

验证完GPG后,您可以按如下方式生成密钥对:

gpg --gen-key

您将被问到一系列问题来配置您的密钥:

  • 键的类型。 选择(1)RSA和RSA(默认)
  • 密钥的大小。 ENTER将确认2048位的默认大小。
  • 重要到期日期。 输入1y后 ,我们将创建一年后过期的密钥。
  • 确认你的选择。 您可以通过输入y来完成此操作。
  • 用户名/真实姓名。 输入你的名字
  • 电子邮件地址。 输入你的电邮地址
  • 评论。 在这里,您可以输入一个可选的注释 ,该注释在您的签名中可见。
  • 更改(N)ame,(C)omment,(E)邮件或(O)kay /(Q)uit? 如果您准备好继续,请键入O.
  • 输入密码。 你会被要求在这里输入密码 一定要记下这个密码 我们将在本教程的其余部分回顾它作为your-GPG-key-passphrase

创建这些设置后, gpg将根据系统中的熵级别生成密钥。 由于我们安装了haveged ,我们的密钥应该很快或者立即生成。 您将看到包含以下内容的输出:

...
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key your-GPG-public-key-id marked as ultimately trusted
public and secret key created and signed.
...

记下your-GPG-public-key-id ,因为我们将在下一节中使用它来配置我们的本地环境变量。

创建手动备份

我们现在将设置环境变量,以便在运行duplicity命令时不需要在命令行上输入任何机密信息。 这些变量将在我们当前的会话期间提供给我们的用户,我们将它们存储在一个隐藏的目录中,以便它们可供以后使用。 我们将定义为环境变量的duplicity需要的变量包括我们的空间访问密钥和秘密,以及我们的GPG公钥ID和密码。

首先,让我们在用户的主目录中创建一个隐藏的目录来存储配置文件:

mkdir ~/.duplicity

接下来,让我们创建一个名为.env_variables.conf的文件来定义我们的变量,我们将使用export语句来执行这些变量。 这些语句将使这些变量可供程序供以后使用。 输入以下内容打开文件:

nano ~/.duplicity/.env_variables.conf

在文件中,设置空间访问密钥和秘密,以及您的GPG公钥ID和密码:

〜/ .duplicity / .env_variables.conf
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

完成后保存并关闭文件。

我们现在可以在文件上设置权限,以确保只有我们当前的非root用户具有读写权限:

chmod 0600 ~/.duplicity/.env_variables.conf

通过输入以下内容使这些变量可用于当前的Bash会话中:

source ~/.duplicity/.env_variables.conf

接下来,我们将运行duplicity来创建我们~/ sammy_backups目录的手动完整备份。 在没有full操作的情况下运行duplicity操作将创建初始完整备份,然后是增量备份。 我们将在第一次使用该命令时创建完整备份,但是如果您希望为该目录创建另一个完全手动备份,则需要指定full操作。

我们将在我们的命令中定义的其他选项包括:

  • --verbosity :这将在我们的输出中指定我们想要的信息的级别。 我们将指定info ,它将提供比默认notice设置更多的详细信息。
  • --encrypt-sign-key :这将告诉我们在GPG_KEY变量中用your-GPG-public-key-idGPG_KEY your-GPG-public-key-id中的GPG_KEY 它还会告诉用户使用相同的标识符来启用签名功能。
  • --log-file :该选项将指定日志文件的位置,这些位置也可供其他程序使用。 这将给我们一个直观的地方看看,以防我们需要排除故障。 我们将指定日志文件位置为/home/ sammy /.duplicity/info.log

最后,我们将指定我们正在备份的目录和我们的存储库端点。 我们将备份用户主目录中的~/ sammy_backups目录。 我们的存储库将是我们的空间,我们将使用以下信息来定义它: s3:// spaces_endpoint / bucket_name / 您可以按如下方式确定您的端点和存储桶名称:如果您的空间的URL为https:// sammys-bucket .nyc3.digitaloceanspaces.com ,则sammys-bucket是您的存储桶名称, nyc3.digitaloceanspaces.com是您的端点。

我们的duplicity命令最终将如下所示:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/

运行此命令后,我们将看到如下输出:

...
--------------[ Backup Statistics ]--------------
StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 2
SourceFileSize 4226 (4.13 KB)
NewFiles 2
NewFileSize 4226 (4.13 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 130 (130 bytes)
TotalDestinationSizeChange 955 (955 bytes)
Errors 0
-------------------------------------------------

要按照预期检查文件上传到您的空间,您可以导航到DigitalOcean控制面板中的Spaces页面,检查它们是否在那里。

恢复文件

为了测试我们可以恢复我们的数据,我们现在将删除我们的示例文件并从我们的存储库中恢复它。 要用Duplicity恢复文件,我们可以使用--file-to-restore选项。 还需要颠倒我们的duplicity命令中的项目顺序:我们的存储库URL现在将作为原点,而我们的备份目录将成为我们恢复的文件的目标。

输入以下命令删除文件:

rm ~/sammy_backups/historical_sharks.txt

检查以确保文件已被删除:

cat ~/sammy_backups/historical_sharks.txt

您应该看到以下输出:

cat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

接下来,让我们从我们的空间恢复这个文件。 使用--file-to-restore选项可以指定我们想要恢复的文件的路径。 该路径应该与我们备份的目录相关; 在我们的例子中,我们的相对路径是historical_sharks.txt 我们还将颠倒我们的空间URL和备份目录的顺序,以表明我们正在从我们的存储库恢复文件:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

你会看到如下输出:

...
Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
Found 1 volumes in manifest
Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
Processed volume 1 of 1

再次运行cat将输出已还原的historical_sharks.txt文件的内容:

cat ~/sammy_backups/historical_sharks.txt
The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

现在我们已经创建了~/ sammy_backups目录的手动备份并从我们的存储库中恢复了数据,现在我们准备好继续自动化备份过程。

自动备份

自动执行备份过程可以帮助确保~/ sammy_backups目录中的数据保持可恢复和最新状态。 我们可以使用cron作业调度程序来创建一个备份计划,该计划将包括每周的完整备份以及其他备份。 要了解有关使用cron计划任务的更多信息,请查看我们的关于如何使用Cron和Anacron在VPS上安排例行任务的教程。

首先,我们在~/.duplicity目录下创建一个备份脚本:

nano ~/.duplicity/.backup.sh

在这个文件中,我们将首先指定这个脚本将由Bash shell运行:

〜/ .duplicity / .backup.sh
#!/bin/bash

接下来,我们将创建一个HOME变量来与我们的sourceduplicity命令一起使用。 请务必将突出显示的用户名,备份目录和存储桶名称替换为您的信息:

〜/ .duplicity / .backup.sh
...
HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

sourceduplicity命令在我们创建手动备份时完成了相同的工作: source将我们的环境变量加载到当前上下文中,而duplicity创建加密的tar卷以发送到我们的存储库。 我们的选项都保持不变,除了增加 - --full-if-older-than选项。 设置为7D ,此选项指定每周完成一次完整备份,一旦最后一次完整备份超过七天。

我们的脚本中的最后一个元素将是未unset命令,它将删除我们的环境变量作为安全措施:

〜/ .duplicity / .backup.sh
...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

完整的脚本将如下所示:

〜/ .duplicity / .backup.sh
#!/bin/bash

HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

当您对脚本感到满意时,您可以保存并关闭文件。 我们还将设置权限以确保只有我们当前的非sudo用户才具有读取,写入和执行文件的能力:

chmod 0700 ~/.duplicity/.backup.sh

最后,我们可以通过编辑用户的crontab文件来自动执行我们的备份计划。 输入以下内容打开该文件进行编辑:

crontab -e 

因为这是我们第一次编辑这个文件,我们将被要求选择一个编辑器:

crontab中
no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]: 
...

您可以为nano选择2 ,或输入与您选择的编辑器相对应的编号。

在文件底部,我们将添加一行来指定脚本应该运行的频率。 为了测试它的功能,我们可以将我们的时间间隔设置为两分钟,如下所示:

crontab中
...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

保存并关闭文件。 两分钟后,您可以导航到DigitalOcean控制面板中的Spaces页面 ,您应该在该页面上看到增量备份文件。 您现在可以修改crontab文件以指定您希望用于增量备份的时间间隔。

结论

在本教程中,我们介绍了如何将特定目录的内容备份到Spaces存储库。 使用配置文件来存储我们的存储库信息,我们创建了数据的手动备份,我们通过恢复示例文件来测试数据,以及自动备份计划。

有关Duplicity的更多信息,您可以查看项目网站以及duplicity手册页 本文档涵盖了Duplicity的许多功能,并提供了有关创建完整系统备份的指导。