BorgBackup 拾遗:备份到 Synology DiskStation

by wzyboy on

在《BorgBackup —— 增量备份方案》一文中,我介绍了一款名为 BorgBackup(或称 Borg)的去重备份工具。本文是对其的补充,介绍将 Synology DiskStation 作为备份宿主所需注意的问题。

场景描述

BorgBackup 需要一个备份宿主。目前对于我使用的不同机器,备份宿主的选择也不同:

  • 对于日常使用的 Arch Linux 笔记本电脑和 Windows 游戏机,备份宿主是家中的 HP Gen8 服务器(相关文章:mergerfsSnapRAID);
  • 对于世界各地的野生 VPS,备份宿主是原生支持 Borg 的 rsync.net
  • 对于运行于 AWS EC2 中实例,备份宿主是一台挂载了 EFS 的 EC2。

我最满意的是第一种场景:先使用 SSH 高速内网传输至一个方便随时恢复的宿主,然后 Gen8 上的数据会被定时任务用 rclone 较慢地二次备份到 BackBlaze B2(不易恢复但廉价),完美符合 3-2-1 原则,且兼顾了经济与效率。

但工作用电脑的备份我一直没太上心:办公室里有台 Synology DiskStation,粗略地试了下 SSH 备份没成功,就挂了个 CIFS / NFS 直接把 Borg repo 直接丢在里面。就这样跑了几个月之后,由于种种原因我终于受不了网络文件系统各种乱七八糟的权限映射了,加上前段时间同事将 Synology DiskStation 接入了 Active Directory,继续拿着 root 挂 NFS 未免不太道德,而且我想把办公室里各开发用 VM 也备份到 DiskStation 上,安全性也是需要考虑的。因此我仔细思索了一下如何能公平、合理地使用一个多租户的 Synology DiskStation。

在 Synology DiskStation 上安装 BorgBackup

对于 x86_64 架构的 DiskStation 来说,可以考虑直接使用 BorgBackup 官方用 PyInstaller 制作的单文件版本。直接 wget 下来丢到 /usr/local/bin/borg 便万事大吉。

另一种选择是添加 SynoCommunity 软件仓库,使用其中社区维护的 Borg 软件包,安装它会自动带上 Python 3 依赖,并附赠 borgmatic。用这种方法的好处是可以方便地更新 BorgBackup 的版本。

配置 Synology DiskStation 的 SSH 免密码登录

Synology 明确声明,只有 administrators 本地用户组的用户可以使用 SSH 登录,然而我并不想用高权限账户去跑备份,况且办公室的多租户 DiskStation 接入了 Active Directory,而 AD 账户并不属于本地用户组,所有 AD 账户都无法使用 SSH 登录,哪怕是 Domain Admins 组的也不行。

但其实仅限 administrators 组的限制仅仅只是在 login shell 上做了文章。在 DiskStation 中创建的用户,如果不属于 administrators 组的话 login shell 会被分配为 /sbin/nologin。所以要绕过这一限制也很简单,创建一个最小权限的本地账户(比如 borg),然后把它的 login shell 改成 /bin/sh 即可。注意在 DSM 这个魔改 GNU/Linux 里并没有 chsh(1) 工具,所以你需要在 /etc/passwd 里手动修改。这样修改之后,这个新的本地账户就能用 SSH 登录 DiskStation 了,目前唯一发现的问题,如果手贱点了 Security Advisor 扫描的话,会把 login shell 改回去,把 Security Advisor 里有关用户的那项警告忽略即可。

还有一个问题:如果你试图用 ssh-copy-id 来实现免密码登录(自动化的前提),你会发现并没有效果。这是因为 DiskStation 的文件系统用了自己的 ACL(synoacl)并更改了默认的 umask,导致 ssh-copy-id 创建出来的一系列文件和目录都是可怕的 777 权限。执行如下命令可修复:

chmod 700 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

这样 synoacl 对象会丢失(ls -l 可以看到加号没有了),不过没有什么副作用。

至于多租户场景的使用,可以在每个公钥前面添加限制条件,如:

ssh-rsa AAAAB[...]+N8J alice@example.org
command="/usr/local/bin/borg serve --restrict-to-path /var/services/homes/borg/foo.example.org.borg" ssh-rsa AAAAB[...]ROjX ansible-generated on foo.example.org
command="/usr/local/bin/borg serve --restrict-to-path /var/services/homes/borg/bar.example.org.borg" ssh-rsa AAAAB[...]pNh/ ansible-generated on bar.example.org

这个示例中,Alice 可以用她的 key 获得 interactive shell,进行维护操作,而 foo.example.org 和 bar.example.org 这两台机器上的 key 只能用来执行 Borg 相关的操作,并且只能访问到和自己有关的 Borg 仓库。

Synology DiskStation 的二次备份

要符合 3-2-1 原则的话,DiskStation 里的数据应该再被二次备份到异地。这方面现成的工具就很多了,Synology 官方就有 Hyper Backup 可供使用,支持备份到各种存储服务。目前办公室那台 DiskStation 已经备份 1.3 TiB 左右的数据到 S3,每月费用约 30 USD。


欢迎留下评论。评论前,请先阅读《隐私声明》。