ZFS委托管理
ZFS委托管理概述
ZFS委托管理可以向特定用户、组或所有人分发细化的权限。支持两种类型的委托权限:
- 可以显式委托各个权限,例如create|destroy|mount|snapshot等等
- 可以定义称为permission sets(权限集)的权限组。以后可以更新权限集,该权限集的所有使用者都会自动获得更改。
权限集以@符号开头,长度限制为64个字符。在@符号之后,集合名称中的其余字符具有于普通ZFS文件系统名称相同的限制。
ZFS委托管理提供了类似RBAC安全模型的功能。ZFS委托为管理ZFS存储池和文件系统提供了以下优势:
- 每当迁移池时,ZFS存储池都会具有相应的权限
- 提供动态继承,可以在其中控制权限如何通过文件系统传播
- 可以配置为只有文件系统的创建者才能销毁文件系统
- 可以将权限委托给特定的文件系统,新创建的文件系统可以自动获取权限
- 提供简单的NFS管理。例如,具有显式权限的用户可以在相应的.zfs/snapshot目录中通过NFS创建快照
考虑使用委托的管理来分配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命令向非根用户委托权限:
- 可以将个人权限委派给用户、组或所有人。
- 可以将单个权限组作为权限集(permission set)委派给用户、组或所有人
- 权限可以仅在本地委派给当前文件系统,也可以委派给当前文件系统的所有子系统。
下表描述了可以委派的操作以及执行委派操作所需的任何从属权限。
权限(子命令) |
描述 |
依赖关系 |
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 |
共享和取消共享文件系统的权限 |
必须同时有使用share和share.nfs创建NFS共享的权限 |
snapshot |
创建数据集快照的权限 |
|
可以委托以下权限集,但权限可能仅限于访问、读取或更改权限:
- groupquota
- groupused
- key
- keychange
- userprop
- userquota
- userused
另外,可以将以下ZFS属性的管理权委托给非root用户:
aclinherit
aclmode
atime
canmount
casesensitivity
checksum
compression
copies
dedup
defaultgroupquota
defaultuserquota
devices
encryption
exec
keysource
logbias
mountpoint
nbmand
normalization
primarycache
quota
readonly
recordsize
refquota
refreservation
reservation
rstchown
secondarycache
setuid
shadow
share.nfs
share.smb
snapdir
sync
utf8only
version
volblocksize
volsize
vscan
xattr
zoned
其中一些属性只能在创建数据集时设置。
委托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命令删除以前委托的权限。
例如,假设按照以下方式委托了create、destroy、mount、snapshot权限:
$ 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 向单个用户委托权限
将create和mount权限委托给单个用户时,必须确保该用户对基础挂载点具有权限。
例如,将system1文件系统的create和mount权限委托给用户mork,先要授权:
$ chmod A+user:mork:add_subdirectory:fd:allow /system1/home
然后使用zfs allow命令委托create、destory和mount权限:
$ 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 向一个组委托create和destroy权限
下面例子显示如何设置文件系统,以便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被委托本地和子文件系统的create、destroy和mount权限。
用户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文件系统后,会委派destroy和snapshot权限。
$ 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
因为用户mork是staff组的成员,他可以在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/glori和pool文件系统的以下权限。
对于pool/glori文件系统:
- 定义了两个权限集:
- @eng(create,destroy,snapshot,mount,clone,promote,rename)
- @simple(create,mount)
- 为@eng权限集和mountpoint属性设置创建时间权限。创建时间意味着创建文件系统集后,@eng权限集和设置mountpoint属性的权限将被委托。
- 用户tomi被委托了@eng权限集,用户joe被授予了本地文件系统的create和mount权限。
- 用户glori被委托了@basic权限集和对本地及后代文件系统的share和rename权限。
- 用户dina和组staff被委托了仅针对子文件系统的@basic权限集。
对于pool文件系统:
- 定义了@simple(create、destroy、mount)的权限集。
- staff组被授予本地文件系统的@simple权限集
输出结果为:
$ 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上有create、destroy、mount、snapshot权限。
$ 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的snapshot权限:
$ 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