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 継承フラグを使用する必要があります。詳細については、Table 7–4 および ZFS ファイルの ACL 継承を冗長形式で設定するを参照してください。
新しいファイルを作成すると、umask の値に応じて、次のようなデフォルトの簡易 ACL が適用されます。
$ ls -v file.1 -rw-r--r-- 1 root root 206663 Jun 23 15:06 file.1 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 2:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
この例では、各ユーザーカテゴリ (owner@、group@、everyone@) に ACL エントリがあります。
このファイル ACL について説明します。
この所有者は、このファイルの内容を読み取って変更することができます (read_data/write_data/append_data/read_xattr)。この所有者は、タイムスタンプ、拡張属性、ACL などのファイル属性を変更することもできます (write_xattr/read_attributes/write_attributes/read_acl/write_acl)。さらに、この所有者はファイルの所有権を変更できます (write_owner:allow)。
synchronize の許可アクセス権は、現在のところ実装されていません。
グループには、ファイルおよびファイルの属性への読み取りアクセス権が付与されます (read_data/read_xattr/read_attributes/read_acl:allow)。
ユーザーまたはグループ以外の全員には、ファイルおよびファイルの属性を読み取るアクセス権が付与されます (read_data/read_xattr/read_attributes/read_acl/synchronize:allow)。synchronize の許可アクセス権は、現在のところ実装されていません。
新しいディレクトリを作成すると、umask の値に応じて、デフォルトのディレクトリ ACL は次のようになります。
$ ls -dv dir.1 drwxr-xr-x 2 root root 2 Jul 20 13:44 dir.1 0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 2:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
この所有者は、ディレクトリの内容を読み取って変更すること (list_directory/read_data/add_file/write_data/add_subdirectory/append_data)、およびタイムスタンプ、拡張属性、ACL などのファイル属性を読み取って変更すること (/read_xattr/write_xattr/read_attributes/write_attributes/read_acl/write_acl ) ができます。さらに、所有者は、内容を検索すること (execute)、ファイルまたはディレクトリを削除すること (delete_child)、およびディレクトリの所有権を変更すること (write_owner:allow) ができます。
synchronize の許可アクセス権は、現在のところ実装されていません。
グループは、ディレクトリ内容とディレクトリの属性を表示して読み取ることができます。またこのグループは、ディレクトリ内容を検索する実行権を持ちます (list_directory/read_data/read_xattr/execute/read_attributes/read_acl/synchronize:allow)。
ユーザーまたはグループ以外の全員に、ディレクトリの内容および属性を読み取って実行するアクセス権が付与されます (list_directory/read_data/read_xattr/execute/read_attributes/read_acl/synchronize:allow)。synchronize の許可アクセス権は、現在のところ実装されていません。