通过 ZFS 快照/克隆进行备份并调整文件系统权限

通过 ZFS 快照/克隆进行备份并调整文件系统权限

ZFS 快照非常适合滚动备份。假设我们已tank/home在 挂载/home。然后一个简单的操作zfs snapshot tank/home@TIMESTAMP将提供可在 访问的备份/home/.zfs/snapshot/TIMESTAMP。但是,如果用户对某个文件设置的权限太宽松,并且仅在创建快照后才更正此错误,则会出现问题。快照中的错误人员仍可读取该文件,而用户所能做的就是等到快照被销毁(这是通过 cron 作业作为滚动备份方案的一部分进行的)。

一个简单的方法chmod go-rwx /home/.zfs/snapshot/TIMESTAMP/*会有所帮助,但快照是只读的。我想出了以下解决方案:

chmod o-rwx /home/.zfs/snapshot
zfs snapshot tank/home@snap-TIMESTAMP
zfs clone tank/home@snap-TIMESTAMP tank/clone-TIMESTAMP
zfs set mountpoint=/root/tmp tank/clone-TIMESTAMP
chmod go-rwx /root/tmp/*
zfs set readonly=on tank/clone-TIMESTAMP
zfs set mountpoint=/backup/TIMESTAMP tank/clone-TIMESTAMP

现在, 上的用户可以以只读方式访问该备份/backup/TIMESTAMP,并且它具有修改后的权限。

至少有一个问题是,重启后权限/home/.zfs/snapshot将恢复为世界可读。可以改变这种行为吗?我们无法销毁快照,因为克隆依赖于它。

当然,一个更简单的解决方案是存储主目录的当前权限,然后运行chmod go-rwx /home/*,拍摄快照,最后恢复权限。不过,这会带来许多竞争条件。

还有其他更好的想法吗?

附录:我现在已为每个用户设置一个数据集。因此,每个用户在 中都有自己的快照~/.zfs/snapshot。这不是 100% 的解决方案。如果用户0701在其主目录中有 ,例如,为了工作~/public_html,那么攻击者仍然可以读取快照中的文件,而该文件在拍摄快照时具有错误的权限。但是,至少用户现在可以在紧急情况下通过将其主目录 设为 来“拔掉插头” 0700

更改每个文件的所有权和权限~/.zfs是一个更好的解决方案,但这种更改在重新启动后将失效。可以在启动时运行适当的 chowns 和 chmods,但这需要谨慎执行,以免在短时间内文件仍然暴露。

答案1

在 ZFS 中,快照是不可变的:拍摄快照后,您无法更改任何文件属性。

您可以尝试chmod快照目录(或 .zfs 目录)本身。或者,采用另一种方法,您可以设置snapdir=hidden

相关内容