我想定期自动备份到我的家庭网络中的树莓派。在家时进行备份就足够了。
我读过的每本关于“如何进行自动备份”的指南都告诉我在我的 pi 上放置一个无密码的 ssh 密钥。我不想这样做,因为任何有权访问我的电脑的人都可以访问我的备份,这完全消除了备份的一个目的。
我当前的解决方案是受密码保护的 ssh-key 和 rsync 脚本。花了一些时间才使其正常工作,但现在我一登录家庭网络就会提示输入密码,然后进行备份。
现在我想使用,restic
因为我需要某种类型的版本备份。我也想备份其他设备。Restic 指南再次告诉我使用无密码 ssh 密钥。
现在,我有了相反的想法。即我的(离线)pi 可以在没有密码的情况下 ssh 进入我的笔记本电脑(但限制resric
使用)。我可以使用一个脚本运行一些 systemd.timer 来检查我的笔记本电脑是否可以访问并启动备份(如果是这种情况)。
然而,这看起来很老套,我确信这是一些常见的场景。但我找不到任何指南。
你能给我指出一个大致的方向吗?即使是一些术语也会有帮助,这样我就可以找到更多关于我想做的事情的信息!
结合
restic
使用,您可以使用提供REST APIrclone
的服务在备份服务器上设置服务,该 API可以从您要备份的计算机连接到。使用 REST API 通常比通过 SFTP使用要快得多。rclone
restic
restic
restic
对此有详细记录
rclone serve restic --help
,包括如何使用 SSL 以及如何进行htpasswd
身份验证。 您应该仔细阅读该文档。如果您的备份服务器是面向公众的(不应该如此),或者如果您这样做是为了某些非个人设置,则您将需要通过某种方式对个人用户进行身份验证来保护它。要将其设置为可从本地网络外部使用,您至少需要
localhost
在用作备份服务器的主机上进行以下设置:这里
/var/backup/restic
是您要存储存储库的路径restic
(运行上述命令的用户需要在那里具有写入权限,因此您可能需要为此创建专用服务用户)。意思--addr :8080
是“绑定到所有可用接口上的端口 8080”(默认情况下,rclone
仅绑定到localhost:8080
)。然后,您可以使用以下命令连接到此(这会初始化
restic
存储库并创建我的主目录的第一个快照):这假设您要创建并使用
restic
名为 的存储库testrepo
,并且您的备份服务器可以通过 访问backupsrv
。您应该将该主机名替换为正确的名称或 IP 号码。这将以交互方式提示您输入存储库密码,但显然您可以
RESTIC_PASSWORD
像往常一样将其传递到环境变量中(就像您可以传递restic
存储库RESTIC_REPOSITORY
而不是使用-r ...
)。在我的个人 Synology NAS 上,我运行以下 Docker 容器(这是一个
docker-compose.yml
文件):它为
restic
NAS 上的端口 18080 上的 REST API 提供服务,并允许我将备份存储在其中/volume1/Restic/backup
(通过绑定挂载到容器中)。请注意,设置中的安全性rclone
很低,因为这是隔离 LAN 中的个人 NAS(位于防火墙和运营商级 NAT 后面)。这个想法是拥有一个仅限于特定操作的无密码密钥。
例如,使用 Restic(显然通过 SFTP 存储备份)或使用普通 rsync,您可以让备份服务器维护备份磁盘的 Btrfs/ZFS 快照,并使用 SSH 密钥访问没有 root 权限的帐户(因此无法删除快照)。如果有人使用密钥远程删除 Restic 存储库,则需要几秒钟的时间才能从最后一个快照恢复它,然后您将像平常一样继续笔记本电脑恢复。
对于像 Borg Backup 这样的程序,它们有自己的“服务器”,可以通过 SSH 进行通信,您可以将密钥限制为仅特定的强制远程命令,这样它所能做的就是启动 Borg 服务器,而不是 SFTP 或 shell 。Borg 有一个“仅附加”选项,您可以在强制命令中使用该选项,使密钥只能用于上传新备份,而不能用于删除旧备份。
然而,可以说,如果有人 1) 可以访问您笔记本电脑的未加密文件并且 2) 连接到您的家庭网络,那么您很可能会遇到更大的问题......
第一个陈述是正确的,但让我尝试解释一下我对此的理解。(以及最小特权的处理原则。)
这里的解决方案是从备份服务器(您的 Pi)而不是从您的 PC 驱动备份。如果您要
rsync
与ssh
(Linux/Mac 客户端)或rsyncd
(Windows 客户端)一起使用,请设置方案以便 Pi 可以访问 PC。(PC 不需要无密码访问 Pi。)一种典型的方法可能是在 Pi 上使用来
cron
频繁(例如每四小时一次)尝试备份 PC,但一旦成功,直到第二天才重试。该脚本未经测试,但应该为您提供解决方案的基础。重要的是要注意,这timeout 4h
应该足以完成完整备份: