Oracle Solaris ZFS 管理ガイド

第 9 章 Oracle Solaris ZFS 委任管理

この章では、ZFS 委任管理を使用して、特権のないユーザーが ZFS 管理タスクを実行できるようにする方法について説明します。

この章は、次の節で構成されます。

ZFS 委任管理の概要

ZFS 委任管理を使用すると、細かく調整したアクセス権を、特定のユーザー、グループ、または全員に割り当てることができます。次の 2 種類の委任アクセス権がサポートされています。

ZFS 委任管理では、RBAC セキュリティーモデルに似た機能が提供されます。ZFS 委任を使用すると、ZFS ストレージプールおよびファイルシステムの管理に次のような利点が得られます。

委任管理を使用して ZFS タスクを分散することを検討してください。RBAC を使用して一般的な Oracle 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

所有しているアクセス権を別のユーザーに付与するアクセス権。 

許可しようとしているアクセス権自体を持っていることも必要です。 

クローン

データセットのスナップショットのいずれかを複製するアクセス権。  

元のファイルシステムで create アクセス権と mount アクセス権を持っていることも必要です。

create

子孫のデータセットを作成するアクセス権。 

mount アクセス権を持っていることも必要です。

destroy

データセットを破棄するアクセス権。 

mount アクセス権を持っていることも必要です。

mount

データセットのマウントとマウント解除、およびボリュームのデバイスリンクの作成と破棄を行うアクセス権。 

 

promote

クローンをデータセットに昇格させるアクセス権。 

元のファイルシステムで mount アクセス権と promote アクセス権を持っていることも必要です。

receive

zfs receive コマンドで子孫のファイルシステムを作成するアクセス権。

mount アクセス権と create アクセス権を持っていることも必要です。

rename

データセットの名前を変更するアクセス権。 

新しい親で create アクセス権と mount アクセス権を持っていることも必要です。

rollback

スナップショットをロールバックするアクセス権。 

 

send

スナップショットストリームを送信するアクセス権。 

 

share

データセットを共有および共有解除するアクセス権。 

 

snapshot

データセットのスナップショットを作成するアクセス権。 

 

次の一連のアクセス権を委任できますが、アクセス、読み取り、および変更のアクセス権に限定されることがあります。

また、次の ZFS プロパティーの管理をルート以外のユーザーに委任できます。

これらのプロパティーの一部は、データセットの作成時にのみ設定できます。これらのプロパティーについては、「ZFS のプロパティーの紹介」を参照してください。

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 オプションも指定されている場合を除き、このデータセットには許可されません。どちらのオプションも指定されていない場合は、ファイルシステムまたはボリュームおよびそのすべての子孫にアクセス権が許可されます。

ZFS 委任アクセス権を削除する (zfs unallow)

以前に委任したアクセス権を zfs unallow コマンドで削除できます。

たとえば、createdestroymount、および 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 アクセス権を委任する (例)


例 9–1 個別のユーザーにアクセス権を委任する

create アクセス権と mount アクセス権を個別のユーザーに委任する場合は、そのユーザーが配下のマウントポイントに対するアクセス権を持っていることを確認する必要があります。

たとえば、ユーザー markscreate アクセス権と mount アクセス権を tank ファイルシステムに関して委任するには、まず次のようにアクセス権を設定します。


# chmod A+user:marks:add_subdirectory:fd:allow /tank

その後、zfs allow コマンドを使用して createdestroy、および mount アクセス権を委任します。次に例を示します。


# zfs allow marks create,destroy,mount tank

これで、ユーザー markstank ファイルシステム内に自分のファイルシステムを作成できるようになります。次に例を示します。


# su marks
marks$ zfs create tank/marks
marks$ ^D
# su lp
$ zfs create tank/lp
cannot create 'tank/lp': permission denied


例 9–2 グループに 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–3 正しいファイルシステムレベルでアクセス権を委任する

ユーザーにアクセス権を委任する場合は、必ず正しいファイルシステムレベルで委任してください。たとえば、ユーザー marks には createdestroy、および 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

これで、ユーザー markstank ファイルシステムレベルの下のスナップショットだけを作成できるようになります。



例 9–4 複雑な委任アクセス権を定義して使用する

特定のアクセス権をユーザーやグループに委任できます。たとえば、次の 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
-------------------------------------------------------------

ユーザー marksstaff グループのメンバーなので、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
-------------------------------------------------------------

ただし、ユーザー markstank/marks でスナップショットを作成するための特定のアクセス権を持っていないため、そのようなスナップショットは作成できません。次に例を示します。


$ zfs snapshot tank/marks2@snap1
$ zfs snapshot tank/marks@snappp
cannot create snapshot 'tank/marks@snappp': permission denied

この例では、ユーザー marks は自身のホームディレクトリで 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–5 ZFS 委任アクセス権セットを定義して使用する

次の例では、アクセス権セット @myset を作成し、グループ staff にこのアクセス権セットと rename アクセス権を tank ファイルシステムに関して委任する方法を示します。ユーザー cindysstaff グループのメンバーであり、tank にファイルシステムを作成するアクセス権を持っています。ただし、ユーザー lptank にファイルシステムを作成するアクセス権を持っていません。


# 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 allow dataset

このコマンドでは、指定されたデータセットに設定または許可されているアクセス権が表示されます。出力には、次の構成要素が含まれています。


例 9–6 基本的な委任管理アクセス権を表示する

次の出力は、ユーザー cindystank/cindys ファイルシステムに対して createdestroymount、snapshot のアクセス権を持っていることを示しています。


# zfs allow tank/cindys
       -------------------------------------------------------------
       Local+Descendent permissions on (tank/cindys)
               user cindys create,destroy,mount,snapshot


例 9–7 複雑な委任管理アクセス権を表示する

次の例の出力は、pool/fred ファイルシステムと pool ファイルシステムに対する次のようなアクセス権を示しています。

pool/fred ファイルシステムに対しては次のとおりです。

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 アクセス権を削除する (例)

zfs unallow コマンドを使用して、委任したアクセス権を削除できます。たとえば、ユーザー cindystank/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 構文では、ユーザー cindyssnapshot アクセス権が 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

別の例として、ユーザー markstank/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
-------------------------------------------------------------