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