Solaris ZFS 管理ガイド
只搜尋這本書
以 PDF 格式下載這本書 (2012 KB)

第 8 章 ACL による ZFS ファイルの保護

この章では、アクセス制御リスト (ACL) を使用して UNIX 標準のアクセス権より詳細にアクセス権を制御する方法で、ZFS ファイルを保護する方法について説明します。

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

新しい Solaris ACL モデル

最近のバージョンの Solaris では、主に POSIX ドラフト ACL 仕様に基づく ACL 実装がサポートされていました。POSIX ドラフトに基づく ACL は、UFS ファイルを保護するために使用され、NFSv4 より前のバージョンの NFS によって変換されます。

NFSv4 を導入したことにより、NFSv4 が提供する UNIX クライアントとUNIX 以外のクライアントとの間の相互運用性を、新しい ACL モデルを使って完全にサポートできるようになりました。NFSv4 仕様で定義されている新しい ACL 実装は、NT 方式の ACL を使用して、より豊かなセマンティクスを実現します。

新しい ACL モデルは、主に次の点が異なっています。

  • NFSv4 仕様に基づいており、NT 方式の ACL に似ています。

  • アクセス特権をより詳細に設定できます。詳細は、表 8–2 を参照してください。

  • setfaclgetfacl コマンドではなく、chmod および ls コマンドを使用して設定および表示します。

  • ディレクトリのアクセス特権をどのようにサブディレクトリに適用するかを指定するために、より多くの継承セマンティクスを利用できます。詳細については、「ACL 継承」を参照してください。

どちらの ACL モデルを使った場合でも、標準のファイルアクセス権の場合より詳細にアクセス権を制御できます。新しい ACL は、POSIX ドラフト ACL と同様に、複数のアクセス制御エントリ (ACE) で構成されています。

POSIX ドラフト方式の ACL では、1 つのエントリを使用して、許可するアクセス権と拒否するアクセス権を定義します。新しい ACL モデルでは、アクセス権を検査するために、2 種類の ACE が利用されます。 ALLOWDENY です。つまり、どちらの ACE にもアクセス権が定義されていますが、その ACE に定義されていないアクセス権については、その ACE だけを使ってアクセス権を許可または拒否するかを推論することはできません。.

NFSv4 方式の ACL と POSIX ドラフト ACLとの 間の変換は、次のように行われます。

  • ACL に対応するユーティリティー (cpmvtarcpiorcp コマンドなど) のいずれかを使用している場合は、ACL が含まれる UFS ファイルを ZFS ファイルシステムに転送するときに、POSIX ドラフト ACL が同等の NFSv4 方式の ACL に変換されます。

  • 一部の NFSv4 方式の ACL は、POSIX ドラフト ACL に変換されます。NFSv4 方式の ACL が POSIX ドラフト ACL に変換されない場合は、次のようなメッセージが表示されます。


    # cp -p filea /var/tmp
    cp: failed to set acl entries on /var/tmp/filea
  • 最新の Solaris リリースを実行するシステム上で ACL の保持オプション (tar -p または cpio -P) を使って UFS tar または cpio アーカイブを作成した場合でも、以前の Solaris リリースを実行するシステム上でそのアーカイブを展開したときは、ACL が失われます。

    すべてのファイルが正しいファイルモードで展開されますが、ACL エントリは無視されます。

  • ufsrestore コマンドを使って ZFS ファイルシステムにデータを復元することができます。元のデータに POSIX 方式の ACL が含まれている場合、それらは NFSv4 方式の ACL に変換されます。

  • UFS ファイルに NFSv4 方式の ACL を設定しようとすると、次のようなメッセージが表示されます。


    chmod: ERROR: ACL type's are different
  • ZFS ファイルに POSIX 方式の ACL を設定しようとすると、次のようなメッセージが表示されます。


    # getfacl filea
    File system doesn't support aclent_t style ACL's.
    See acl(5) for more information on Solaris ACL support.

ACL およびバックアップ製品に関するその他の制限については、「ほかのバックアップ製品を使用して ZFS データを保存する」を参照してください。

ACL を設定する構文の説明

基本的な ACL の形式として、次の 2 つの形式が用意されています。

簡易 ACL を設定する構文

chmod [options] A[index]{+|=}owner@ |group@ |everyone@: access-permissions/...[:inheritance-flags]: deny | allow file

chmod [options] A-owner@, group@, everyone@:access-permissions /...[:inheritance-flags]:deny | allow file ...

chmod [options] A[index]- file

非簡易 ACL を設定する構文

chmod [options] A[index]{+|=}user|group:name:access-permissions /...[:inheritance-flags]:deny | allow file

chmod [options] A-user|group:name:access-permissions /...[:inheritance-flags]:deny | allow file ...

chmod [options] A[index]- file

owner@, group@, everyone@

簡易 ACL 構文の ACL-entry-type を指定します。ACL-entry-types については、表 8–1 を参照してください。

user または group:ACL-entry-ID=username または groupname

明示的な ACL 構文の ACL-entry-type を指定します。ユーザーとグループの ACL-entry-type には、ACL-entry-ID と、username または groupname も含める必要があります。ACL-entry-types については、表 8–1 を参照してください。

access-permissions/.../

許可または拒否するアクセス権を指定します。ACL アクセス特権については、表 8–2 を参照してください。

inheritance-flags

ACL 継承フラグのオプションリストを指定します。ACL 継承フラグについては、表 8–3 を参照してください。

deny | allow

そのアクセス権を許可するかまたは拒否するかを指定します。

次の例では、ACL-entry-ID の値は関係ありません。


group@:write_data/append_data/execute:deny

次の例では、ACL-entry-ID が含まれています。特定のユーザー (ACL-entry-type) を ACL に含めるためです。


0:user:gozer:list_directory/read_data/execute:allow

ACL エントリが表示されるときは、次のようになります。


2:group@:write_data/append_data/execute:deny

この例では 2 つまり index-ID が指定されていますが、これは、より大きな ACL の ACL エントリであることを示しています。所有者、特定の UID、グループ、および全員のための複数のエントリで構成される可能性があります。chmod コマンドと一緒に index-ID を指定すれば、ACL のどの部分を変更するかを指定できます。たとえば次のように、chmod コマンドに A3 と指定して、インデックス ID 3 を特定することができます。


chmod A3=user:venkman:read_acl:allow filename

ACL エントリタイプは、所有者やグループなどの ACL 表現です。次の表の説明を参照してください。

表 8–1 ACL エントリタイプ

ACL エントリタイプ

説明

owner@

オブジェクトの所有者に許可するアクセス権を指定します。

group@

オブジェクトを所有するグループに許可するアクセス権を指定します。

everyone@

ほかのどの ACL エントリにも一致しないすべてのユーザーまたはグループに許可するアクセス権を指定します。

user

ユーザー名を使って、オブジェクトに追加するユーザーに許可するアクセス権を指定します。ACL-entry-ID を含める必要があります。username または userID を指定します。値が有効な数値 UID または username でない場合、その ACL エントリタイプは無効です。

group

グループ名を使って、オブジェクトに追加するグループに許可するアクセス権を指定します。ACL-entry-ID を含める必要があります。groupname または groupID を指定します。値が有効な数値 GID または groupname でない場合、その ACL エントリタイプは無効です。

ACL アクセス特権について、次の表で説明します。

表 8–2 ACL アクセス特権

アクセス特権

アクセス特権のコンパクト表現

説明

add_file

w

ディレクトリに新しいファイルを追加するためのアクセス権。

add_subdirectory

p

ディレクトリ上でサブディレクトリを作成するためのアクセス権。

append_data

p

プレースホルダー。現時点では実装されていません。

delete

d

ファイルを削除するためのアクセス権。

delete_child

D

ディレクトリ内のファイルまたはディレクトリを削除するためのアクセス権。

execute

x

ファイルを実行するためのアクセス権またはディレクトリの内容を検索するためのアクセス権。

list_directory

r

ディレクトリの内容を表示するためのアクセス権。

read_acl

c

ACL (ls) を読み取るためのアクセス権。

read_attributes

a

ファイルの基本属性 (ACL 以外) を読み取るためのアクセス権。基本属性は、stat レベルの属性と考えてください。このアクセスマスクビットを許可したエンティティーは、ls(1) および stat(2) を実行できる状態になります。

read_data

r

ファイルの内容を読み取るためのアクセス権。

read_xattr

R

ファイルの拡張属性を読み取るためのアクセス権。または、ファイルの拡張属性ディレクトリの検索を実行するためのアクセス権。

synchronize

s

プレースホルダー。現時点では実装されていません。

write_xattr

W

拡張属性を作成するためのアクセス権。または、拡張属性ディレクトリに書き込みむためのアクセス権。

このアクセス権を許可したユーザーは、ファイルの拡張属性ディレクトリを作成できます。属性ファイルのアクセス権を使って、その属性にユーザーがアクセスできるかどうかを制御します。

write_data

w

ファイルの内容を変更または置き換えるためのアクセス権。

write_attributes

A

ファイルまたはディレクトリに関連付けられた時刻を任意の値に変更するためのアクセス権。

write_acl

C

ACL を書き込むためのアクセス権。つまり chmod コマンドを使用して ACL を変更することができます。

write_owner

o

ファイルの所有者またはグループを変更するためのアクセス権。つまり、ファイルに対して chown または chgrp コマンドを実行することができます。

ファイルの所有権を取得するためのアクセス権。または、ファイルのグループ所有権をユーザーが所属するグループに変更するためのアクセス権。ファイルまたはグループの所有権を任意のユーザーまたはグループに変更する場合は、PRIV_FILE_CHOWN 権限が必要です。

ACL 継承

ACL 継承を使用する目的は、親ディレクトリの既存のアクセス権ビットを考慮しながら、意図した ACL を新しく作成するファイルまたはディレクトリが継承できるようにすることです。

デフォルトでは、ACL は伝達されません。ディレクトリに非簡易 ACL を設定した場合でも、その ACL はそれ以降に作成されるディレクトリには継承されません。ACL を継承する場合は、ファイルまたはディレクトリにそのことを 指定する必要があります。

オプションの継承フラグについて、次の表で説明します。

表 8–3 ACL 継承フラグ

継承フラグ

継承フラグのコンパクト表現

説明

file_inherit

f

親ディレクトリの ACL をそのディレクトリのファイルにのみ継承します。

dir_inherit

d

親ディレクトリの ACL をそのディレクトリのサブディレクトリにのみ継承します。

inherit_only

i

親ディレクトリから ACL を継承しますが、新しく作成したファイルまたはサブディレクトリにのみ適用され、そのディレクトリ自体には適用されません。このフラグを使用する場合は、何を継承するかを指定するために、file_inherit フラグまたは dir_inherit フラグ、あるいはその両方を指定する必要があります。

no_propagate

n

親ディレクトリの ACL をそのディレクトリの第 1 レベルの内容にのみ継承します。第 2 レベル以降の内容には継承しません。このフラグを使用する場合は、何を継承するかを指定するために、file_inherit フラグまたは dir_inherit フラグ、あるいはその両方を指定する必要があります。

-

なし

アクセス権は付与されていません。

また、aclinherit ファイルシステムプロパティーを使用して、デフォルトの ACL 継承ポリシーをファイルシステムに設定することもできます。ポリシーの厳密度はプロパティーによって異なります。詳細については、次の節を参照してください。

ACL プロパティーモード

ZFS ファイルシステムには、ACL に関連する 2 つのプロパティーモードが用意されています。

  • aclinherit – このプロパティーを使って、ACL 継承の動作を決定します。次の値を使用できます。

    • discard – 新しいオブジェクトの場合に、ファイルまたはディレクトリを作成するときに ACL エントリは継承されません。ファイルまたはディレクトリの ACL は、そのファイルまたはディレクトリのアクセス権モードと等価です。

    • noallow – 新しいオブジェクトの場合に、継承可能な ACL エントリのうち、アクセスタイプが deny のエントリだけが継承されます。

    • restricted – 新しいオブジェクトの場合に、ACL エントリが継承されるときに、write_owner および write_acl アクセス権が取り除かれます。

    • passthrough – プロパティーの値が passthrough に設定されている場合、作成されるファイルのモードは継承可能な ACE によって決定されます。モードに影響を与える継承可能な ACE が存在しない場合、モードはアプリケーションから要求されたモードに従って設定されます。

    • passthrough-x – セマンティクスは次の点を除き passthrough と同じです。passthrough-x を有効にした場合、ファイル作成モードおよびモードに影響を与える継承可能な ACE で実行アクセス権が設定されている場合に限りファイルが実行 (x) アクセス権付きで作成されます。

    aclinherit のデフォルトモードは、restricted です。

  • aclmode – このプロパティーを指定すると、ファイルが最初に作成されるとき、または chmod コマンドを使ってファイルまたはディレクトリのモードが変更されるときに、ACL の動作が変更されます。次の値を使用できます。

    • discard – ファイルまたはディレクトリのモードを定義するために必要なエントリを除いて、すべての ACL エントリが取り除かれます。

    • groupmask – ユーザーまたはグループの ACL アクセス権の強度が、グループのアクセス権ビットより弱くなるように変更されます。ただし、そのファイルまたはディレクトリの所有者と同じ UID を持つユーザーエントリは変更されません。さらに、その ACL アクセス権の強度が、所有者のアクセス権ビットより弱くなるように変更されます。

    • passthroughowner@group@、または everyone@ 以外の ACE は、chmod 操作時に変更されることはありません。owner@group@、または everyone@ の ACE は無効になり、chmod 操作で要求されたファイルモードが設定されます。

    aclmode プロパティーのデフォルトモードは、groupmask です。

ZFS ファイルに ACL を設定する

ZFS と一緒に実装される ACL は、ACL エントリの配列で構成されます。ZFS の ACL モデルは「純粋」です。つまり、すべてのファイルに ACL が含まれます。この ACL は、従来の UNIX の owner/group/other エントリを表現しているだけという点で、全体的に見れば簡易な ACLです。

ZFS ファイルにもアクセス権ビットとモードが含まれます。ただし、より正確に表現すれば、これらの値は ACL が表現するアクセス権のキャッシュです。つまり、ファイルのアクセス権を変更した場合には、それに応じてファイルの ACL が更新されます。また、ファイルまたはディレクトリへのアクセスをユーザーに許可するための非簡易 ACL を削除しても、グループまたは全員にアクセスを許可するファイルまたはディレクトリのアクセス権ビットが設定されている場合には、そのユーザーはそのファイルまたはディレクトリに引き続きアクセスできます。アクセス制御に関するすべての決定は、ファイルまたはディレクトリの ACL に表現されているアクセス権によって制御されます。

ZFS ファイルの ACL アクセス権に関する主な規則は、次のとおりです。

  • ZFS では、ACL に指定されている順序に従って、上から順番に ACL エントリが処理されます。

  • ACL エントリが処理されるのは、アクセスを要求したユーザーが ACL エントリに設定されているユーザーと一致した場合だけです。

  • いったん付与した許可アクセス権は、その ACL アクセス権セットの後続の ACL 拒否エントリで拒否することはできません。

  • ファイルの所有者には write_acl アクセス権が無条件で付与されます。そのアクセス権を明示的に拒否した場合でも付与されます。それ以外のユーザーの場合は、指定していないアクセス権はすべて拒否されます。

    拒否アクセス権が設定されている場合または許可アクセス権が失われている場合でも、ファイルの所有者またはスーパーユーザーに許可されるアクセス要求は、特権サブシステムによって決められます。この機構によって、ファイルの所有者が所有しているファイルから拒否されることがなくなり、スーパーユーザーがファイルを回復するために変更できるようになります。

ディレクトリに非簡易 ACL を設定しても、その ACL はそのディレクトリの子に自動的に継承されることはありません。非簡易 ACL を設定し、それがそのディレクトリの子に継承されるようにする場合は、ACL 継承フラグを使用する必要があります。詳細については、表 8–3 および 「ZFS ファイルの ACL 継承を冗長形式で設定する」を参照してください。

新しいファイルを作成すると、umask の値に応じて、次のようなデフォルトの簡易 ACL が適用されます。


$ ls -v file.1
-r--r--r--   1 root     root      206663 Aug 31 11:53 file.1
     0:owner@:write_data/append_data/execute:deny
     1:owner@:read_data/write_xattr/write_attributes/write_acl/write_owner
         :allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

この例の各ユーザーカテゴリ (owner@group@everyone@) には、2 つの ACL エントリがあります。1 つは deny アクセス権のエントリ、もう 1 つは allow アクセス権のエントリです。

このファイル ACL について説明します。

0:owner@

この所有者は、このファイルを書き込むアクセス権および実行するアクセス権を拒否されます (write_data/append_data/execute:deny)。

1:owner@

この所有者は、このファイルの内容を読み取って変更することができます (read_data/write_data/append_data)。この所有者は、タイムスタンプ、拡張属性、ACL などのファイル属性を変更することもできます (write_xattr/write_attributes /write_acl)。さらに、この所有者はファイルの所有権を変更できます (write_owner:allow)。

2:group@

このグループは、このファイルを変更および実行するアクセス権を拒否されます (write_data/append_data/execute:deny)。

3:group@

このグループには、ファイルの読み取りアクセス権が付与されます (read_data:allow)。

4:everyone@

ユーザーとグループ以外の全員は、ファイルを実行または内容を変更するアクセス権と、ファイルのすべての属性を変更するアクセス権が拒否されます (write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:deny)。

5:everyone@

ユーザーまたはグループ以外の全員には、ファイルおよびファイルの属性を読み取るアクセス権が付与されます (read_data/read_xattr/read_attributes/read_acl/synchronize:allow)。synchronize の許可アクセス権は、現在のところ実装されていません。

新しいディレクトリを作成すると、umask の値に応じて、デフォルトのディレクトリ ACL は次のようになります。


$ ls -dv dir.1
drwxr-xr-x   2 root     root           2 Aug 31 11:54 dir.1
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

このディレクトリ ACL について説明します。

0:owner@

この所有者の拒否リストは、このディレクトリについて空です (::deny)。

1:owner@

この所有者は、ディレクトリの内容を読み取って変更すること (list_directory/read_data/add_file/write_data/add_subdirectory/append_data)、内容を検索すること (execute)、およびタイムスタンプ、拡張属性、ACL などのファイル属性を変更すること (write_xattr/write_attributes/write_acl) が許可されます。また、この所有者はディレクトリの所有権を変更できます (write_owner:allow)。

2:group@

このグループは、ディレクトリの内容を追加または変更できません (add_file/write_data/add_subdirectory/append_data:deny)。

3:group@

このグループは、ディレクトリの内容を表示して読み取ることができます。また、このグループには、ディレクトリの内容を検索するアクセス権が許可されます (list_directory/read_data/execute:allow)。

4:everyone@

ユーザーまたはグループ以外の全員は、ディレクトリの内容を追加および変更するアクセス権が拒否されます (add_file/write_data/add_subdirectory/append_data)。また、ディレクトリの属性を変更するアクセス権が拒否されます(write_xattr /write_attributes/write_acl/write_owner:deny)。

5:everyone@

ユーザーまたはグループ以外の全員に、ディレクトリの内容および属性を読み取って実行するアクセス権が付与されます (list_directory/read_data/read_xattr/execute/read_attributes/read_acl/synchronize:allow)。synchronize の許可アクセス権は、現在のところ実装されていません。

ZFS ファイルの ACL を冗長形式で設定および表示する

chmod コマンドを使用して、ZFS ファイルの ACL を変更できます。次の chmod 構文では、ACL を変更するために acl-specification を使って ACL の形式を指定しています。acl-specification については、「ACL を設定する構文の説明」を参照してください。

  • ACL エントリを追加する

    • ユーザーの ACL エントリを追加する


      % chmod A+acl-specification filename
      
    • index-ID を使用して ACL エントリを追加する


      % chmod Aindex-ID+acl-specification filename
      

      この構文では、指定した index-ID の位置に新しい ACL エントリが挿入されます。

  • ACL エントリを置き換える


    % chmod A=acl-specification filename
    

    % chmod Aindex-ID=acl-specification filename
    
  • ACL エントリを削除する

    • index-ID を使用して ACL エントリを削除する


      % chmod Aindex-ID- filename
      
    • ユーザーを使用して ACL エントリを削除する


      % chmod A-acl-specification filename
      
    • 非簡易 ACL をファイルからすべて削除する


      % chmod A- filename
      

ls - v コマンドを使用することで、詳細な ACL 情報が表示されます。次に例を示します。


# ls -v file.1
-rw-r--r--   1 root     root      206663 Aug 31 11:53 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

コンパクト形式の ACL の使用方法については、「ZFS ファイルの ACL をコンパクト形式で設定および表示する」を参照してください。


例 8–1 ZFS ファイルの簡易 ACL を変更する

この節では、簡易 ACL を設定して表示する例を紹介します。

次の例では、簡易 ACL が file.1 にあります。


# ls -v file.1
-rw-r--r--   1 root     root      206663 Aug 31 11:53 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

次の例では、write_data アクセス権が group@ に付与されます。


# chmod A2=group@:append_data/execute:deny file.1
# chmod A3=group@:read_data/write_data:allow file.1
# ls -v file.1
-rw-rw-r--   1 root     root      206663 Aug 31 11:53 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:append_data/execute:deny
     3:group@:read_data/write_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

次の例では、permissions on file.1 へのアクセス権の設定が 644 に戻されます。


# chmod 644 file.1
# ls -v file.1
-rw-r--r--   1 root     root      206663 Aug 31 11:53 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow


例 8–2 ZFS ファイルに非簡易 ACL を設定する

この節では、非簡易 ACL を設定して表示する例を紹介します。

次の例では、read_data/execute アクセス権が、test.dir ディレクトリのユーザー gozer に追加されます。


# chmod A+user:gozer:read_data/execute:allow test.dir
# ls -dv test.dir
drwxr-xr-x+  2 root     root           2 Aug 31 12:02 test.dir
     0:user:gozer:list_directory/read_data/execute:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例では、read_data/execute アクセス権がユーザー gozer から削除されます。


# chmod A0- test.dir
# ls -dv test.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow


例 8–3 ACL を使用して ZFS ファイルのアクセス権を操作する

これらの ACL の例では、ACL を設定してから、ファイルまたはディレクトリのアクセス権ビットを変更するまでの操作を説明します。

次の例では、簡易 ACL が file.2 にあります。


# ls -v file.2
-rw-r--r--   1 root     root        2836 Aug 31 12:06 file.2
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

次の例では、ACL 許可アクセス権が everyone@ から削除されます。


# chmod A5- file.2
# ls -v file.2
-rw-r-----+  1 root     root        2836 Aug 31 12:06 file.2
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny

この出力では、ファイルのアクセス権ビットが 655 から 650 に再設定されています。everyone@ の読み取りアクセス権は、everyone@ の ACL 許可アクセス権が削除されるときに、ファイルのアクセス権ビットから事実上削除されています。

次の例では、既存の ACL が everyone@read_data/write_data アクセス権に置き換わります。


# chmod A=everyone@:read_data/write_data:allow file.3
# ls -v file.3
-rw-rw-rw-+  1 root     root        2455 Aug 31 12:08 file.3
     0:everyone@:read_data/write_data:allow

この出力では、chmod 構文を使って、owner@、group@、および everyone@ が読み取りまたは書き込みできるように、既存の ACL を read_data/write_data:allow アクセス権に事実上置き換えています。このモデルでは、everyone@ を使って、すべてのユーザーまたはグループへのアクセス権を指定しています。所有者とグループのアクセス権を上書きする owner@group@ の ACL エントリがないので、アクセス権ビットは 666 に設定されます。

次の例では、既存の ACL がユーザー gozer の読み取りアクセス権に置き換わります。


# chmod A=user:gozer:read_data:allow file.3
# ls -v file.3
----------+  1 root     root        2455 Aug 31 12:08 file.3
     0:user:gozer:read_data:allow

この出力では、従来のファイルアクセス権コンポーネントを表す owner@group@、または everyone@ の ACL エントリがないので、ファイルアクセス権は 000 になります。ファイルの所有者は、次のようにアクセス権 (および ACL) を再設定することで、この問題を解決できます。


# chmod 655 file.3
# ls -v file.3
-rw-r-xr-x+  1 root     root        2455 Aug 31 12:08 file.3
     0:user:gozer::deny
     1:user:gozer:read_data:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data:deny
     5:group@:read_data/execute:allow
     6:everyone@:write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/execute/read_attributes/read_acl
         /synchronize:allow


例 8–4 ZFS ファイルの簡易 ACL を復元する

chmod コマンドを使用して、ファイルまたはディレクトリの非簡易 ACL をすべて削除できます。

次の例では、2 つの非簡易 ACL が test5.dir にあります。


# ls -dv test5.dir
drwxr-xr-x+  2 root     root           2 Aug 31 12:11 test5.dir
     0:user:lp:read_data:file_inherit:deny
     1:user:gozer:read_data:file_inherit:deny
     2:owner@::deny
     3:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     4:group@:add_file/write_data/add_subdirectory/append_data:deny
     5:group@:list_directory/read_data/execute:allow
     6:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     7:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例では、ユーザー gozerlp の非簡易 ACL が削除されます。owner@group@、および everyone@ の残りの ACL には、6 個のデフォルト値が設定されています。


# chmod A- test5.dir
# ls -dv test5.dir
drwxr-xr-x   2 root     root           2 Aug 31 12:11 test5.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

ZFS ファイルの ACL 継承を冗長形式で設定する

ファイルとディレクトリに ACL をどのように継承するかまたは継承しないかを決定できます。デフォルトでは、ACL は伝達されません。ディレクトリに非簡易 ACL を設定した場合でも、その ACL はそれ以降に作成されるディレクトリには継承されません。ACL を継承する場合は、ファイルまたはディレクトリにそのことを指定する必要があります。

また、次の 2 つの ACL プロパティーは、ファイルシステムにグローバルに設定できます。 aclinheritaclmode です。デフォルトでは、aclinheritrestricted に、aclmodegroupmask に設定されています。

詳細については、「ACL 継承」を参照してください。


例 8–5 デフォルトの ACL 継承を許可する

デフォルトでは、ACL はディレクトリ階層に伝達されません。

次の例では、read_data/write_data/execute の非簡易 ACL が、test.dir のユーザー gozer に適用されます。


# chmod A+user:gozer:read_data/write_data/execute:allow test.dir
# ls -dv test.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:02 test.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

test.dir サブディレクトリが作成されても、ユーザー gozer の ACE は伝達されません。sub.dir 上でユーザー gozer に許可されているアクセス権がファイル所有者、グループメンバー、または everyone@ としてのアクセス権の場合には、このユーザーは sub.dir にしかアクセスできません。


# mkdir test.dir/sub.dir
# ls -dv test.dir/sub.dir
drwxr-xr-x   2 root     root           2 Aug 31 13:26 test.dir/sub.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow


例 8–6 ファイルとディレクトリの ACL 継承を 許可する

ここで示す一連の例では、file_inherit フラグが設定されているときに適用されるファイルとディレクトリの ACE を示しています。

次の例では、test.dir ディレクトリ上のファイルへの read_data/write_data アクセス権がユーザー gozer に追加されます。このユーザーは、新しく作成されたすべてのファイルに読み取りアクセスできるようになります。


# chmod A+user:gozer:read_data/write_data:file_inherit:allow test2.dir
# ls -dv test2.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:26 test2.dir
     0:user:gozer:read_data/write_data:file_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例では、ユーザー gozer のアクセス権が、新しく作成されたファイル test2.dir/file.2 に適用されます。ACL 継承が許可されているので (read_data:file_inherit:allow)、ユーザー gozer は新しく作成されたすべてのファイルの内容を読み取ることができます。


# touch test2.dir/file.2
# ls -v test2.dir/file.2
-rw-r--r--+  1 root     root           0 Aug 31 13:27 test2.dir/file.2
     0:user:gozer:write_data:deny
     1:user:gozer:read_data/write_data:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

このファイルの aclmode がデフォルトモード groupmask に設定されているため、ユーザー gozer には file.2 への write_data アクセス権は割り当てられません。これは、ファイルのグループアクセス権が許可していないためです。

inherit_only アクセス権は、file_inherit または dir_inherit フラグが設定されているときに適用されます。このアクセス権は、ディレクトリ階層に ACL を伝達するために使用します。この場合、ユーザー gozer のアクセス権の許可または拒否は、ファイルの所有者またはファイルを所有するグループのメンバーである場合を除いて、everyone@ アクセス権に基づいてのみ行われます。次に例を示します。


# mkdir test2.dir/subdir.2
# ls -dv test2.dir/subdir.2
drwxr-xr-x+  2 root     root           2 Aug 31 13:28 test2.dir/subdir.2
     0:user:gozer:list_directory/read_data/add_file/write_data:file_inherit
         /inherit_only:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次に示す一連の例では、file_inheritdir_inherit フラグが両方設定されているときに適用される、ファイルとディレクトリ の ACL を示しています。

次の例では、ユーザー gozer に読み取り、書き込み、および実行アクセス権が付与されます。これらのアクセス権は、新しく作成されたファイルとディレクトリに継承されます。


# chmod A+user:gozer:read_data/write_data/execute:file_inherit/dir_inherit:allow 
test3.dir
# ls -dv test3.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:29 test3.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/dir_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

# touch test3.dir/file.3
# ls -v test3.dir/file.3
-rw-r--r--+  1 root     root           0 Jun 20 14:42 test3.dir/file.3
     0:user:gozer:write_data/execute:deny
     1:user:gozer:read_data/write_data/execute:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

# mkdir test3.dir/subdir.1
# ls -dv test3.dir/subdir.1
drwxr-xr-x+  2 root     root           2 Aug 31 13:32 test3.dir/subdir.1
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/dir_inherit/inherit_only:allow
     1:user:gozer:add_file/write_data:deny
     2:user:gozer:list_directory/read_data/add_file/write_data/execute:allow
     3:owner@::deny
     4:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     5:group@:add_file/write_data/add_subdirectory/append_data:deny
     6:group@:list_directory/read_data/execute:allow
     7:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     8:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

これらの例では、group@ および everyone@ の親ディレクトリのアクセス権ビットによって、書き込みアクセス権と実行アクセス権が拒否されます。このため、ユーザー gozer は書き込みアクセス権と実行アクセス権が拒否されます。デフォルトの aclmode プロパティーは restricted です。つまり、write_data および execute アクセス権は継承されていません。

次の例では、ユーザー gozer に読み取り、書き込み、および実行アクセス権が付与されます。これらのアクセス権は、新しく作成されたファイルに継承されますが、ディレクトリの下位の内容には伝達されません。


# chmod A+user:gozer:read_data/write_data/execute:file_inherit/no_propagate:allow 
test4.dir
# ls -dv test4.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:34 test4.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/no_propagate:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例に示すように、新しいサブディレクトリを作成しても、ユーザー gozer のファイルへの read_data/write_data/execute アクセス権は、その新しい sub4.dir ディレクトリには伝達されません。


mkdir test4.dir/sub4.dir
# ls -dv test4.dir/sub4.dir
drwxr-xr-x   2 root     root           2 Aug 31 13:35 test4.dir/sub4.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例に示すように、gozer のファイルへの read_data/write_data/execute アクセス権は、新しく作成したファイルに伝達されます。


# touch test4.dir/file.4
# ls -v test4.dir/file.4
-rw-r--r--+  1 root     root           0 Aug 31 13:35 test4.dir/file.4
     0:user:gozer:write_data/execute:deny
     1:user:gozer:read_data/write_data/execute:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow


例 8–7 ACL モードが passthrough に設定された ACL 継承

?tank/cindys ファイルシステムの aclmode プロパティーが passthrough に設定されている場合は、ユーザー gozer が新しく作成した file.4 には、test.4.dir に適用されている ACL が継承されます。次に例を示します。


# zfs set aclmode=passthrough tank/cindys
# touch test4.dir/file.4
# ls -v test4.dir/file.4
-rw-r--r--+  1 root     root           0 Aug 31 13:39 test4.dir/file.4
     0:user:gozer:write_data/execute:deny
     1:user:gozer:read_data/write_data/execute:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

この出力は、親ディレクトリ test4.dir に設定されている read_data/write_data/execute:allow:file_inherit/dir_inherit ACL が、ユーザー gozer にそのまま渡されることを示しています。



例 8–8 ACL モードが discard に設定された ACL 継承

ファイルシステムの aclmode プロパティーが discard に設定されている場合には、ディレクトリのアクセス権ビットが変更されたときに、ACL が破棄される可能性があります。次に例を示します。


# zfs set aclmode=discard tank/cindys
# chmod A+user:gozer:read_data/write_data/execute:dir_inherit:allow test5.dir
# ls -dv test5.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:40 test5.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :dir_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

あとでディレクトリのアクセス権ビットをより厳格に設定することにした場合は、非簡易 ACL は破棄されます。次に例を示します。


# chmod 744 test5.dir
# ls -dv test5.dir
drwxr--r--   2 root     root           2 Aug 31 13:40 test5.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data/execute:deny
     3:group@:list_directory/read_data:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /execute/write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/read_attributes/read_acl
         /synchronize:allow


例 8–9 ACL 継承モードが noallow に設定された ACL 継承

次の例では、ファイルに継承される 2 つの非簡易 ACL が設定されます。一方の ACL では read_data アクセス権が許可され、もう一方の ACL では read_data アクセス権が拒否されます。この例では、1 つの chmod コマンドに 2 つの ACE を指定できることも示しています。


# zfs set aclinherit=noallow tank/cindys
# chmod A+user:gozer:read_data:file_inherit:deny,user:lp:read_data:file_inherit:allow 
test6.dir
# ls -dv test6.dir
drwxr-xr-x+  2 root     root           2 Aug 31 13:43 test6.dir
     0:user:gozer:read_data:file_inherit:deny
     1:user:lp:read_data:file_inherit:allow
     2:owner@::deny
     3:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     4:group@:add_file/write_data/add_subdirectory/append_data:deny
     5:group@:list_directory/read_data/execute:allow
     6:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     7:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow

次の例に示すように、新しいファイルが作成されると、read_data アクセス権を許可する ACL が破棄されます。


# touch test6.dir/file.6
# ls -v test6.dir/file.6
-rw-r--r--   1 root     root           0 Aug 31 13:44 test6.dir/file.6
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow

ZFS ファイルの ACL をコンパクト形式で設定および表示する

ZFS ファイルのアクセス権をコンパクト形式で設定および表示できます。コンパクト形式では、一意の 14 個の文字を使ってアクセス権を表現します。アクセス権を表現するためのコンパクト形式の文字については、表 8–2 および表 8–3 を参照してください。

ファイルとディレクトリのコンパクト形式の ACL リストは、ls -V コマンドを使用して表示できます。次に例を示します。


# ls -V file.1
-rw-r--r--   1 root     root      206663 Aug 31 13:54 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

コンパクト形式の ACL 出力について説明します。

owner@

この所有者は、このファイルを実行するアクセス権を拒否されます (x=execute)。

owner@

この所有者は、このファイルの内容を読み取って変更することができます (rw=read_data/write_data)、(p=append_data)。この所有者は、タイムスタンプ、拡張属性、ACL などのファイルの属性を変更することもできます (A=write_xattrW=write_attributesC=write_acl)。さらに、この所有者はファイルの所有権を変更できます (o=write_owner)。

group@

このグループは、このファイルを変更および実行するアクセス権を拒否されます (write_datap=append_datax=execute)。

group@

このグループには、このファイルを読み取るアクセス権が付与されます (r=read_data)。

everyone@

ユーザーやグループ以外の全員は、このファイルの内容を実行および変更するアクセス権、およびこのファイルの属性を変更するアクセス権を拒否されます (w=write_datax=executep=append_dataA=write_xattrW=write_attributesC=write_aclo=write_owner)。

everyone@

ユーザーやグループ以外の全員は、このファイルおよびこのファイルの属性を読み取るアクセス権が付与されます (r=read_dataa=append_dataR=read_xattrc=read_acls=synchronize)。synchronize の許可アクセス権は、現在のところ実装されていません。

コンパクト形式の ACL には、冗長形式の ACL と比べて次の利点があります。

  • アクセス権を chmod コマンドに指定するときに、順対応引数として指定できます。

  • アクセス権がないことを表すハイフン (-) 文字は、省略してもかまいません。必要な文字だけを指定する必要があります。

  • アクセス権と継承フラグは、同じ方法で設定します。

冗長形式の ACL の使用方法については、「ZFS ファイルの ACL を冗長形式で設定および表示する」を参照してください。


例 8–10 コンパクト形式で ACL を設定および表示する

次の例では、簡易 ACL が file.1 にあります。


# ls -V file.1
-rw-r--r--   1 root     root      206663 Aug 31 13:54 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

次の例では、ユーザー gozerfile.1 の read_data/execute アクセス権が追加されます。


# chmod A+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r--r--+  1 root     root      206663 Aug 31 13:54 file.1
        user:gozer:r-x-----------:------:allow
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

所定の場所 (例: 4) に新しい ACL を挿入する方法で、ユーザー gozer に同じアクセス権を追加することもできます。これにより、場所 4–6 の既存の ACL が下に移動します。次に例を示します。


# chmod A4+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r--r--+  1 root     root      206663 Aug 31 14:05 file.1
            owner@:--xp----------:------:deny
            owner@:rw-----A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
        user:gozer:r-x-----------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow

次の例では、コンパクト形式を使ってユーザー gozer に読み取り、書き込み、および実行アクセス権を付与します。これらのアクセス権は、新しく作成されたファイルとディレクトリに継承されます。


# chmod A+user:gozer:rwx:fd:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Aug 28 13:21 dir.2
        user:gozer:rwx-----------:fd----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow

ls -V の出力にあるアクセス権と継承フラグをコンパクト形式の chmod にカット&ペーストすることもできます。たとえば、ユーザー gozer に割り当てられている dir.2 のアクセス権と継承フラグを同じ dir.2 上のユーザー cindys に複製するには、そのアクセス権と継承フラグ (rwx-----------:f-----:allow) を chmod コマンドにコピー&ペーストします。次に例を示します。


# chmod A+user:cindys:rwx-----------:fd----:allow dir.2
# ls -dV dir.2
drwxr-xr-x+  2 root     root           2 Aug 28 14:12 dir.2
       user:cindys:rwx-----------:fd----:allow
        user:gozer:rwx-----------:fd----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow


例 8–11 ACL 継承モードが passthrough に設定された ACL 継承

aclinherit プロパティーが passthrough に設定されているファイルシステムは、継承時に ACL エントリに加えられた変更を除く、継承可能なすべての ACL エントリを継承します。このプロパティーが passthrough に設定されている場合、作成されるファイルのアクセス権モードは継承可能な ACL によって決定されます。アクセス権モードに影響を与える継承可能な ACL が存在しない場合、アクセス権モードはアプリケーションから要求されたモードに従って設定されます。

次の例では、コンパクト形式の ACL 構文を使用して、aclinherit モードを passthrough に設定することによってアクセス権ビットを継承する方法を示します。

次の例では、ACL を test1.dir に設定して継承を強制します。この構文によって新しく作成されたファイルには、owner@group@、および everyone@ ACL エントリが作成されます。新しく作成されたディレクトリには、owner@group@、および everyone@ ACL エントリが継承されます。これらに加え、ディレクトリには、新しく作成されるディレクトリとファイルに ACE を伝達する 6 つの ACE も継承されます。


# zfs set aclinherit=passthrough tank/cindys
# pwd
/tank/cindys
# mkdir test1.dir

# chmod A=owner@:rwxpcCosRrWaAdD:fd:allow,group@:rwxp:fd:allow,everyone@::fd:allow 
test1.dir
# ls -Vd test1.dir
drwxrwx---+  2 root     root           2 Aug 31 14:11 test1.dir
            owner@:rwxpdDaARWcCos:fd----:allow
            group@:rwxp----------:fd----:allow
         everyone@:--------------:fd----:allow

次の例では、新しく作成されるファイルに継承されるように指定されていた ACL が、新しく作成されたファイルに継承されます。


# cd test1.dir
# touch file.1
# ls -V file.1
-rwxrwx---+  1 root     root           0 Aug 31 14:14 file.1
            owner@:rwxpdDaARWcCos:------:allow
            group@:rwxp----------:------:allow
         everyone@:--------------:------:allow

次の例では、新しく作成されたディレクトリに、このディレクトリへのアクセスを制御する ACE と、この新しく作成されたディレクトリの子にあとで伝達するための ACE が継承されます。


# mkdir subdir.1
# ls -dV subdir.1
drwxrwx---+  2 root     root           2 Aug 31 14:15 subdir.1
            owner@:rwxpdDaARWcCos:fdi---:allow
            owner@:rwxpdDaARWcCos:------:allow
            group@:rwxp----------:fdi---:allow
            group@:rwxp----------:------:allow
         everyone@:--------------:fdi---:allow
         everyone@:--------------:------:allow

-di-- エントリと f-i--- エントリは継承の伝達に関するもので、アクセス制御時には考慮されません。次の例では、簡易 ACL の設定されたファイルが別のディレクトリ作成されます。このディレクトリには、継承される ACE はありません。


# cd /tank/cindys
# mkdir test2.dir
# cd test2.dir
# touch file.2
# ls -V file.2
-rw-r--r--   1 root     root           0 Aug 31 14:16 file.2
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow


例 8–12 ACL 継承モードが passthrough-x に設定された ACL 継承

aclinherit=passthrough-x を有効にすると、ファイル作成モードおよびファイル作成モードに影響する継承可能な ACE モードで実行権が設定されている場合にのみ、owner@group@、または everyone@ の実行 (x) 権を使用してファイルが作成されます。

次の例では、aclinherit モードを passthrough-x に設定して実行権を継承する方法を示します。


# zfs set aclinherit=passthrough-x tank/cindys

次の ACL は /tank/cindys/test1.dir で設定されており、owner@ のファイルに対する実行可能 ACL 継承を提供します。


# chmod A=owner@:rwxpcCosRrWaAdD:fd:allow,group@:rwxp:fd:allow,everyone@::fd:allow test1.dir
# ls -Vd test1.dir
drwxrwx---+  2 root     root           2 Aug 31 15:05 test1.dir
            owner@:rwxpdDaARWcCos:fd----:allow
            group@:rwxp----------:fd----:allow
         everyone@:--------------:fd----:allow

要求されたアクセス権 0666 を使用してファイル (file1) が作成されます。この結果、アクセス権 0660 が設定されます。作成モードで要求していないため、実行権は継承されません。


# touch test1.dir/file1
# ls -V test1.dir/file1
-rw-rw----+  1 root     root           0 Aug 31 15:06 test1.dir/file1
            owner@:rw-pdDaARWcCos:------:allow
            group@:rw-p----------:------:allow
         everyone@:--------------:------:allow

次に、t という実行可能ファイルが、cc コンパイラを使用して testdir ディレクトリーに作成されます。


# cc -o t t.c
# ls -V t
-rwxrwx---+  1 root     root        7396 Dec  3 15:19 t
                 owner@:rwxpdDaARWcCos:------:allow
                 group@:rwxp----------:------:allow
              everyone@:--------------:------:allow

cc が要求したアクセス権は 0777 であるため、アクセス権は 0770 になります。その結果、owner@group@、および everyone@ エントリから実行権が継承されます。