ZFS委托管理

ZFS委托管理概述

ZFS委托管理可以向特定用户、组或所有人分发细化的权限。支持两种类型的委托权限: ZFS委托管理提供了类似RBAC安全模型的功能。ZFS委托为管理ZFS存储池和文件系统提供了以下优势: 考虑使用委托的管理来分配ZFS任务。
默认情况下,delegation属性是启用的。
可以通过使用池的delegation属性来控制委托的管理功能,例如:
$ zpool get delegation users
NAME  PROPERTY    VALUE       SOURCE
users  delegation  on          default
$ zpool set delegation=off users
$ zpool get delegation users
NAME  PROPERTY    VALUE       SOURCE
users  delegation  off         local	
top

委托ZFS权限

通过以下方式在ZFS文件系统上使用zfs allow命令向非根用户委托权限: 下表描述了可以委派的操作以及执行委派操作所需的任何从属权限。
权限(子命令) 描述 依赖关系
allow 将您拥有的权限授予其他用户的权限 还必须具有允许的权限
clone 克隆任何数据集快照的权限 还必须在原始文件系统中具有create权限和mount权限
create 创建子数据集的权限 还必须具有mount权限
destroy 销毁数据集的权限 还必须具有mount权限
diff 在数据集中标识路径的权限 非root用户需要此权限才能使用zfs diff命令
hold 保存快照的权限
mount 挂载和卸载文件系统以及创建和销毁卷设备链接的权限
promote 将克隆升级到数据集的权限 还必须在原始文件系统中具有mount权限和promote权限
receive 使用zfs receive命令创建子体文件系统的权限 还必须具有mount权限和create权限
release 释放快照保留的权限,这可能会破坏快照
rename 重命名数据集的权限 在新父级中还必须具有create权限和mount权限
rollback 回滚快照的权限
send 发送快照流的权限
share 共享和取消共享文件系统的权限 必须同时有使用shareshare.nfs创建NFS共享的权限
snapshot 创建数据集快照的权限
可以委托以下权限集,但权限可能仅限于访问、读取或更改权限: 另外,可以将以下ZFS属性的管理权委托给非root用户: 其中一些属性只能在创建数据集时设置。

委托ZFS权限

zfs allow命令的语法如下:
zfs allow -[ldugecs] everyone|user|group[,...] perm|@setname[,...] filesystem|volume

以下zfs allow语法(粗体)标识了委托给谁:
zfs allow [-uge]|user|group|everyone [,...] filesystem | volume
可以将多个实体指定为逗号分隔的列表。
如果未指定–uge选项,则参数将优先解释为关键字everyone,然后解释为用户名,最后解释为组名。
要指定名为“everyone”的用户或组,请使用–u–g选项。
要指定与用户同名的组,请使用–g选项。
–c选项代表创建时间权限。

以下zfs allow语法(粗体)标识了权限和权限集的指定方式:
zfs allow [-s]...perm|@setname [,...] filesystem | volume
可以将多个权限指定为逗号分隔的列表。权限名称与ZFS子命令和属性相同。有关更多信息,请参见上一节。

权限可以聚合为权限集,并由–s选项标识。
对于指定的文件系统及其子系统,其他zfs allow命令可以使用权限集。
权限集是动态计算的,因此对权限集的更改会立即更新。
权限集遵循与ZFS文件系统相同的命名要求,但名称必须以at符号(@)开头,长度不能超过64个字符。

以下zfs allow语法(粗体)标识了权限的委派方式:
zfs allow [-ld]......filesystem | volume
-l选项表示允许对指定的文件系统而不是其子系统使用权限,除非还指定了-d选项。
-d选项表示允许子文件系统使用权限,而不允许此文件系统使用权限,除非还指定了-l选项。
如果未指定这两个选项,则允许文件系统或卷及其所有子体具有权限。

top

移除ZFS委托的权限

使用zfs unallow命令删除以前委托的权限。
例如,假设按照以下方式委托了createdestroymountsnapshot权限:
$ zfs allow mindy create,destroy,mount,snapshot system1/home/mindy
$ zfs allow system1/home/mindy
---- Permissions on system1/home/mindy ----------------------------------
Local+descendant permissions:
user mindy create,destroy,mount,snapshot	
可以用以下命令取消这些委托:
$ zfs unallow mindy system1/home/mindy
$ zfs allow system1/home/mindy
top

委托ZFS权限示例

例48 向单个用户委托权限

createmount权限委托给单个用户时,必须确保该用户对基础挂载点具有权限。
例如,将system1文件系统的createmount权限委托给用户mork,先要授权:
$ chmod A+user:mork:add_subdirectory:fd:allow /system1/home
然后使用zfs allow命令委托createdestorymount权限:
$ zfs allow mork create,destroy,mount system1/home
现在,用户mork可以在system1/home文件系统中创建他自己的文件系统了,如:
$ su mork
mork$ zfs create system1/home/mork
mork$ ^D
$ su lp
$ zfs create system1/home/lp
cannot create 'system1/home/lp': permission denied	

例49 向一个组委托createdestroy权限

下面例子显示如何设置文件系统,以便staff组中任何人都可以在system1/home文件系统中创建和挂载文件系统,以及销毁自己的文件系统。
但是,staff组成员不能销毁任何其他人的文件系统。
$ zfs allow staff create,mount system1/home
$ zfs allow -c create,destroy system1/home
$ zfs allow system1/home
---- Permissions on system1/home ----------------------------------------
Create time permissions:
create,destroy
Local+descendant permissions:
group staff create,mount
$ su mindy
mindy% zfs create system1/home/mindy/files
mindy% exit
$ su mork
mork% zfs create system1/home/mork/data
mork% exit
mindy% zfs destroy system1/home/mork/data
cannot destroy 'system1/home/mork/data': permission denied	

例50 在正确的文件系统级别委托权限

确保在正确的文件系统级别授予用户权限。
例如,用户mork被委托本地和子文件系统的createdestroymount权限。
用户mork被委托快照system1/home文件系统的本地权限,但不允许他快照自己的文件系统。因此,他没有被委托正确文件系统级别的snapshot权限。
$ zfs allow -l mork snapshot system1/home
$ zfs allow system1/home
---- Permissions on system1/home ----------------------------------------
Create time permissions:
create,destroy
Local permissions:
user mork snapshot
Local+descendant permissions:
group staff create,mount
$ su mork
mork$ zfs snapshot system1/home@snap1
mork$ zfs snapshot system1/home/mork@snap1
cannot create snapshot 'system1/home/mork@snap1': permission denied	
要在子系统级别委托用户mork权限,应使用zfs allow -d选项,例如:
$ zfs unallow -l mork snapshot system1/home
$ zfs allow -d mork snapshot system1/home
$ zfs allow system1/home
---- Permissions on system1/home ----------------------------------------
Create time permissions:
create,destroy
descendant permissions:
user mork snapshot
Local+descendant permissions:
group staff create,mount
$ su mork
$ zfs snapshot system1/home@snap2
cannot create snapshot 'system1/home@snap2': permission denied
$ zfs snapshot system1/home/mork@snappy	
现在,用户mork只能在system1/home文件系统级别创建快照。

例51 定义和使用复杂的委托权限

可以将特定权限委托给用户或组。例如,以下zfs allow命令将特定权限委派给staff组。
此外,在创建system1/home文件系统后,会委派destroysnapshot权限。
$ zfs allow staff create,mount system1/home
$ zfs allow -c destroy,snapshot system1/home
$ zfs allow system1/home
---- Permissions on system1/home ----------------------------------------
Create time permissions:
create,destroy,snapshot
Local+descendant permissions:
group staff create,mount	
因为用户morkstaff组的成员,他可以在system1/home中创建文件系统。
另外,用户mork可以创建system1/home的快照,因为他被指定了权限做这些。
$ su mork
$ zfs create system1/home/mark2
$ zfs allow system1/home/mark2
---- Permissions on system1/home/mark2 ----------------------------------
Local permissions:
user mork create,destroy,snapshot
---- Permissions on system1/home ----------------------------------------
Create time permissions:
create,destroy,snapshot
Local+descendant permissions:
group staff create,mount	
但是,用户mork不能创建system1/home/mork的快照,因为他没有被指定权限做这些。例如:
$ zfs snapshot system1/home/mork@snap1
cannot create snapshot 'system1/home/mork@snap1': permission denied	
本例中,用户mork在他的主目录里有create权限,意味着他可以创建快照。当文件系统是通过NFS挂载时这很有用。
$ cd /system1/home/mark2
$ ls
$ cd .zfs
$ ls
shares snapshot
$ cd snapshot
$ ls -l
total 3
drwxr-xr-x   2 mork    staff          2 Sep 27 15:55 snap1
$ pwd
/system1/home/mark2/.zfs/snapshot
$ mkdir snap2
$ zfs list
# zfs list -r system1/home
NAME                       USED  AVAIL  REFER  MOUNTPOINT
system1/home/mork           63K  62.3G    32K  /system1/home/mork
system1/home/mark2          49K  62.3G    31K  /system1/home/mark2
system1/home/mark2@snap1    18K      -    31K  -
system1/home/mark2@snap2      0      -    31K  -
$ ls
snap1  snap2
$ rmdir snap2
$ ls
snap1	

例52 定义和使用ZFS委托权限集

以下示例显示如何创建权限集@myset,并将权限集和重命名权限委托给system1文件系统的staff组。
staff中的一个成员mindy有权在system1中创建文件系统。但是用户lp无权在system1中创建文件系统。
$ zfs allow -s @myset create,destroy,mount,snapshot,promote,clone,readonly system1
$ zfs allow system1
---- Permissions on system1 ---------------------------------------------
Permission sets:
@myset clone,create,destroy,mount,promote,readonly,snapshot
$ zfs allow staff @myset,rename system1
$ zfs allow system1
---- Permissions on system1 ---------------------------------------------
Permission sets:
@myset clone,create,destroy,mount,promote,readonly,snapshot
Local+descendant permissions:
group staff @myset,rename
$ chmod A+group:staff:add_subdirectory:fd:allow system1
# su mindy
mindy% zfs create system1/data
mindy% zfs allow system1
---- Permissions on system1 ---------------------------------------------
Permission sets:
@myset clone,create,destroy,mount,promote,readonly,snapshot
Local+descendant permissions:
group staff @myset,rename
mindy% ls -l /system1
total 15
drwxr-xr-x   2 mindy   staff          2 Jun 24 10:55 data
mindy% exit
$ su lp
$ zfs create system1/lp
cannot create 'system1/lp': permission denied	
top

显示ZFS委托权限示例

使用以下命令显示权限:
$ zfs allow dataset
此命令显示在指定数据集上设置或允许的权限。输出包含以下组件:

例53 显示基本委托的管理权限

本例中的输出指示对pool/gloripool文件系统的以下权限。
对于pool/glori文件系统: 对于pool文件系统: 输出结果为:
$ zfs allow pool/glori
---- Permissions on pool/glori ----------------------------------------
Permission sets:
@eng create,destroy,snapshot,mount,clone,promote,rename
@simple create,mount
Create time permissions:
@eng,mountpoint
Local permissions:
user tomi @eng
user joe create,destroy,mount
Local+descendant permissions:
user glori @basic,share,rename
user dina @basic
group staff @basic
---- Permissions on pool ---------------------------------------------
Permission sets:
@simple create,destroy,mount
Local permissions:
group staff @simple	
top

移除ZFS委托权限示例

zfs unallow命令可以移除ZFS委托权限。
例如:用户mindy在文件系统system1/mindy上有createdestroymountsnapshot权限。
$ zfs allow mindy create,destroy,mount,snapshot system1/home/mindy
$ zfs allow system1/home/mindy
---- Permissions on system1/home/mindy ----------------------------------
Local+descendant permissions:
user mindy create,destroy,mount,snapshot	
下面zfs unallow命令移除用户mindysnapshot权限:
$ zfs unallow mindy snapshot system1/home/mindy
$ zfs allow system1/home/mindy
---- Permissions on system1/home/mindy ----------------------------------
Local+descendant permissions:
user mindy create,destroy,mount
mindy% zfs create system1/home/mindy/data
mindy% zfs snapshot system1/home/mindy@today
cannot create snapshot 'system1/home/mindy@today': permission denied	
	

另外一个例子,用户mork在文件系统system1/home/mork上有以下权限:
$ zfs allow system1/home/mork
---- Permissions on system1/home/mork ----------------------------------
Local+descendant permissions:
user mork create,destroy,mount
-------------------------------------------------------------	
以下命令移除用户mork在文件系统system1/home/mork上的所有权限:
$ zfs unallow mork system1/home/mork
以下命令移除文件系统system1上的一个权限集:
$ zfs allow system1
---- Permissions on system1 ---------------------------------------------
Permission sets:
@myset clone,create,destroy,mount,promote,readonly,snapshot
Create time permissions:
create,destroy,mount
Local+descendant permissions:
group staff create,mount
$ zfs unallow -s @myset system1
$ zfs allow system1
---- Permissions on system1 ---------------------------------------------
Create time permissions:
create,destroy,mount
Local+descendant permissions:
group staff create,mount	
top