VPN 服务器备份:确定哪些部分必须可还原
身份、配置与状态是三个不同的备份问题。先确定重建目标,对同一时刻做一次快照,然后再测试还原。
复制配置文件不叫备份,而无人能还原的备份也不叫方案。归档必须包含服务身份、围绕它的策略,以及说明哪些设备仍然被允许的状态。归档还必须受到保护,因为在多数部署中,归档恰好授予了 VPN 所授予的权限。先决定哪些部分必须可还原,文件清单由此而来。
从重建目标出发
在列出任何一个文件之前,先写下重建后的服务器必须做到什么:终止同样的隧道、呈现同样的身份,并拒绝当前已被吊销的设备。这一句话就排除了大多数天真的拷贝,因为配置目录里很少包含吊销清单或外部身份依赖。它还会暴露主机之外的部分,例如 DNS 记录、云防火墙规则,以及网关据以认证的目录。忽略这些部分的方案,得到的是一台看似健康却谁都进不去的还原服务器。
把材料分成三类:身份、配置与状态。身份是密钥、证书以及签发它们的机构。配置是守护进程设置、地址池、路由与防火墙策略;状态则是每天都会变化的对端、账户与吊销记录的集合。
身份是无法重新生成的部分
私钥无法凭记忆重建,而依赖它们的证书会按照你继承而非自行选择的日程到期。备份服务器密钥、客户端签发材料与证书颁发机构,然后注明其中哪些应当保持离线。只存在于运行中网关上的机构密钥,距离为每个客户端做一次彻底身份重置只差一次失陷。记录哪些内容被有意存放在别处,以免有人把它复制进保护更弱的归档。
吊销值得在方案中单列一行。还原昨天的配置,可能让你今天删除的身份重新生效,这就把一次恢复变成了安全事件。把当前的吊销状态放在与你将要回滚到的快照相互独立的地方,并在任何还原之后检查它。
在同一时刻对状态做快照
在服务仍在写入时取下的副本会产生不一致的清单,而不一致的身份数据比更早的干净副本更糟。对每个存储使用受支持的导出路径,然后记录快照时间,因为此后关于还原的每个问题都取决于它。
wg showconf wg0 > /srv/backup/wg0.runtime.conf
sqlite3 /var/lib/vpn/admin.db ".backup '/srv/backup/admin.db'"
cp -a /etc/wireguard /srv/backup/etc-wireguard
sha256sum /srv/backup/*.conf > /srv/backup/MANIFEST
第一条命令把正在运行的接口反打成配置,这是手工添加而非由管理工具添加的对端最快的捕获方式;这一点由wg(8) 手册记录。sqlite 那一行是管理数据库的范式:备份命令在写入者继续运行时产出一致副本。目录拷贝会保留权限,这很重要,因为那些密钥文件只有 root 能读。清单让你能区分完整归档与被截断的归档。
让还原成为可能,然后实际测试
加密归档,并把恢复密钥存放在产生它的机器之外。口令只存在于故障服务器上的备份,是没有人能打开的备份。把取用权限限制在原本就能管理网关的人,并记录每一次取用。在隔离网络中测试还原,因为在生产环境旁边启动的克隆身份会造出两台响应同一个对端密钥的服务器。
把排除项记录得和内容一样仔细。云防火墙规则、DNS 记录和外部目录可能各自都需要自己的恢复步骤。文件拷贝成功并不能证明服务回来了;唯一算数的证据是重建的端点通过了与原环境相同的验收测试。