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