ZFS ファイルの ACL アクセス権に関する主な規則は、次のとおりです。
ZFS では、ACL に指定されている順序に従って、上から順番に ACL エントリが処理されます。
指定したユーザーがアクセスを要求したユーザーと一致する ACL エントリのみが処理されます。
いったん付与した許可アクセス権は、その ACL アクセス権セットの後続の ACL 拒否エントリで拒否することはできません。
ファイルの所有者には write_acl アクセス権が無条件で付与されます。そのアクセス権を明示的に拒否した場合でも付与されます。それ以外の場合は、指定していないアクセス権はすべて拒否されます。
拒否アクセス権が設定されている場合、またはアクセス権が失われている場合、ファイルの所有者またはスーパーユーザーに付与されるアクセス要求は、特権サブシステムによって決められます。このメカニズムによって、ファイルの所有者が所有しているファイルから拒否されることがなくなり、スーパーユーザーがファイルを回復するために変更できるようになります。
ACL を設定または変更するには、chmod コマンドを使用します。このコマンドの構文は、演算子 (+、=、または -) を入力する前に A を指定する点以外は、ファイルのアクセス権ビットを設定する構文に似ています。
簡易 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
chmod コマンドは次の演算子を使用します。
A+ は ACL エントリを追加します。
A= は ACL エントリを置き換えます。
ファイルの ACL 全体を置き換えるには、インデックス ID を指定せずにこの演算子を使用します。次の例では、file.1 の ACL エントリが削除され、everyone@ の単一エントリに置き換えられます。
% chmod A=everyone@:read_data:allow file.1
A- は ACL エントリを削除します。
ファイルのすべての非簡易 ACL エントリを例外なく削除するには、この演算子を使用して削除する各エントリをリストせずにファイル名を指定します。
% chmod A- filename
このコマンド構文を使用して、ファイルに簡易 ACL を復元します。コマンドを発行すると、簡易 ACL を構成する owner@、group@、および everyone@ のエントリのみが残ります。
注意 - 既存の ACL の変更には注意が必要です。インデックスなしで演算子を使用するのと、インデックスを使用して演算子を使用するのとでは効果が異なります。たとえば、chmod A= は ACL 全体を置き換えますが、chmod A3= はインデックス番号 3 を持つ既存のエントリのみを置き換えます。 |
アクセス権と継承のフラグは、表 8および表 10に掲載されている一意の文字で表現されます。ZFS ACL を設定すると、それらのアクセス権に対応する文字を使用する (コンパクトモード) か、完全なアクセス権を入力する (冗長モード) ことができます。
この例では、両方のコマンドでユーザー Joe に file.1 での読み取りと実行のアクセス権を付与しています。
chmod A+user:joe:rx:allow file.1
chmod A+user:joe:read_data/execute:allow file.1
同様に、ユーザー John に新しく作成した dir.2 とそのファイルに対する継承可能な読み取り、書き込み、および実行のアクセス権を付与するには、次のいずれかのコマンドを使用できます。
chmod A+user:john:rwx:fd:allow dir.2
chmod A+user:john:read_data/write_data/execute:file_inherit/dir_inherit:allow dir.2
ls コマンドでは、2 つの形式のいずれかで ACL 情報を表示できます。–v オプションを使用すると、全体または詳細形式でアクセス権が表示されます。–V オプションは、アクセス権とフラグを表す文字を使用してコンパクトな出力を生成します。
次の例は、同じ ACL 情報が冗長とコンパクトの両方の形式でどのように表示されるかを示しています。
ls -v file.1 -rw-r--r-- 1 root root 206695 Jul 20 14:27 file.1 0:owner@:read_data/write_data/append_data/read_attributes /write_xattr/read_xattr/write_attributes/read_acl/write_acl /write_owner/synchronize:allow 1:group@:read_data/read_attributes/read_xattr/read_acl /synchronize:allow 2:everyone@:read_data/append_data/read_xattr/read_acl /synchronize:allow # ls -V file.1 -rw-r--r-- 1 root root 206695 Jul 20 14:27 file.1 owner@:rw-p--aARWcCos:-------:allow group@:r-----a-R-c--s:-------:allow everyone@:r-----a-R-c--s:-------:allow
各ユーザーカテゴリのアクセス権についての説明は、表 8を参照してください。
このセクションでは、ACL を設定および表示するサンプルコマンドを示します。
次の例では、write_data アクセス権が group@ に付与されます。group@ のインデックスは 1 です。
# chmod A1=group@:read_data/write_data:allow file.1 # ls -v file.1 -rw-rw-r-- 1 root root 206695 Jul 20 13:43 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/write_data:allow 2:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
次の例では、test.dir ディレクトリでの read_data/execute アクセス権が、ユーザー Joe に追加されます。
# chmod A0+user:joe:read_data/execute:allow test.dir # ls -dv test.dir drwxr-xr-x+ 2 root root 2 Jul 20 14:23 test.dir 0:user:joe:list_directory/read_data/execute:allow 1: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 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
次の例では、ユーザー Joe のアクセス権が削除されます。
# chmod A0- test.dir # ls -dv test.dir drwxr-xr-x 2 root root 2 Jul 20 14:23 test.dir 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
ZFS ファイルでは、UNIX アクセス権ビットは ACL エントリに対応しますが、キャッシュに格納されます。ファイルのアクセス権ビットを変更すると、ファイルの ACL がそれに応じて更新されます。同様に、ファイルの ACL を変更すると、アクセス権ビットも変更されます。
アクセス権ビットの詳細は、chmod(1)を参照してください。
次の例は、ファイルまたはディレクトリの ACL とアクセス権ビットの間の関係、および一方のアクセス権が変更されると他方にどのような影響を与えるかを示しています。
使用例 45 ACL およびアクセス権ビット最初の例は、file.2 の次の ACL で始まります。このアクセス権ビットは 644 に設定されています。
# ls -v file.2
-rw-r--r-- 1 root root 2693 Jul 20 14:26 file.2アクセス権ビットは 644。
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
chmod コマンドは、everyone@ の ACL エントリを削除します。その結果、everyone の読み取りアクセス権ビットも削除され 640 に変更されます。
# chmod A2- file.2everyone@ のアクセス権が削除される # ls -v file.2 -rw-r----- 1 root root 2693 Jul 20 14:26 file.2アクセス権ビットは 640 になる。 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 everyone@ エントリが削除される。
次に、ACL は everyone@ の read_data/write_data アクセス権に置き換えられます。owner と group のアクセス権をオーバーライドする owner@ または group@ の ACL エントリはありません。そのため、アクセス権ビットは 666 になります。
# chmod A=everyone@:rw:allow file.2 # ls -v file.2 -rw-rw-rw- 1 root root 2440 Jul 20 14:28 file.3アクセス権ビットは 666 になる。 0:everyone@:read_data/write_data:allow その他すべての ACL エントリが削除される。
次に、ACL はユーザー Joe の読み取りアクセス権で置き換えられます。ただし、コマンドは簡易 ACL エントリを残しません。その結果、アクセス権ビットは 000 に設定され、file.2 への Joe のアクセスは拒否されます。ファイルは事実上、アクセス不能になります。
# chmod A=user:joe:r:allow file.2 # ls -v file.2 ----------+ 1 root root 2440 Jul 20 14:28 file.3アクセス権ビットは 000 になる。 0:user:joe:read_data:allow 簡易 ACL エントリは存在しない。
最後に、アクセス権ビットを設定すると、どのように ACL が更新されるかを示します。file.2 のビットは 655 に設定されます。デフォルトの簡易 ACL アクセス権が自動的に設定されます。
# chmod 655 file.2 # ls -v file.3 -rw-r-xr-x 1 root root 2440 Jul 20 14:28 file.3アクセス権ビットは 655 に設定される。 0:user:joe:read_data:allow 1:owner@:execute:deny655 ビットに基づき、ACL 実行アクセス権は拒否される。 2:owner@:read_data/write_data/append_data/read_xattr/write_xattrデフォルト ACL エントリが復元される。 /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 3:group@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow 4:everyone@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow使用例 46 ACL プロパティーと変更された ACL アクセス権
次の例は、aclmode と aclinherit の特定のプロパティー値が ACL 動作にどのような影響を与えるかを示しています。これらのプロパティーが設定されている場合は、ファイルまたはディレクトリの ACL アクセス権は、所有グループに一致して縮小または拡張されます。
aclmode プロパティーは mask に設定され、aclinherit プロパティーはプールの restricted に設定されていると仮定します。また、元のファイルとグループ所有権および ACL 権限は次のようであるとします。
# zfs set aclmode=mask system1/data # zfs set aclinherit=restricted system1/data # ls -lV file.1 -rwxrwx---+ 1 root root 206695 Aug 30 16:03 file.1 user:amy:r-----a-R-c---:-------:allow user:rory:r-----a-R-c---:-------:allow group:sysadmin:rw-p--aARWc---:-------:allow group:staff:rw-p--aARWc---:-------:allow owner@:rwxp--aARWcCos:-------:allow group@:rwxp--aARWc--s:-------:allow everyone@:------a-R-c--s:-------:allow
これら 2 つのプロパティーに設定されている値の意味を理解するには、ACL プロパティーを参照してください。
chown 操作は、file.1 の所有権を Amy とグループ Staff に変更します。
# chown amy:staff file.1
Amy は、file.1 のアクセス権ビットを 640 に変更します。以前に設定された ACL プロパティーのため、ACL 内のグループに対するアクセス権は所有する Staff のアクセス権を超えないように削減されます。
# su - amy $ chmod 640 file.1 $ ls -lV file.1 -rw-r-----+ 1 amy staff 206695 Aug 30 16:03 file.1 user:amy:r-----a-R-c---:-------:allow user:rory:r-----a-R-c---:-------:allow group:sysadmin:r-----a-R-c---:-------:allow group:staff:r-----a-R-c---:-------:allow owner@:rw-p--aARWcCos:-------:allow group@:r-----a-R-c--s:-------:allow everyone@:------a-R-c--s:-------:allow
Amy はアクセス権ビットを 770 に変更します。その結果、ACL 内のグループのアクセス権も所有グループ Staff のアクセス権に一致するように変更されます。
$ chmod 770 file.1 $ ls -lV file.1 -rwxrwx---+ 1 amy staff 206695 Aug 30 16:03 file.1 user:amy:r-----a-R-c---:-------:allow user:rory:r-----a-R-c---:-------:allow group:sysadmin:rw-p--aARWc---:-------:allow group:staff:rw-p--aARWc---:-------:allow owner@:rwxp--aARWcCos:-------:allow group@:rwxp--aARWc--s:-------:allow everyone@:------a-R-c--s:-------:allow