如何使用GPG复制功能将数据备份到DigitalOcean空间

介绍

Duplicity是一个用Python编写的命令行实用程序,用于在本地或远程存储库中存储加密的tar卷。它使用GNU Privacy Guard(GPG)(https://www.gnupg.org/)来加密和签署其档案,并使用rsync算法创建增量、空间高效的备份。备份可以传输到各种存储库,包括本地文件存储、SFTP或FTP服务器和S3兼容的对象存储。

在本教程中,我们将安装Duplicity,并讨论如何将项目数据备份到DigitalOcean Spaces,一个S3兼容的对象存储服务. 我们将为此创建一个Spaces存储库,并介绍如何手动备份数据。

前提条件

对于这个教程,你将需要:

一旦您有空间设置和此信息在手中,您可以继续安装重复性。

安装重复性

要获取最新的 Duplicity 版本,我们可以从 Duplicity releases Personal Package Archive (PPA)中安装它:

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

我们还将安装python-boto包,以便访问 Boto,这是一个向亚马逊 Web Services 提供接口的 Python 包,这将有助于我们利用 Spaces 与 AWS S3 API 的互操作性。我们将从官方 Ubuntu 存储库中安装python-boto,因为这个版本与我们的 Ubuntu 服务器图像搭载的 Python 版本兼容。

除了「python-boto」,我們還會安裝 Haveged,這是一個工具,可以幫助我們生成所需的 entropy來創建我們的 GPG 鑰匙。

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

1sudo apt-get update

然后安装重复性,python-botohaveged,键入:

1sudo apt-get install duplicity haveged python-boto

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

创建备份目录

为了展示备份过程的运作方式,我们将在我们的非根用户主目录中创建我们的备份目录,以及一些样本数据。

1mkdir ~/sammy_backups

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

1echo "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

有了我们的备份目录和测试数据,我们准备为我们的非根用户生成GPG密钥。

生成 GPG 密钥

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

我们的密钥将存储在我们的用户帐户中,名为~/.gnupg的目录中,当我们生成密钥时将被创建。当我们使用重复性命令时,我们将指定一个指向我们的密钥对的公共密钥标识符。使用这个标识符将允许数据加密和签名,以验证我们对私钥的所有权。加密数据将传输到我们的存储库,在那里很难从文件本身推断的文件大小和上传时间。

GPG 应该默认安装在我们的服务器上. 要测试这一点,键入:

1gpg --version

一旦您确认 GPG 已安装,您可以如下生成一个密钥对:

1gpg --gen-key

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

  • 密钥类型. 选择 (1) RSA 和 RSA (默认).
  • 密钥大小. 点击 ENTER 将确认 2048 的默认大小.
  • 密钥到期日. 输入 1y,我们将创建一个在一年后到期的密钥。
  • 确认您的选择. 您可以通过输入 y.
  • 用户 ID/真实姓名. 输入 您的姓名.
  • 电子邮件地址. 输入 您的电子邮件地址.
  • 评论. 在这里,您可以输入 ** 可选评论**,将与您的签名可见。

创建这些设置后,gpg将基于系统内度水平生成密钥. 由于我们安装了haveged,我们的密钥应该很快或立即生成。

1[secondary_label Output]
2...
3gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
4gpg: key your-GPG-public-key-id marked as ultimately trusted
5public and secret key created and signed.
6...

请注意你的GPG-公共密钥-id,因为我们将在下一节中使用它来配置我们的本地环境变量。

创建手动备份

我们现在将设置环境变量,以便在运行重复性命令时不需要在命令行中输入任何机密信息。这些变量将在当前会话期间为我们的用户提供,我们将它们存储在隐藏的目录中,以便它们可用于以后使用。

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

1mkdir ~/.duplicity

接下来,让我们创建一个名为 .env_variables.conf’的文件来定义我们的变量,我们将使用 export` 语句进行定义。

1nano ~/.duplicity/.env_variables.conf

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

1[label ~/.duplicity/.env_variables.conf]
2export AWS_ACCESS_KEY_ID="your-access-key"
3export AWS_SECRET_ACCESS_KEY="your-secret-key"
4export GPG_KEY="your-GPG-public-key-id"
5export PASSPHRASE="your-GPG-key-passphrase"

保存并关闭文件,当你完成。

现在我们可以对文件设置权限,以确保只有我们当前的非根用户才能访问阅读和写入:

1chmod 0600 ~/.duplicity/.env_variables.conf

通过键入,使这些变量可用于当前Bash会话中:

1source ~/.duplicity/.env_variables.conf

接下来,我们将运行重复性,以创建我们的~/sammy_backups目录的手动完整备份。在没有完整操作的情况下运行重复性将创建一个初始的完整备份,然后是增量备份。

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

  • --verbosity:这将指定我们在我们的输出中想要的信息的水平。我们将指定 info,这将提供比默认 通知 设置的更多细节。
  • --encrypt-sign-key: 这将告诉 duplicity 加密到我们在 GPG-public-key-id 变量中识别的对公共密钥中的公共密钥。 它还会告诉 duplicity 使用相同的标识符来启用签名功能。
  • -log-file: 此选项将指定日志文件的位置,这也将为其他程序提供。 这将给我们一个简单的地方,如果我们需要解决问题。 我们将指定日志文件的位置为 `/home/sammy/.d

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

我们的双重性命令最终将看起来如下:

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

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

 1[secondary_label Output]
 2...
 3--------------[ Backup Statistics ]--------------
 4StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
 5EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
 6ElapsedTime 0.01 (0.01 seconds)
 7SourceFiles 2
 8SourceFileSize 4226 (4.13 KB)
 9NewFiles 2
10NewFileSize 4226 (4.13 KB)
11DeletedFiles 0
12ChangedFiles 0
13ChangedFileSize 0 (0 bytes)
14ChangedDeltaSize 0 (0 bytes)
15DeltaEntries 2
16RawDeltaSize 130 (130 bytes)
17TotalDestinationSizeChange 955 (955 bytes)
18Errors 0
19-------------------------------------------------

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

恢复文件

为了测试我们能恢复数据,我们现在将删除我们的样本文件并从我们的存储库中恢复它. 为了使用 Duplicity 恢复文件,我们可以使用 --file-to-restore 选项。 在我们的 duplicity 命令中,还需要扭转项目的顺序:我们的存储 URL 现在将作为来源,我们的备份目录将是我们恢复的文件的目的地。

通过键入删除文件:

1rm ~/sammy_backups/historical_sharks.txt

检查以确保文件已删除:

1cat ~/sammy_backups/historical_sharks.txt

你应该看到以下结果:

1[secondary_label Output]
2cat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

接下来,让我们从我们的空间恢复这个文件. 选项 --file-to-restore 允许我们指定我们想要恢复的文件的路径. 这个路径应该与我们已经备份的目录相对; 在我们的情况下,我们的相对路径将是 historical_sharks.txt. 我们还会扭转我们的空间 URL 和备份目录的顺序,表示我们正在从我们的存储库中恢复该文件:

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

你会看到这样的输出:

1[secondary_label Output]
2...
3Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
4Found 1 volumes in manifest
5Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
6Processed volume 1 of 1

再次运行cat将输出恢复的historical_sharks.txt文件的内容:

1cat ~/sammy_backups/historical_sharks.txt
1[secondary_label Output]
2The 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来安排任务的更多信息,请参阅我们的教程(How To Schedule Routine Tasks With Cron and Anacron on a VPS)(https://andsky.com/tech/tutorials/how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps)。

首先,让我们在我们的~/.duplicity目录中创建备份脚本:

1nano ~/.duplicity/.backup.sh

在此文件中,我们首先将指定此脚本将由Bash壳运行:

1[label ~/.duplicity/.backup.sh]
2#!/bin/bash

接下来,我们将创建一个HOME变量以与我们的重复性命令一起使用。

 1[label ~/.duplicity/.backup.sh]
 2...
 3HOME="/home/sammy"
 4
 5source "$HOME/.duplicity/.env_variables.conf"
 6
 7duplicity \
 8    --verbosity info \
 9    --encrypt-sign-key="$GPG_KEY" \
10    --full-if-older-than 7D \
11    --log-file "$HOME/.duplicity/info.log" \
12    /home/sammy/sammy_backups \
13    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

这里的重复性命令与我们创建手动备份时的工作相同:将我们的环境变量加载到当前的背景中,而重复性会创建加密的 tar 卷来发送到我们的存储库。

我们的脚本中的最终元素将是启动命令,将删除我们的环境变量作为安全措施:

1[label ~/.duplicity/.backup.sh]
2...
3unset AWS_ACCESS_KEY_ID
4unset AWS_SECRET_ACCESS_KEY
5unset GPG_KEY
6unset PASSPHRASE

完整的剧本将是这样的:

 1[label ~/.duplicity/.backup.sh]
 2#!/bin/bash
 3
 4HOME="/home/sammy"
 5
 6source "$HOME/.duplicity/.env_variables.conf"
 7
 8duplicity \
 9    --verbosity info \
10    --encrypt-sign-key="$GPG_KEY" \
11    --full-if-older-than 7D \
12    --log-file "$HOME/.duplicity/info.log" \
13    /home/sammy/sammy_backups \
14    s3://nyc3.digitaloceanspaces.com/sammys-bucket/
15
16unset AWS_ACCESS_KEY_ID
17unset AWS_SECRET_ACCESS_KEY
18unset GPG_KEY
19unset PASSPHRASE

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

1chmod 0700 ~/.duplicity/.backup.sh

最后,我们可以通过编辑我们的用户的crontab文件来自动化我们的备份时间表。

1crontab -e

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

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

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

在文件的底部,我们将添加一行,以指定我们的脚本应该运行多少次. 为了测试其功能,我们可以将时间间隔设置为两分钟如下:

1[label crontab]
2...
3
4*/2 * * * * /home/sammy/.duplicity/.backup.sh

保存和关闭文件. 两分钟后,您可以导航到您的 DigitalOcean 控制面板中的空间页面,在那里您应该看到增量备份文件。

结论

在本教程中,我们涵盖了如何将特定目录的内容备份到 Spaces 存储库. 使用配置文件存储我们的存储库信息,我们创建了我们数据的手动备份,我们通过恢复样本文件和自动备份时间表来测试。

有关 Duplicity 的更多信息,您可以查看 项目网站以及 duplicity 人的页面

Published At
Categories with 技术
comments powered by Disqus