13 min read

Restic 数据加密备份指南

Restic 数据加密备份指南

Restic 是采用 Go 语言开发的开源数据加密备份工具,核心特点是可以将数据加密并增量备份到对象存储,每次备份都生成一个快照记录涉及的文件变化,借此就能从某个时点的快照恢复文件。

Restic 是命令行工具,因此需要用户对终端操作有一定的了解,macOS、Linux、Windows、BSD 几乎所有操作系统都有终端工具。

基本原理

Restic 的基本使用逻辑就是以下三步:

  1. 安装客户端
  2. 创建仓库,一般是使用对象存储作为备份仓库;
  3. 日常使用,数据加密备份到仓库,从仓库恢复数据到本地等等;

安装

方式一:包管理器安装

Ubuntu、Arch Linux、AlmaLinux 等主流 Linux 发行版的软件仓库都收录了 Restic,可以使用包管理器直接安装,比如 AlmaLinux:

sudo dnf install epel-release
sudo dnf install restic

macOS 可以使用 homebrew 安装:

brew install restic

Debian 和 Ubuntu 则使用 apt 命令从软件源安装:

sudo apt install restic

方式二:预编译二进制文件

发行版软件源的版本往往比较旧,如果想体验新功能可以到 Github 仓库 下载预编译的二进制程序直接使用。因为 Restic 程序就是一个二进制文件,选择面向自己系统的版本,下载解压直接运行即可,以 x86 CPU 运行的 Linux 发行版为例:

  1. 下载软件包
curl -LO https://github.com/restic/restic/releases/download/v0.15.0/restic_0.15.0_linux_amd64.bz2

2. 解压

bunzip2 restic_0.15.0_linux_amd64.bz2

3. 安装

把解压出来的二进制程序安装到系统的 $PATH,从而实现在任意位置都能运行 restic 命令。

sudo install restic_0.15.0_linux_amd64 /usr/bin/restic

创建仓库

对 Restic 来说,仓库就是存放备份的文件夹。这个文件夹创建在哪里,哪里就是 Restic 的一个仓库。反过来说,你可以把这个文件夹创建在任意可以访问的位置,比如直接在电脑硬盘上创建本地仓库,也可以更有实际意义一些把仓库创建在像阿里云 OSS、腾讯云 COS、Amazon S3 等对象存储上面。

使用 --repo 或 -r 参数指定仓库路径

本地仓库与对象存储仓库的区别

除了临时的缓存,Restic 不会在客户端保存任何仓库相关的信息,仓库创建在哪里,所有的数据和信息就保存在哪里。

举个例子,你使用 A 电脑上的 Restic 客户端在阿里云 OSS 上创建了一个仓库,只要拥有对象存储访问密钥和仓库密码,你使用 B 电脑、C 电脑、D 电脑以及任何其他电脑都可以访问 OSS 上的这个仓库。

  • 本地仓库:由于不方便通过网络被其他电脑访问,在本地硬盘创建 Restic 仓库可能更适用作本地文件加密
  • 对象存储仓库:对象存储是基于互联网访问的云存储服务,只要有网络就能访问,所以用对象存储作为加密仓库更能凸显备份价值。

本地仓库

比如使用本地电脑的 ~/myback 目录作为 Restic 仓库,使用初始化仓库命令:

restic init --repo ~/myback

执行仓库初始化命令时,程序会交互式的要求输入仓库密码,⚠️ 特别注意 ⚠️,需要妥善保管仓库密码,没有仓库密码谁都无法解密仓库,丢失仓库密码就等于丢失了所有备份的数据。

初始化 Restic 本地仓库

对象存储仓库

Restic 原生支持 Amazon S3 以及 S3 兼容的对象存储,比如阿里云 OSS、腾讯云 COS、七牛云 Kodo、Wasabi 等等,它们采用相同的地址格式指定存储桶 Endpoint 和访问密钥。

Restic 也原生支持 Backblaze B2、Google Cloud Storage、微软 Azure Blob Storage,可以参考使用手册了解地址格式。

另外,Restic 还支持使用 rclone 作为媒介,从而实现用所有 rclone 设置的存储后端作为仓库。

创建 OSS 存储桶

提示:对象存储是按量付费的云存储服务,不同平台价格和计费方式可能略有不同,使用之前建议先了解价格相关信息。

这里以阿里云为例,在阿里云 OSS 控制台上创建一个 OSS 存储桶(Bucket):

  • Bucket 名称:建议设置一个容易识别的名称
  • 地域:与你的物理距离越近,访问速度往往越快。
  • 存储类型:选择标准存储,⚠️ 其他类型存储均有存储最低存储时长要求,不适合用作 Restic 仓库,可能会产生不必要的消费 ⚠️。
  • 读写权限:选择私有,即对文件的所有访问操作之前必须验证身份。
  • 如果没有特殊需要,通常无需启用其他带滑动开关的功能。
设置 Bucket 名称、地域和存储类型
OSS 读写权限设置为私有

创建完成,在概览页面可以看到存储桶的地址信息,一般情况下 Restic 使用的是第一行外网访问地址。

OSS Bucket 访问地址

接下来打开 RAM 访问控制,新建一个用户,用户名随意,勾选 OpenAPI 调用访问

创建新用户并赋予 OpenAPI 访问权限

用户创建完毕,就会显示用户的 AccessKey IDAccessKey Secret,这俩就是访问对象存储的密钥,可以简单地把它们当作用户名和密码,访问密钥只显示一次,所以要复制出来,妥善保管好。

保存 AccessKey ID 和 AccessKey Secret

接着回到 OSS 控制台,为新创建的用户赋予存储桶的完全访问权限。

在 Bucket 权限控制中新增授权

参照下图,将整个 Bucket 都授权给刚刚创建的 RAM 子账号,并选择完全控制

经过上面一番操作,对象存储就已经准备就绪了,信息如下(以下用随机字符代替密钥信息):

  • OSS 存储桶:myrestic
  • 外网访问地址:oss-cn-shanghai.aliyuncs.com
  • AccessKey ID:abcdefg
  • AccessKey Secret:gfedcba

设置对象存储仓库

使用上一步创建的 OSS 存储桶初始化一个 Resitc 仓库,⚠️ 注意对象存储地址的格式 ⚠️:

# 通过环境变量设置访问密钥
export AWS_ACCESS_KEY_ID=abcdefg
export AWS_SECRET_ACCESS_KEY=gfedcba
# 初始化仓库
restic -r s3:https://oss-cn-shanghai.aliyuncs.com/myrestic init

同样地,初始化仓库时需要输入仓库密码。

Restic 初始化对象存储仓库

日常使用

由于 Restic 不会在客户端保存任何仓库相关信息,因此每次访问仓库都需要明确指定仓库的地址(或路径)、访问密钥和密码,这样势必会有些繁琐和麻烦。

比较简单的办法是通过环境变量传递这些信息,每次使用前设置一遍环境变量,关闭终端(结束终端会话)以前就无需重复输入信息,客户端会直接从环境变量读取。

接下来以上面创建的 OSS 仓库为例来介绍日常的备份、恢复等使用方法。

设置环境变量

# 设置访问密钥
export AWS_ACCESS_KEY_ID=abcdefg
export AWS_SECRET_ACCESS_KEY=gfedcba
# 设置仓库地址
export RESTIC_REPOSITORY=s3:https://oss-cn-shanghai.aliyuncs.com/myrestic
# 设置仓库密码
export RESTIC_PASSWORD=12345678

备份

在设置了仓库环境变量的前提下,直接在 backup 命令后提供要备份的目录或文件就可以了,比如备份 ~/downloads 目录:

restic backup ~/downloads

备份完成后,在终端可以看到本次备份所涉及的文件、目录数量以及总容量。

restic 备份数据

在数据备份方面,Restic 有几个比较独特的方面:

  1. 客户端加密:文件先在本地加密后再上传到仓库
  2. 增量备份:仅备份发生了变化的文件
  3. 快照:每次备份生成一个快照,允许以快照为单位恢复特定时点的数据,还可以通过比对两个快照了解备份文件的变化情况。

在  ~/downloads 目录没有发生任何变化的情况下再次执行备份,可以看到备份很快就完成了,结果显示没有新增和变化的文件和文件夹,所以没有任何数据写入仓库。

restic 采用增量备份技术

管理快照

Restic 每次备份都会生成一个快照,每个快照都有唯一 ID,使用 snapshots 命令列出所有快照:

restic snapshots
显示所有 restic 快照

使用 diff 命令对比两个快照的差异,可以向 ~/downloads 目录复制一个文件,再执行备份。然后对比两个快照之间的变化:

restic diff 32030478 0ec1031e
先指定旧快照 ID,再指定新快照 ID。

快照对于仓库来说只是一个文件对象,用来标记与它相关数据,当使用 forget 命令删除快照时,Restic 只会删除这个快照对象本身,并不会删除以它做标记的数据。如果希望清理所有与这个快照关联且未被其他快照关联的文件,还需要使用 prune 命令。

# 删除一个快照
restic forget 32030478
# 清理仓库中未被快照引用的数据
restic prune

如下图,可以看到删除一个快照,实际就是删除了一个文件。

删除 restic 快照

恢复数据

Restic 基于快照恢复数据,使用 restore 命令,通过 --target 或 -t 选项执行数据恢复的目标位置。例如,将最新一个快照关联的数据恢复到 ~/mydata 这个目录:

restic restore 0ec1031e -t ~/mydata
restic 恢复数据

值得注意的是,虽然备份和恢复时使用的是相对路径,但恢复到 ~/mydata 的是包含 /home/herald/downloads 完整目录结构,这说明 Restic 的备份包含了完整路径,换言之,当需要恢复数据到源目录,恢复目标位置直接使用根目录就可以:

restic restore 0ec1031e -t /

查看仓库信息

使用 stats 命令可以统计一个仓库的基本信息,包含的快照、文件数量,以及总容量。

restic stats

Restic 仓库的注意事项

对象存储仓库的目录结构

如下图所示,在对象存储 Bucket 上创建的 Restic 仓库目录结构是这样的,可以使用对象存储提供的网页版文件管理器查看各个目录以及里面文件的情况。

⚠️ 注意 ⚠️:文件管理器列出的是一个 Restic 仓库的完整结构,请不要随意修改里面的文件和目录结构,更不要与其他应用共享用于 Restic 仓库的存储桶。

创建任意数量的仓库

本文使用一个 OSS Bucket 创建了一个 Restic 仓库,你可以在任意数量的电脑上使用这个仓库备份任何文件和目录,不过用的久了可能会发现把所有数据都备份在一个仓库是不便于管理的。这时就可以重复前文介绍的步骤,创建更多 Bucket 来创建更多仓库,把数据备份分散到不同的仓库。

⚠️ 注意 ⚠️:在管理多个仓库时,需要注意切换不同仓库的访问密钥和密码。

参考:Resitc 支持的环境变量

RESTIC_REPOSITORY                   Location of repository (replaces -r)
RESTIC_PASSWORD_FILE                Location of password file (replaces --password-file)
RESTIC_PASSWORD                     The actual password for the repository

AWS_ACCESS_KEY_ID                   Amazon S3 access key ID
AWS_SECRET_ACCESS_KEY               Amazon S3 secret access key

ST_AUTH                             Auth URL for keystone v1 authentication
ST_USER                             Username for keystone v1 authentication
ST_KEY                              Password for keystone v1 authentication

OS_AUTH_URL                         Auth URL for keystone authentication
OS_REGION_NAME                      Region name for keystone authentication
OS_USERNAME                         Username for keystone authentication
OS_PASSWORD                         Password for keystone authentication
OS_TENANT_ID                        Tenant ID for keystone v2 authentication
OS_TENANT_NAME                      Tenant name for keystone v2 authentication

OS_USER_DOMAIN_NAME                 User domain name for keystone authentication
OS_PROJECT_NAME                     Project name for keystone authentication
OS_PROJECT_DOMAIN_NAME              PRoject domain name for keystone authentication

OS_STORAGE_URL                      Storage URL for token authentication
OS_AUTH_TOKEN                       Auth token for token authentication

B2_ACCOUNT_ID                       Account ID or applicationKeyId for Backblaze B2
B2_ACCOUNT_KEY                      Account Key or applicationKey for Backblaze B2

AZURE_ACCOUNT_NAME                  Account name for Azure
AZURE_ACCOUNT_KEY                   Account key for Azure

GOOGLE_PROJECT_ID                   Project ID for Google Cloud Storage
GOOGLE_APPLICATION_CREDENTIALS      Application Credentials for Google Cloud Storage (e.g. $HOME/.config/gs-secret-restic-key.json)

RCLONE_BWLIMIT                      rclone bandwidth limit

Restic 相关网站

Restic 的更多内容