![安全的数据备份到远程服务器:客户端被入侵的场景](https://linux22.com/image/1634301/%E5%AE%89%E5%85%A8%E7%9A%84%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9A%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%A2%AB%E5%85%A5%E4%BE%B5%E7%9A%84%E5%9C%BA%E6%99%AF.png)
我想将客户端的一些文件系统文件夹备份到外部服务器。我的目标是即使客户端以任何方式受到攻击/黑客攻击,也能在外部服务器上进行安全备份。
我正在考虑以下技术(按优先顺序):
- 同步
- AWS S3
- FTP服务
- HTTPS
据我所知,rsync 和 sFTP 通过 SSH 传输,因此我需要在客户端上放置某种 SSH 密钥。如果攻击者可以访问客户端,他也可以读取 SSH 密钥并连接到外部备份服务器。这就是我想要阻止的。
AWS s3 权限模型(https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html) 具有 WRITE 权限,即“允许被授权者创建、覆盖和删除存储桶中的任何对象”。因此,受感染的客户端可以删除我的所有备份。在这种情况下,情况并不乐观。
使用 HTTPs 当然也会在客户端上存储凭证,但我会在外部系统上创建某种 API,只允许 POST/上传数据。这样攻击者就“只能”将“批量”数据上传到外部服务器,而不会通过 SSH 删除我存储的备份。但通过 HTTPs 执行备份听起来不适合这项工作。
我是否遗漏了一些显而易见的东西?
非常感谢您的任何建议。
答案1
我处理这个问题的方法是将数据的控制权移交给备份目的地。为了便于描述,生产您的生产(主要)机器是备份是备份服务器。这确实要求您拥有备份服务器而不仅仅是数据存储库。
- 删除 ssh 等效性生产和备份除非你用密码保护密钥。(这消除了任何人或事物从一个系统获取另一个系统的机会。)不要在两个系统上使用相同的密码!
- 设置
rsyncd
于生产使用受用户名/密码保护的可读但只读配置。考虑拒绝任何目录访问~/.ssh
- 尤其是 root 的 - 创建常规
rsync
工作备份从中提取数据生产服务器。我将其与 结合起来rsnapshot
,实际上为了节省空间,我在 上运行整个备份集3QL语言(挂在本地磁盘而不是 S3 存储上)。
这将阻止入侵生产到达你的备份数据。它还将阻止入侵备份覆盖你的生产系统。
如上所述,这种方法的缺点是rsyncd
只能以明文形式传输数据。有两种方法可以解决这个问题,因为我不建议使用明文数据传输进行任何跨互联网通信
stunnel
,可以配置为代表rsyncd
- 使用 Wireguard、OpenVPN 或 IPsec 之类的点对点 VPN 隧道。
我应该指出,虽然这个解决方案是以 Linux 为中心的,但我也曾rsyncd
在 Windows 系统上运行过,并成功备份了用户数据。但需要注意的是,如果不使用 VSS 影子快照,很难从打开的文件中备份数据,也不rsyncd
知道如何创建这些快照。
答案2
这涉及使用基于密钥的身份验证通过 SSH 将客户端备份到服务器。客户端和服务器都需要安装 BorgBackup。备份客户端将通过 ssh 进入备份服务器并运行命令来处理将备份数据写入服务器计算机。(这与 ssh 目标的工作borg serve
方式非常相似。)rsync
您还需要设置客户端将用于连接服务器的 SSH 密钥,并authorized_keys
在备份服务器上进行配置,以便密钥具有强制命令并且只能运行borg serve --append-only
。此模式将拒绝从备份存储库中删除或修剪任何数据。为了修剪旧备份,您需要在备份服务器上运行 cron 作业,或者使用配置为无需borg serve
运行的第二个更受信任的 SSH 密钥来修剪备份。borg serve
--append-only