第 9 章 ZFS 委任管理
この章では、ZFS 委任管理を使用して、特権のないユーザーが ZFS 管理タスクを実行できるようにする方法について説明します。
ZFS 委任管理の概要
この機能を使用すると、細かく調整したアクセス権を、特定のユーザー、グループ、または全員に割り当てることができます。次の 2 種類の委任アクセス権がサポートされています。
-
作成、破棄、マウント、スナップショットといった個別のアクセス権を明示的に指定できます。
-
「アクセス権セット」と呼ばれるアクセス権の集まりを定義できます。アクセス権セットはあとで更新することができ、そのセットの使用者は自動的に変更内容を取得します。アクセス権セットは @ 文字で始まり、64 文字以下の長さに制限されています。@ 文字に続くセット名の残り部分の文字には、通常の ZFS ファイルシステム名と同じ制限事項が適用されます。
ZFS 委任管理では、RBAC セキュリティーモデルに似た機能が提供されます。ZFS 委任モデルを使用すると、ZFS ストレージプールおよびファイルシステムの管理に次のような利点が得られます。
-
ZFS ストレージプールの移行時にはアクセス権も移行されます。
-
動的継承により、ファイルシステム間でアクセス権をどのように伝達するかを制御できます。
-
ファイルシステムの作成者だけがそのファイルシステムを破棄できるように設定することができます。
-
アクセス権を特定のファイルシステムに割り当てることができます。新しく作成されるファイルシステムは、アクセス権を自動的に取得できます。
-
このモデルによって単純な NFS 管理が提供されます。たとえば、明示的なアクセス権を持っているユーザーは、NFS 経由でスナップショットを作成し、適切な .zfs/snapshot ディレクトリに保存できます。
委任管理を使用して ZFS タスクを分散することを検討してください。RBAC を使用して一般的な Solaris 管理タスクを管理する方法については、『Solaris のシステム管理 (セキュリティサービス)』のパート III「役割、権利プロファイル、特権」を参照してください。
ZFS 委任アクセス権を無効にする
プールの 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
|
デフォルトでは、delegation プロパティーは有効になっています。
ZFS アクセス権の委任
zfs allow コマンドを使用して、ZFS データセットに対するアクセス権を root 以外のユーザーに次の方法で付与できます。
-
個別のアクセス権をユーザー、グループ、または全員に付与することができます。
-
個別のアクセス権の集まりを「アクセス権セット」としてユーザー、グループ、または全員に付与することができます。
-
アクセス権は、現在のデータセットだけにローカルで付与するか、現在のデータセットのすべての子孫に付与することができます。
次の表では、委任できる操作と、委任された操作の実行に必要な依存するアクセス権について説明します。
|
アクセス権 (サブコマンド)
|
説明
|
依存関係
|
|
allow
|
所有しているアクセス権を別のユーザーに付与する機能。
|
許可しようとしているアクセス権自体を持っていることも必要です。
|
|
clone
|
データセットのスナップショットのいずれかを複製する機能。
|
元のファイルシステムで create 機能と mount 機能を持っていることも必要です。
|
|
create
|
子孫のデータセットを作成する機能。
|
mount 機能を持っていることも必要です。
|
|
destroy
|
データセットを破棄する機能。
|
mount 機能を持っていることも必要です。
|
|
mount
|
データセットのマウントとマウント解除、およびボリュームのデバイスリンクの作成と破棄を行う機能。
|
|
|
promote
|
クローンをデータセットに昇格させる機能。
|
元のファイルシステムで mount 機能と promote 機能を持っていることも必要です。
|
|
receive
|
zfs receive コマンドで子孫のファイルシステムを作成する機能。
|
mount 機能と create 機能を持っていることも必要です。
|
|
rename
|
データセットの名前を変更する機能。
|
新しい親で create 機能と mount 機能を持っていることも必要です。
|
|
rollback
|
スナップショットをロールバックする機能。
|
mount 機能を持っていることも必要です。
|
|
send
|
スナップショットストリームを送信する機能。
|
|
|
share
|
データセットを共有および共有解除する機能。
|
|
|
snapshot
|
データセットのスナップショットを作成する機能。
|
|
次の一連のアクセス権を委任できますが、アクセス、読み取り、および変更のアクセス権に限定されることがあります。
-
groupquota
-
groupused
-
userprop
-
userquota
-
userused
また、次の ZFS プロパティーをルート以外のユーザーに委任できます。
-
aclinherit
-
aclmode
-
atime
-
canmount
-
casesensitivity
-
チェックサム
-
compression
-
copies
-
devices
-
exec
-
mountpoint
-
nbmand
-
normalization
-
primarycache
-
quota
-
readonly
-
recordsize
-
refreservation
-
reservation
-
secondarycache
-
setuid
-
shareiscsi
-
sharenfs
-
sharesmb
-
snapdir
-
utf8only
-
version
-
volblocksize
-
volsize
-
vscan
-
xattr
-
zoned
これらのプロパティーの一部は、データセットの作成時にのみ設定できます。これらのプロパティーについては、「ZFS のプロパティーの紹介」を参照してください。
アクセス権の委任構文 (zfs allow) の説明
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 ファイルシステムと同じ命名規則に従いますが、名前はアットマーク記号 (@) で始まり、64 文字以下の長さでなければなりません。
次の zfs allow 構文 (太字) は、アクセス権の委任方法を示しています。
zfs allow [-ld] ... ... filesystem | volume
|
-l オプションは、アクセス権が指定のデータセットだけに許可されることを示します。-d オプションも指定されている場合を除き、子孫には許可されません。-d オプションは、アクセス権が子孫のデータセットだけに許可されることを示します。-l オプションも指定されている場合を除き、このデータセットには許可されません。-ld オプションのどちらも指定されていない場合は、ファイルシステムまたはボリュームおよびそのすべての子孫にアクセス権が許可されます。
ZFS 委任アクセス権を削除する (zfs unallow)
以前に付与したアクセス権を zfs unallow コマンドで削除することができます。
たとえば、create、destroy、mount、および snapshot アクセス権を次のように委任したとします。
# zfs allow cindys create,destroy,mount,snapshot tank/cindys
# zfs allow tank/cindys
-------------------------------------------------------------
Local+Descendent permissions on (tank/cindys)
user cindys create,destroy,mount,snapshot
-------------------------------------------------------------
|
これらのアクセス権を削除するには、次のような構文を使用する必要があります。
# zfs unallow cindys tank/cindys
# zfs allow tank/cindys
|
ZFS 委任管理の使用
この節では、ZFS 委任アクセス権を表示および委任する例を紹介します。
ZFS 委任アクセス権を表示する (例)
次のコマンドを使用して、アクセス権を表示できます。
このコマンドでは、このデータセットに設定または許可されているアクセス権が表示されます。出力には、次の構成要素が含まれています。
-
アクセス権セット
-
特定のアクセス権または作成時のアクセス権
-
ローカルのデータセット
-
ローカルおよび子孫のデータセット
-
子孫のデータセットのみ
例 9–1 基本的な委任管理アクセス権を表示する
次の例の出力は、ユーザー cindys が tank/cindys ファイルシステムで作成、破棄、マウント、スナップショット作成を行うアクセス権を持っていることを示しています。
# zfs allow tank/cindys
-------------------------------------------------------------
Local+Descendent permissions on (tank/cindys)
user cindys create,destroy,mount,snapshot
|
例 9–2 複雑な委任管理アクセス権を表示する
次の例の出力は、pool/fred ファイルシステムと pool ファイルシステムに対する次のようなアクセス権を示しています。
pool/fred ファイルシステムに対しては次のとおりです。
-
次の 2 つのアクセス権セットが定義されています。
-
作成時のアクセス権が @eng アクセス権セットと mountpoint プロパティーに対して設定されています。この作成時のアクセス権により、データセットが作成されたあとで @eng アクセス権セットと mountpoint プロパティーが付与されます。
-
ユーザー tom には @eng アクセス権セット、ユーザー joe には create、destroy、および mount アクセス権が、ローカルファイルシステムに関して付与されています。
-
ユーザー fred には @basic アクセス権セットと share および rename アクセス権が、ローカルおよび子孫のファイルシステムに関して付与されています。
-
ユーザーbarney と staff グループには @basic アクセス権セットが、子孫のファイルシステムに関してのみ付与されています。
pool ファイルシステムに対しては次のとおりです。
この例の出力を次に示します。
$ zfs allow pool/fred
------------------------------------------------------------------------------
Permission sets on (pool/fred)
@eng create,destroy,snapshot,mount,clone,promote,rename
@simple create,mount
Create time permissions on (pool/fred)
@eng,mountpoint
Local permissions on (pool/fred)
user tom @eng
user joe create,destroy,mount
Local+Descendent permissions on (pool/fred)
user fred @basic,share,rename
Descendent permissions on (pool/fred)
user barney @basic
group staff @basic
------------------------------------------------------------------------------
Permission sets on (pool)
@simple create,destroy,mount
Local permissions on (pool)
group staff @simple
------------------------------------------------------------------------------
|
ZFS アクセス権を委任する (例)
例 9–3 個別のユーザーにアクセス権を委任する
create アクセス権と mount アクセス権を個別のユーザーに付与する場合は、そのユーザーが配下のマウントポイントに対するアクセス権を持っていることを確認する必要があります。
たとえば、ユーザー marks に create アクセス権と mount アクセス権を tank に関して付与するには、まず次のようにアクセス権を設定します。
# chmod A+user:marks:add_subdirectory:fd:allow /tank
|
その後、zfs allow コマンドを使用して create、destroy、および mount アクセス権を付与します。次に例を示します。
# zfs allow marks create,destroy,mount tank
|
これで、ユーザー marks は tank ファイルシステム内に自分のファイルシステムを作成できるようになります。次に例を示します。
# su marks
marks$ zfs create tank/marks
marks$ ^D
# su lp
$ zfs create tank/lp
cannot create 'tank/lp': permission denied
|
例 9–4 グループに create および destroy アクセス権を委任する
次の例では、ファイルシステムを設定して、staff グループの任意のメンバーが tank ファイルシステムでファイルシステムの作成とマウント、および各自のファイルシステムの破棄を実行できるようにする方法を示します。ただし、staff グループのメンバーであっても、ほかのメンバーのファイルシステムを破棄することはできません。
# zfs allow staff create,mount tank
# zfs allow -c create,destroy tank
# zfs allow tank
-------------------------------------------------------------
Create time permissions on (tank)
create,destroy
Local+Descendent permissions on (tank)
group staff create,mount
-------------------------------------------------------------
# su cindys
cindys% zfs create tank/cindys
cindys% exit
# su marks
marks% zfs create tank/marks/data
marks% exit
cindys% zfs destroy tank/marks/data
cannot destroy 'tank/mark': permission denied
|
例 9–5 正しいファイルシステムレベルでアクセス権を委任する
ユーザーにアクセス権を付与する場合は、必ず正しいファイルシステムレベルで付与してください。たとえば、ユーザー marks には create、destroy、および mount アクセス権が、ローカルおよび子孫のファイルシステムに関して付与されています。ユーザー marks には tank ファイルシステムのスナップショットを作成するローカルアクセス権が付与されていますが、自分のファイルシステムのスナップショットを作成することは許可されていません。したがって、このユーザーには snapshot アクセス権が正しいファイルシステムレベルで付与されていません。
# zfs allow -l marks snapshot tank
# zfs allow tank
-------------------------------------------------------------
Local permissions on (tank)
user marks snapshot
Local+Descendent permissions on (tank)
user marks create,destroy,mount
-------------------------------------------------------------
# su marks
marks$ zfs snapshot tank/@snap1
marks$ zfs snapshot tank/marks@snap1
cannot create snapshot 'mark/marks@snap1': permission denied
|
ユーザー marks に子孫レベルのアクセス権を付与するには、zfs allow -d オプションを使用します。次に例を示します。
# zfs unallow -l marks snapshot tank
# zfs allow -d marks snapshot tank
# zfs allow tank
-------------------------------------------------------------
Descendent permissions on (tank)
user marks snapshot
Local+Descendent permissions on (tank)
user marks create,destroy,mount
-------------------------------------------------------------
# su marks
$ zfs snapshot tank@snap2
cannot create snapshot 'tank@snap2': permission denied
$ zfs snapshot tank/marks@snappy
|
これで、ユーザー marks は tank レベルの下のスナップショットだけを作成できるようになります。
例 9–6 複雑な委任アクセス権を定義して使用する
特定のアクセス権をユーザーやグループに付与することができます。たとえば、次の zfs allow コマンドでは、特定のアクセス権が staff グループに付与されます。また、destroy アクセス権と snapshot アクセス権が tank ファイルシステムの作成後に付与されます。
# zfs allow staff create,mount tank
# zfs allow -c destroy,snapshot tank
# zfs allow tank
-------------------------------------------------------------
Create time permissions on (tank)
destroy,snapshot
Local+Descendent permissions on (tank)
group staff create,mount
-------------------------------------------------------------
|
ユーザー marks は staff グループのメンバーなので、tank 内にファイルシステムを作成できます。また、ユーザー marks は、tank/marks2 のスナップショットを作成するための特定のアクセス権を持っているため、そのようなスナップショットを作成できます。次に例を示します。
# su marks
$ zfs create tank/marks2
$ zfs allow tank/marks2
-------------------------------------------------------------
Local permissions on (tank/marks2)
user marks destroy,snapshot
-------------------------------------------------------------
Create time permissions on (tank)
destroy,snapshot
Local+Descendent permissions on (tank)
group staff create
everyone mount
-------------------------------------------------------------
|
ただし、このユーザーは tank/marks でスナップショットを作成するための特定のアクセス権を持っていないため、そのようなスナップショットは作成できません。次に例を示します。
$ zfs snapshot tank/marks2@snap1
$ zfs snapshot tank/marks@snappp
cannot create snapshot 'tank/marks@snappp': permission denied
|
ホームディレクトリで create アクセス権を持っている場合は、独自のスナップショットディレクトリを作成できます。このシナリオは、ファイルシステムを NFS マウントする場合に役立ちます。次に例を示します。
$ cd /tank/marks2
$ ls
$ cd .zfs
$ ls
snapshot
$ cd snapshot
$ ls -l
total 3
drwxr-xr-x 2 marks staff 2 Dec 15 13:53 snap1
$ pwd
/tank/marks2/.zfs/snapshot
$ mkdir snap2
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 264K 33.2G 33.5K /tank
tank/marks 24.5K 33.2G 24.5K /tank/marks
tank/marks2 46K 33.2G 24.5K /tank/marks2
tank/marks2@snap1 21.5K - 24.5K -
tank/marks2@snap2 0 - 24.5K -
$ ls
snap1 snap2
$ rmdir snap2
$ ls
snap1
|
例 9–7 ZFS 委任アクセス権セットを定義して使用する
次の例では、アクセス権セット @myset を作成し、グループ staff にこのアクセス権セットと rename アクセス権を tank ファイルシステムに関して付与する方法を示します。ユーザー cindys は staff グループのメンバーであり、tank にファイルシステムを作成するアクセス権を持っています。ただし、ユーザー lp は tank にファイルシステムを作成するアクセス権を持っていません。
# zfs allow -s @myset create,destroy,mount,snapshot,promote,clone,readonly tank
# zfs allow tank
-------------------------------------------------------------
Permission sets on (tank)
@myset clone,create,destroy,mount,promote,readonly,snapshot
-------------------------------------------------------------
# zfs allow staff @myset,rename tank
# zfs allow tank
-------------------------------------------------------------
Permission sets on (tank)
@myset clone,create,destroy,mount,promote,readonly,snapshot
Local+Descendent permissions on (tank)
group staff @myset,rename
# chmod A+group:staff:add_subdirectory:fd:allow tank
# su cindys
cindys% zfs create tank/data
Cindys% zfs allow tank
-------------------------------------------------------------
Permission sets on (tank)
@myset clone,create,destroy,mount,promote,readonly,snapshot
Local+Descendent permissions on (tank)
group staff @myset,rename
-------------------------------------------------------------
cindys% ls -l /tank
total 15
drwxr-xr-x 2 cindys staff 2 Aug 8 14:10 data
cindys% exit
# su lp
$ zfs create tank/lp
cannot create 'tank/lp': permission denied
|
ZFS アクセス権を削除する (例)
zfs unallow コマンドを使用して、付与したアクセス権を削除できます。たとえば、ユーザー cindys は tank/cindys ファイルシステムで作成、破棄、マウント、およびスナップショット作成を行うアクセス権を持っています。
# zfs allow cindys create,destroy,mount,snapshot tank/cindys
# zfs allow tank/cindys
-------------------------------------------------------------
Local+Descendent permissions on (tank/cindys)
user cindys create,destroy,mount,snapshot
-------------------------------------------------------------
|
次の zfs unallow 構文では、ユーザー cindys の snapshot アクセス権が tank/cindys ファイルシステムから削除されます。
# zfs unallow cindys snapshot tank/cindys
# zfs allow tank/cindys
-------------------------------------------------------------
Local+Descendent permissions on (tank/cindys)
user cindys create,destroy,mount
-------------------------------------------------------------
cindys% zfs create tank/cindys/data
cindys% zfs snapshot tank/cindys@today
cannot create snapshot 'tank/cindys@today': permission denied
|
別の例として、ユーザー marks は tank/marks で次のアクセス権を持っています。
# zfs allow tank/marks
-------------------------------------------------------------
Local+Descendent permissions on (tank/marks)
user marks create,destroy,mount
-------------------------------------------------------------
|
この例では、次の zfs unallow 構文により、ユーザー marks のすべてのアクセス権が tank/marks から削除されます。
# zfs unallow marks tank/marks
|
次の zfs unallow 構文では、tank ファイルシステムのアクセス権セットが削除されます。
# zfs allow tank
-------------------------------------------------------------
Permission sets on (tank)
@myset clone,create,destroy,mount,promote,readonly,snapshot
Create time permissions on (tank)
create,destroy,mount
Local+Descendent permissions on (tank)
group staff create,mount
-------------------------------------------------------------
# zfs unallow -s @myset tank
$ zfs allow tank
-------------------------------------------------------------
Create time permissions on (tank)
create,destroy,mount
Local+Descendent permissions on (tank)
group staff create,mount
-------------------------------------------------------------
|