25.6 ZFS 委托管理
用户级 zfs 管理
zfs 允许非特权用户管理,即 zfs 委托管理。
自 FreeBSD 14.1 以降(请参阅发行说明,是由 这个 变更做出的),bsdinstall(8) 使用的工具 adduser(8):当用户主目录的父目录位于 zfs 数据集上时(即若 /home 是个 zfs 数据集,/home/xxx 亦如此),会为用户的主目录创建一个 zfs 数据集。adduser 的参数 -Z 可禁用这一行为。adduser 对于 zfs 的非特权用户主目录加密功能亦已可用。
以下操作基于 FreeBSD 14.1-RELEASE。
基础的用户级 zfs 管理
先来了解一下非特权用户的 zfs 数据集。
我们首先在安装系统时,创建了两个普通用户“aria2”和“safreya”。
查看现在的挂载情况:
% zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 53.7G 396G 96K /zroot
zroot/ROOT 12.8G 396G 96K none
zroot/ROOT/14.1-RELEASE-p3_2024-09-17_194642 8K 396G 11.6G /
zroot/ROOT/default 12.8G 396G 11.9G /
zroot/aria2 187M 396G 187M /usr/local/data/aria2
zroot/home 7.74G 396G 96K /home
zroot/home/aria2 128K 396G 128K /home/aria2 # 请注意此行
zroot/home/safreya 7.74G 396G 7.70G /home/safreya # 请注意此行
zroot/jails 3.12G 396G 3.12G /usr/jails
zroot/sec 28.5G 396G 28.5G /usr/local/data/sec
zroot/tmp 102M 396G 102M /tmp
zroot/usr 1.34G 396G 96K /usr
zroot/usr/ports 1.34G 396G 1.34G /usr/ports
zroot/usr/src 96K 396G 96K /usr/src
zroot/var 1.58M 396G 96K /var
zroot/var/audit 96K 396G 96K /var/audit
zroot/var/crash 96K 396G 96K /var/crash
zroot/var/log 1.02M 396G 1.02M /var/log
zroot/var/mail 168K 396G 168K /var/mail
zroot/var/tmp 120K 396G 120K /var/tmp
safreya ~ %其中:
即,在创建用户时,已默认为用户 safreya 、aria2 分别创建了各自独立的数据集 zroot/home/aria2、zroot/home/safreya。
接下来,分别查看一下两个数据集上的用户权限。
可以看到,在创建用户集时,默认为用户创设了 create、destroy、mount 和 snapshot 四项权限。
所以,对于这两个数据集,普通用户亦可使用快照功能:
再来看 create, destroy, mount 权限:
可以看到,创建(create)权限、销毁(destroy)权限可以正常使用,但是挂载(mount)权限需要开启内核参数 vfs.usermount,以允许用户级挂载。
到这里,用户级的 zfs 管理需求已经基本满足。但是你够仔细的话会发现 rollback 权限并不可用,可以用 root 用户授权普通用户 rollback 权限。即:
用户级 zfs 加密功能
FreeBSD 14.1 中,在用户级使用 zfs 加密功能,需要为用户授予特定权限。
change-key、load-key、keyformat、keylocation 和 encryption 这五个权限属性都用于 zfs 加密功能。
现在创建一个加密数据集 zroot/home/safreya/secret:
查看加密情况:
查看 mounted 属性,加密数据集创建即挂载,现在创建一个文件,然后卸载加密数据集:
卸载加密数据集必须记得也要同时卸载密钥。挂载加密数据集亦要先加载密钥:
注意
无论数据集是否挂载,子命令
destroy都可以成功销毁数据集,因为destroy权限是默认就授予的,所以如果非用户本人操作系统的话,可能出现“我得不到的,就毁灭”的情况。切记,“授权”是授予普通用户“代理权限”,操作有授权的数据集时就相当于 root,过程中无需密码。因此在授予权限时还要综合考量,合理的限制授权范围和权限属性,如禁用
destroy权限属性等。
这里 zroot/home/safreya/secret 继承了数据集 zroot/home/safreya 的权限属性,授权/反授权都针对 zroot/home/safreya,对 zroot/home/safreya/secret 的操作不起作用(操作后属性不变,原因未知)。
adduser 与用户主目录加密
adduser 与用户主目录加密adduser 命令中可以直接使用加密的用户主目录数据集,但默认给出的权限不足,一经卸载就无法由普通用户直接挂载
查看权限:
卸载:
切换到普通用户 test 挂载尝试:
Permission denied 即权限不足,拒绝访问。
参考文献
FreeBSD 手册
OpenZFS Encryption Arrives on FreeBSD,说明了 GELI 加密和 zfs 加密的异同点
Merge OpenZFS support in to HEAD,FreeBSD 13.0 才转到了 OpenZFS
最后更新于
这有帮助吗?