如何在GPG上使用Duplicity在Ubuntu上安全地自动备份
介绍
Duplicity 是一个多功能的本地和远程备份程序,可以实现多种传输协议和第三方存储解决方案。
在本指南中,我们将讨论如何在 Ubuntu 12.04 VPS 上安装 duplicity。 我们将从源代码安装,然后配置它以利用 GPG 加密。
接下来,您将需要访问两台机器,一台 Ubuntu 12.04 VPS 将被备份,另一台 Linux 机器或任何种类的可通过 SSH 访问的 VPS。
如何在 Ubuntu 上从源代码安装 Duplicity
我们在本指南中使用 Ubuntu 12.04 VPS。 默认存储库中的 duplicity 包已过时,实际上由于后端的更改而在连接到远程主机时遇到了一些问题。
我们将通过获取源文件并手动安装来避免这些问题。
以 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 密钥
我们的 duplicity 配置将使用两种不同的密钥来实现便利性和安全性之间的良好交集。
我们将使用 SSH 密钥安全地与远程系统进行身份验证,而无需提供密码。 在将数据传输到备份位置之前,我们还将使用 GPG 对数据进行加密。
创建 SSH 密钥
我们将为我们的 root 用户生成一个 RSA 加密的 SSH 密钥,以允许无密码登录到将托管备份的机器。
如果您还没有这样做,请确保您在要将数据传输到的机器上配置了 root 密码。 您可以通过以 root 身份登录机器(如果这是 VPS,则通过 SSH 或 droplets 页面上的控制台访问按钮)并发出以下命令来执行此操作:
passwd
回到具有重复性的液滴中,我们将使用以下命令生成一个密钥对:
ssh-keygen -t rsa
在提示符处按 Enter 以使用默认设置创建无密码 SSH 密钥。
使用以下命令将其传输到将托管您的备份的系统:
ssh-copy-id root@backupHost
回答yes接受未经验证的主机,然后输入远程系统的root密码来传输你的公钥。
通过发出以下命令测试您现在是否可以在没有密码的情况下从您的 duplicity droplet 登录:
ssh root@backupHost
您应该无需提供任何其他凭据即可登录。
当您通过 SSH 登录时,创建将存放我们的备份文件的目录结构:
mkdir -p /remotebackup/duplicityDroplet
您可以为目录命名任何您喜欢的名称,但请记住该值,以便您以后指定它。
完成后,退出到你的 duplicity droplet:
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
按 输入 接受默认的“RSA 和 RSA”密钥。 再次按 输入 两次以接受默认密钥大小和无到期日期。
输入 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 密钥不同,我们默认没有密码短语允许在后台操作重复,您应该为此步骤提供密码短语以允许对数据进行安全加密和解密。
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 密钥环再次获取:
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
我们现在拥有所有必要的组件,可以使用 duplicity 进行安全备份。
如何使用重复性
运行初始测试
我们将通过创建一个包含要备份的虚拟文件的文件夹来运行我们的重复系统的初始测试。 运行以下命令:
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*
退出到 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 将创建完整备份。 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 -------------------------------------------------
要强制另一个完整备份,您可以在任何选项之前将“完整”命令添加到重复调用:
PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
恢复备份
重复性使恢复变得容易。 您可以通过简单地颠倒远程和本地参数来恢复。
我们不需要 encrypt-key 选项,因为我们只是在解密数据。 我们也不需要排除参数,因为它们一开始就不包含在备份中。
例如,如果我们想完整地恢复刚刚备份的数据,我们可以使用以下命令:
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 脚本复制到文件中。 请注意,我们包含“完整”命令以强制重复运行完整备份。
#!/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
我们还将在最后添加一个额外的 duplicity 命令来清除旧的备份文件。 我们将总共保留三个完整备份及其相关的增量备份。
将此添加到文件末尾
$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet
保存并关闭文件。
使用以下命令使其可执行:
chmod 755 duplicity.full
通过调用来测试它:
./duplicity.full
它应该进行完整备份,然后删除任何必要的文件。
结论
您现在应该拥有一个完全可操作的自动化备份解决方案。 请务必定期验证您的备份,以免成为错误安全感的受害者。
还有许多其他可用的备份工具,但 duplicity 是一种灵活、简单的解决方案,可以满足许多用户的需求。