この章では、ZFS 委任管理を使用して、特権のないユーザーが ZFS 管理タスクを実行できるようにする方法について説明します。
この章は、次の節で構成されます。
ZFS 委任管理を使用すると、細かく調整したアクセス権を、特定のユーザー、グループ、または全員に割り当てることができます。次の 2 種類の委任アクセス権がサポートされています。
作成、破棄、マウント、スナップショットといった個別のアクセス権を明示的に委任できます。
「アクセス権セット」と呼ばれるアクセス権の集まりを定義できます。アクセス権セットはあとで更新することができ、そのセットの使用者は自動的に変更内容を取得します。アクセス権セットは @ 記号で始まり、64 文字以下の長さに制限されています。@ 記号に続くセット名の残り部分の文字には、通常の ZFS ファイルシステム名と同じ制限事項が適用されます。
ZFS 委任管理では、RBAC セキュリティーモデルに似た機能が提供されます。ZFS 委任を使用すると、ZFS ストレージプールおよびファイルシステムの管理に次のような利点が得られます。
ZFS ストレージプールの移行時には常にアクセス権も移行されます。
動的継承により、ファイルシステム間でアクセス権をどのように伝達するかを制御できます。
ファイルシステムの作成者だけがそのファイルシステムを破棄できるように設定することができます。
アクセス権を特定のファイルシステムに委任できます。新しく作成されるファイルシステムは、アクセス権を自動的に取得できます。
NFS の管理が容易になります。たとえば、明示的なアクセス権を持っているユーザーは、NFS 経由でスナップショットを作成し、適切な .zfs/snapshot ディレクトリに保存できます。
委任管理を使用して ZFS タスクを分散することを検討してください。RBAC を使用して一般的な Oracle Solaris 管理タスクを管理する方法については、『Solaris のシステム管理 (セキュリティサービス)』のパート III「役割、権利プロファイル、特権」を参照してください。
委任管理機能を制御するには、プールの 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 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 |
データセットのスナップショットを作成するアクセス権。 |
次の一連のアクセス権を委任できますが、アクセス、読み取り、および変更のアクセス権に限定されることがあります。
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 -[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 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 |
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 |
次の例では、ファイルシステムを設定して、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 |
ユーザーにアクセス権を委任する場合は、必ず正しいファイルシステムレベルで委任してください。たとえば、ユーザー 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 ファイルシステムレベルの下のスナップショットだけを作成できるようになります。
特定のアクセス権をユーザーやグループに委任できます。たとえば、次の 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 ------------------------------------------------------------- |
ただし、ユーザー marks は tank/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 |
次の例では、アクセス権セット @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 allow dataset |
このコマンドでは、指定されたデータセットに設定または許可されているアクセス権が表示されます。出力には、次の構成要素が含まれています。
アクセス権セット
個々のアクセス権または作成時のアクセス権
ローカルのデータセット
ローカルおよび子孫のデータセット
子孫のデータセットのみ
次の出力は、ユーザー cindys が tank/cindys ファイルシステムに対して create、destroy、mount、snapshot のアクセス権を持っていることを示しています。
# zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot |
次の例の出力は、pool/fred ファイルシステムと pool ファイルシステムに対する次のようなアクセス権を示しています。
pool/fred ファイルシステムに対しては次のとおりです。
次の 2 つのアクセス権セットが定義されています。
@eng (create, destroy , snapshot, mount, clone , promote, rename)
@simple (create, mount )
作成時のアクセス権が @eng アクセス権セットと mountpoint プロパティーに対して設定されています。この作成時のアクセス権により、データセットが作成されたあとで @eng アクセス権セットと mountpoint プロパティーを設定するアクセス権が委任されます。
ユーザー tom には @eng アクセス権セット、ユーザー joe には create、destroy、および mount アクセス権が、ローカルファイルシステムに関して委任されています。
ユーザー fred には @basic アクセス権セットと share および rename アクセス権が、ローカルおよび子孫のファイルシステムに関して委任されています。
ユーザー barney と staff グループには @basic アクセス権セットが、子孫のファイルシステムに関してのみ委任されています。
pool ファイルシステムに対しては次のとおりです。
アクセス権セット @simple (create、destroy、mount) が定義されています。
グループ staff には @simple アクセス権セットが、ローカルファイルシステムに関して付与されています。
この例の出力を次に示します。
$ 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 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 ------------------------------------------------------------- |