Tru64 UNIX のアクセス制御リスト (ACL) は,UNIX システムで以前から提供されていた任意アクセス制御 (DAC: Discretionary Access Control) に対する拡張です。この拡張はオプションです。従来の UNIX DAC は,従来の UNIX 許可ビットです。ACL は,UNIX 許可ビットの拡張です。許可ビットだけを持つファイルまたはディレクトリは,usr
,group
,および
other
の許可ビットに対応する 3 つの必須エントリ (つまり基本エントリ) だけからなる ACL を持つオブジェクトと考えられます。
ACL には次の 2 種類があります。
アクセス ACL は,ファイルまたはディレクトリと対応していて,プロセスがそのファイルやディレクトリにアクセスできるか判断するために使われます。
省略時の ACL は,ディレクトリと対応しています。省略時の ACL は,そのディレクトリに作成される新しいファイルおよびサブディレクトリに適用する ACL を決定するために使われます。詳細については,7.6 節を参照してください。
Tru64 UNIX での ACL の実装は,POSIX P1003.6 標準の Draft 13 と,Draft 15 の拡張の一部に基づいています。
ACL は,プロパティ・リストをサポートしているファイル・システムのファイルやディレクトリに適用することができます。プロパティ・リストをサポートしているファイル・システムは,次のとおりです。
UFS
AdvFS
NFS (Tru64 UNIX システム間)
ACL の処理がシステムで有効になっていなくても,ACL を適用することができます。ただし,ACL のアクセス・チェックおよび省略時の ACL 継承は実行されません。
ACL の使用および管理についての詳細は,『セキュリティ管理ガイド』を参照してください。ACL の使用およびプログラミングについての説明は,リファレンス・ページの
acl
(4)proplist
(4)7.2 ACL のデータ表現
ACL には,内部表現と外部表現があります。外部表現は,テキスト形式であり,ACL の入力および表示に使います。ライブラリ・ルーチンは,作業域内の ACL を内部表現で処理します。この ACL は,呼び出し元のルーチンでは間接的にしかアクセスできません。この内部表現は,ヘッダ・ファイル
acl.h
を使って処理することができます。
7.2.1 内部データ表現
ACL ルーチンは,作業域表現を処理します。この表現は,ACL および ACL エントリのデータ構造体のセットからなり,隠されています。ユーザのプログラムは,定義されたルーチンを介して,これらのデータ構造体を処理する必要があります。作業域のデータ構造体は変更される可能性があるため,このデータの信頼できるアクセス方法は,定義されたインタフェースを使用する方法だけです。
作業域表現は,メモリ内では連続していません。また,プログラムでは,ACL エントリおよび ACL 記述子のサイズを調べることはできません。作業域のデータ構造体には,内部ポインタ参照が含まれているため,プロセス間で引き渡したり,ファイルに格納すると意味がなくなります。プログラムでは,ACL の作業域表現を ACL の別の表現に変換することができます。
隠されているデータにアクセスするために最もよく使われる 2 つの型は,acl
(ACL 構造体) 型へのポインタ
acl_t
と,ACL エントリ構造体へのポインタ
acl_entry_t
です。
注意
以降の項の構造体は,変更される可能性がある,不透過な内部データ構造体です。これらの構造体にアクセスするときには,定義されている型と,提供されているライブラリ・ルーチンを必ず使用してください。
内部表現では,以下の基本型とデータ構造体を使います。
7.2.1.1 typedef struct acl *acl_t;
acl_t
型は,内部 (作業域) 形式の ACL を指定するために使います。
struct acl { int acl_magic; /* validation member */ int acl_num; /* number of actual acl entries */ int acl_alloc_size; /* size available in the acl */ acl_entry_t acl_current; /* pointer to current entry in */ acl_entry_t acl_first; /* pointer to ACL linked list */ attribute_t *attr_data; /* Pointer to the attr data */ };
7.2.1.2 typedef struct acl_entry *acl_entry_t;
acl_entry_t
型は,ACL 内のエントリを指定するために使います。
struct acl_entry{ acle_t *entry; void *head; struct acl_entry *next; struct acl_entry *prev; int acl_magic; int size; };
7.2.1.3 typedef uint_t acl_type_t;
サポートされている ACL タイプは,次のとおりです。
#define ACL_TYPE_ACC 0 #define ACL_TYPE_ACCESS ACL_TYPE_ACC /* The ACL is an access ACL. The property list entry name for an access ACL is "DEC_ACL_ACC" */ #define ACL_TYPE_DEF 1 #define ACL_TYPE_DEFAULT ACL_TYPE_DEF /* The ACL is a default access ACL. The property list entry name for a default access ACL is "DEC_ACL_ACC" */ #define ACL_TYPE_DEF_DIR 2 #define ACL_TYPE_DEFAULT_DIR ACL_TYPE_DEF_DIR /* The ACL is a default directory ACL. The property list entry name for a default directory ACL is "DEC_ACL_DEF_DIR" */
acl_type_t
は,ACL のタイプを指定するために使います。
7.2.1.4 typedef uint acl_tag_t;
acl_tag_t
型は,ACL エントリのタグ (タイプ) を指定するために使います。ACL_USER
または
ACL_GROUP
のタグ・タイプのを持つ ACL エントリには,対応するタグ修飾子もあります。タグ修飾子は,ユーザ ID または グループ ID です。サポートされる,ACL エントリのタグ・タイプは次のとおりです。
#define ACL_USER_OBJ 0 /* entry that equates to the owning user permission bits. */ #define ACL_GROUP_OBJ 1 /* entry that equates to the owning group permission bits. */ #define ACL_OTHER 2 #define ACL_OTHER_OBJ ACL_OTHER /* entry that equates to the other permission bits. */ #define ACL_USER 23 /* entry specifying permissions for a given user. */ #define ACL_GROUP 24 /* entry specifying permissions for a given group. */
7.2.1.5 typedef uint_t acl_perm_t;
許可ビット
acl_perm_t
の定義は,次のとおりです。
#define ACL_EXECUTE 0X001 #define ACL_WRITE 0X002 #define ACL_READ 0X004
7.2.1.6 typedef acl_perm_t *acl_permset_t;
acl_permset_t
型は,ACL エントリに割り当てられた許可ビットへのポインタとして使います。
7.2.1.7 連続内部表現 ACL
連続し,持続性のある,ACL のデータ型もあります。この表現は,複数のプロセス間で内部形式 ACL を持続させる必要があるときだけ使用します。
7.2.2 外部表現
人が読むことのできる ACL 外部表現は,改行文字で終了する,複数の行の並びで構成されています。POSIX ルーチンは,作業域表現とテキスト・パッケージとの間で変換を行う際に外部表現を使います。
外部表現については,『セキュリティ管理ガイド』を参照してください。表 7-1
に,各エントリの構造を示します。
表 7-1: ACL エントリの外部表現
エントリ・タイプ | acl_tag_t
の値 |
エントリ |
基本ユーザ | USER_OBJ |
user::許可 |
基本グループ | GROUP_OBJ |
group::許可 |
基本その他 | OTHER_OBJ |
other::許可 |
ユーザ | USER |
user:ユーザ名:許可 |
グループ | GROUP |
group:グループ名:許可 |
ACL ルーチンは,libpacl.a
ライブラリ内にあります。ACL ライブラリ・ルーチンは,POSIX P1003.6 標準の Draft 13 に基づいています。詳細については,それぞれのルーチンのリファレンス・ページを参照してください。
以下のルーチンは,ACL の取得,設定,および確認に使用します。
acl_valid
()指定された内部表現 ACL が,正しいフォーマットかどうかをチェックします。
acl_delete_def_fd
()ファイル記述子を使って,指定ディレクトリから省略時のアクセス ACL を削除します。
acl_delete_def_file
()指定ディレクトリから省略時のアクセス ACL を削除します。
acl_get_fd
()ファイル記述子を使って,特定のファイルまたはディレクトリに対応する,指定の ACL タイプの内部表現を取り出します。
acl_get_file
()特定のファイルまたはディレクトリに対応する,指定の ACL タイプの内部表現を取り出します。
acl_set_fd
()ファイル記述子を使って,特定のファイルまたはディレクトリ上の指定の ACL タイプに,指定の ACL 内部表現を設定します。
acl_set_file
()特定のファイルまたはディレクトリ上の指定の ACL タイプに,指定の ACL 内部表現を設定します。
以下のルーチンは,ACL エントリの取り出しや処理を行います。
acl_copy_entry
()ACL エントリを,指定されたメモリにコピーします。
acl_create_entry
()必要に応じてメモリを割り当てながら,指定された ACL に対して空の ACL エントリを作成します。
acl_delete_entry
()指定された ACL エントリを,ACL から削除します。
acl_first_entry
()現在の ACL エントリをリセットし,acl_get_entry
() の次の呼び出しで最初のエントリが戻されるようにします。
acl_get_entry
()指定された ACL の,次の ACL エントリへのポインタを戻します。
以下のルーチンは,ACL エントリ内のフィールドの取り出しや,処理を行います。
acl_add_perm
()ACL エントリに指定されている許可一式に,許可を 1 つ追加します。
acl_clear_perm
()指定された ACL エントリの許可をクリアします。
acl_delete_perm
()ACL エントリに指定されている許可一式から,許可を削除します。
acl_get_permset
()指定された ACL エントリから,指定されたメモリ位置に許可をコピーします。
acl_get_qualifier
()指定された ACL エントリに対応するタグ修飾子 (ID) へのポインタを戻します。
acl_get_tag_type
()指定された ACL エントリから,指定されたメモリ位置にタグ (タイプ) をコピーします。
acl_set_permset
()指定された ACL エントリ内の許可に,指定された許可を設定します。
acl_set_qualifier
()指定された ACL エントリのタグ修飾子 (ID) に,指定された UID または GID を設定します。
acl_set_tag_type
()指定された ACL エントリのタグ (タイプ) に,指定されたタイプを設定します。
以下のルーチンは,ACL 処理のための作業域を管理します。
acl_free
()指定された ACL に関連する作業域すべてを解放します。
acl_free_qualifier
()指定されたタグ修飾子に関連する作業域を解放します。
acl_free_text
()指定された外部表現 (テキスト) ACL に関連するバッファを解放します。
acl_init
()ACL の内部表現作業域を割り当て,初期化します。
acl_copy_ext
()作業域内部形式の ACL データを,連続し持続性のある ACL フォーマットにコピーします。
acl_copy_int
()連続し持続性のある ACL データを,作業域にコピーします。
acl_dup
()指定された ACL のコピーを作成します。コピーは,元のエントリとは独立したものになります。
acl_size
()指定された ACL のサイズを計算します。
以下のルーチンは,ACL の外部表現と内部表現の間の変換を行います。
acl_from_text
()指定された外部表現 (テキスト) ACL から,内部表現 ACL を作成します。
acl_to_text
()指定された内部表現 ACL から,外部表現 (テキスト) ACL を作成します。
ACL と,UNIX のアクセス許可の関係には,微妙な部分があります。ACL ルーチンと,UNIX DAC 属性を処理するシステム・コールの間の相互作用を理解していないと,意図していないアクセス許可を設定してしまうことがあります。
以降の項では,ACL を処理するプログラムの規則について説明しています。
7.4.1 オブジェクトの作成
ファイル・システム上で ACL が有効になっていて,サポートされている場合,関数
open
(),creat
(),および
mkdir
() は,ファイルまたはディレクトリを作成するときに ACL を継承させます。詳細は,ACL の継承の説明を参照してください。
ACL が継承されるとき,作成されたファイルのアクセス許可はユーザが指定したモードと継承された ACL から作成され,umask
は使用されません。このため,ユーザのプログラムでは,ファイルおよびディレクトリの作成時にモードを設定する必要があります。プログラムでは,umask
に依存してファイルおよびディレクトリを保護してはなりません。
プログラムで,あるファイルを別のファイルにコピーするときは,新しいファイルを作成して,所有者,グループ,およびモードを引き継がせるのが一般的です。コピー元ファイルに ACL がある場合,ユーザのプログラムでは,モードが引き継がれるすべてのケースで,ターゲット・ファイルに ACL を引き継がせる必要があります。
7.4.2 ACL の複製
アクセス許可を複製するプログラムは,ACL をそのまま引き継がせなければなりません。ファイルまたはディレクトリの任意保護は,所有者,グループ,およびアクセス許可では表現されなくなります。この保護には,アクセス許可のスーパセットである ACL が含まれています。ACL をコピーしないと,ファイルやディレクトリへの意図しないアクセスを許可してしまう可能性があります。
7.4.3 ACL の有効性
ACL は,次の POSIX ACL 規則に従って,正しく作成しなければなりません。
少なくとも 3 つの基本エントリが含まれていること。
ユーザ・エントリには,重複しない有効な修飾子があること。
グループ・エントリには,重複しない有効な修飾子があること。
ユーザおよびグループ識別子が有効であること。
acl_valid
() ルーチンを使って,ACL をチェックすることができます。
7.5 ACL の作成例
次のアクセス許可のとおりに,ファイルのアクセス ACL を設定したいとします。
user::rwx user:june:r-x user:sally:r-x group::rwx group:mktg:rwx other::r-x
次のコードは,表形式の ACL を使って ACL の作業域表現を作成し,その表現をファイルに適用します。次のコードを
acl_example.c
という名前のファイルに抽出した場合は,次のコマンドを使ってコンパイルします。
# cc -o acl_example -lpacl -lsecurity acl_example.c
#include <unistd.h> #include <sys/types.h> #include <prot.h> #include <errno.h> #include <sys/acl.h> struct entries { acl_tag_t tag_type; char *qualifier; acl_perm_t perms; } table[] = { /* An ACL must (at a minimum) have the three base */ /* entries that correspond to the permission bits */ { ACL_USER_OBJ, NULL, ACL_READ | ACL_WRITE | ACL_EXECUTE }, { ACL_USER, "june", ACL_READ | ACL_EXECUTE }, { ACL_USER, "sally", ACL_READ | ACL_EXECUTE }, { ACL_GROUP_OBJ, NULL, ACL_READ | ACL_WRITE | ACL_EXECUTE }, { ACL_GROUP, "mktg", ACL_READ | ACL_WRITE | ACL_EXECUTE }, { ACL_OTHER_OBJ, NULL, ACL_READ | ACL_EXECUTE }, }; #define TABLE_ENTRIES (sizeof(table)/sizeof(table[0])) main (argc, argv) int argc; char *argv[]; { acl_t acl_p; acl_entry_t entry_p; acl_entry_t check_p; int i, ret; uid_t uid; gid_t gid; /* Did the user enter a filename? */ if (argc != 2) { printf("Usage: %s filename\n",argv[0]); exit(1); } /* Check to see if ACLs are supported and enabled for filename */ ret = pathconf(argv[1], _PC_ACL_EXTENDED); /*[1]*/ if (ret == 1) { printf(" ACLs are enabled for file %s\n",argv[1]); } else if (ret == 0) { printf(" ACLs are supported for file %s,\n",argv[1]); printf(" but ACLs are not currently enabled on \n"); printf(" the system\n"); } else if ((ret == -1) && (errno == EINVAL)) { printf(" ACLs not supported on filesystem\n"); exit(1); } else { printf(" Error checking file ACL status for \n"); printf(" file %s, exiting...\n",argv[1]); perror("pathconf"); exit(1); } /* Allocate an ACL */ acl_p = acl_init(1024); /* [2] */ /* Walk through the table creating corresponding ACL entries */ for(i=0;i<TABLE_ENTRIES;i++) { /* Initialize the entry */ entry_p = acl_create_entry(&acl_p); /* [3] */ /* Set the permissions for the entry */ acl_set_permset(entry_p,&table[i].perms); /* [4] */ /* Set the user or group information for the entry */ switch(table[i].tag_type) { case ACL_USER: /* Get the uid from the user name */ uid=pw_nametoid(table[i].qualifier); /* [5] */ if (uid == (uid_t) -1) { printf(" No translation for user name %s\n", table[i].qualifier); printf(" Exiting...\n"); exit(1); } /* Specify this is a "USER:" entry */ acl_set_tag_type(entry_p,table[i].tag_type); /* [6] */ /* Set the uid (entry qualifier) */ acl_set_qualifier(entry_p,(void *)&uid); /* [7] */ break; case ACL_GROUP: /* Get the gid from the group name */ gid=gr_nametoid(table[i].qualifier); /* [8] */ if (gid == (gid_t) -1) { printf(" No translation for group name %s\n", table[i].qualifier); printf(" Exiting...\n"); exit(1); } /* Specify this is a "GROUP:" entry */ acl_set_tag_type(entry_p,table[i].tag_type); /* Set the gid (entry qualifier) */ acl_set_qualifier(entry_p,(void *) &gid); break; default: /* The three entries corresponding to the */ /* Permission bits don't have qualifiers */ acl_set_tag_type(entry_p,table[i].tag_type); acl_set_qualifier(entry_p,NULL); break; } } /* Is the created ACL valid? */ if (acl_valid(acl_p, &check_p) < 0) { /* [9] */ printf(" Not Valid ACL\n"); if (check_p) printf(" Duplicate entries\n"); printf(" Exiting...\n"); exit(1); } /* Set the ACL on the file */ if (acl_set_file(argv[1],ACL_TYPE_ACCESS, acl_p) < 0) perror("acl_set_file"); /* Free the storage allocated for the ACL */ acl_free(acl_p); }
pathconf
() の _PC_ACL_ENABLED 属性には,指定されたファイルの ACL 処理のステータスが戻されます。
[例に戻る]
これは,ACL の作業域表現の初期化呼び出しの使い方を示しています。割り当てられている領域に,完全な ACL のエントリすべてを収めるだけの大きさがなかった場合,acl_create_entry
() ルーチンは追加のメモリを割り当てます。
[例に戻る]
新しい ACL エントリはこの呼び出しで割り当てられます。この新しいエントリのタグ・タイプ,修飾子,許可は指定されていません。 [例に戻る]
acl_set_permset
() ルーチンは,ACL エントリの許可を設定します。
[例に戻る]
pw_nametoid
() ルーチンは,ユーザ名からユーザ ID への最適化されたマッピングを提供し,Base セキュリティまたは Enhanced セキュリティのうち使用可能なほうを扱います。pw_nametoid
() ルーチンの詳細は,リファレンス・ページの
pw_mapping
(3)
acl_set_tag_type
() 関数は,指定された ACL エントリのタイプを設定します。現在のタグ・タイプは次のとおりです: ACL_USER_OBJ (所有者許可ビット),ACL_GROUP_OBJ (グループ許可ビット),ACL_OTHER_OBJ (その他のユーザの許可ビット),ACL_USER (指定されたユーザに対する許可),ACL_GROUP (指定されたグループに対する許可)。
[例に戻る]
acl_set_qualifier
() 関数は,タグ・タイプ ACL_USER および ACL_GROUP の ID を設定します。これは,エントリが参照しているユーザまたはグループを指定するものです。その他のユーザのタグ・タイプには ID は必要ありません。
[例に戻る]
gr_grouptoid
() ルーチンは,グループ名からグループ ID への最適化されたマッピングを提供し,Base セキュリティまたは Enhanced セキュリティのうち使用可能なほうを扱います。詳細は,リファレンス・ページの
pw_mapping
(3)
acl_valid
() ルーチンは,足りないエントリや重複したエントリがないかどうかチェックします。
[例に戻る]
この節では,プログラムで省略時のアクセス ACL をディレクトリに設定する方法を示し,そのディレクトリ内にファイルおよびディレクトリが作成されるときにどうなるかを説明しています。省略時の ACL には,別のタイプがあり,省略時のディレクトリ ACL と呼ばれます。ディレクトリに省略時のディレクトリ ACL がある (省略時のアクセス ACL もあることもある) 場合,ACL は異なる方法で継承されます。ACL 継承規則の詳細については,『セキュリティ管理ガイド』を参照してください。
/usr/john/acl_dir
ディレクトリに,次のようなアクセス ACL と省略時のアクセス ACL があると仮定します。
% getacl /usr/john/acl_dir # file: /usr/john/acl_dir # owner: john # group: prog # user::rwx user:june:r-x user:fred:r-x group::rwx group:mktg:rwx other::r-x % getacl -d /usr/john/acl_dir # file: /usr/john/acl_dir # owner: john # group: prog # user::rwx user:june:r-x user:sally:r-x group::rwx group:mktg:rwx other::rwx
次のプログラムを使って,ディレクトリの省略時のアクセス ACL を更新してディレクトリの読み取り/書き込み許可をグループ・エントリから削除し,その後,このディレクトリに通常ファイルとディレクトリを作成できます。下記のコードを
acl_inheritance.c
というファイルに抽出した場合は,次のコマンドを使ってコンパイルできます。
% cc -o acl_inheritance -lpacl -lsecurity acl_inheritance.c
#include <unistd.h> #include <sys/types.h> #include <prot.h> #include <errno.h> #include <sys/acl.h> #define REGULAR_FILE "regular" #define DIRECTORY_FILE "dir" main (argc, argv) int argc; char *argv[]; { acl_permset_t acl_permset; gid_t *qualifier = NULL; acl_tag_t tag_type; acl_t acl; acl_entry_t acl_entry; gid_t my_gid; int ret; char pathname[PATH_MAX + 1]; int fd; /* Did the user enter a directory name and group name? */ if (argc != 3) { printf("Usage: %s directory group\n",argv[0]); exit(1); } /* Map the group name to a gid */ my_gid = gr_nametoid(argv[2]); if (my_gid == (gid_t) -1) { printf("No translation for group %s\n",argv[2]); exit(1); } /* Read the default ACL from the directory */ acl = acl_get_file(argv[1], ACL_TYPE_DEFAULT); if (!acl) { if (errno) { perror("acl_get_file"); } else { printf("No default ACL found on %s\n", argv[1]); } exit(1); } ret = acl_first_entry(acl); if (ret) { perror("acl_first_entry"); exit(1); } /* Scan the ACL looking for the entry */ while (acl_entry = acl_get_entry(acl)) { /* retrieve the entry type */ ret = acl_get_tag_type(acl_entry, &tag_type); if (ret) { perror("acl_get_tag_type"); exit(1); } if (tag_type != ACL_GROUP) continue; qualifier = (gid_t *)acl_get_qualifier(acl_entry); if (!qualifier) { perror("acl_get_qualifier"); exit(1); } /* Check for appropriate entry */ if (*qualifier != my_gid) continue; ret = acl_get_permset(acl_entry, &acl_permset); if (ret) { perror("acl_get_permset"); exit(1); } *acl_permset = *acl_permset & ~(ACL_READ | ACL_WRITE); ret = acl_set_permset(acl_entry, acl_permset); if (ret) { perror("acl_set_permset"); exit(1); } ret = acl_set_file(argv[1], ACL_TYPE_DEFAULT, acl); if (ret) { perror("acl_set_file"); exit(1); } break; } if (!acl_entry) { if (errno) { perror("acl_get_entry"); } else { printf("ACL entry for %s not found\n", argv[2]); } exit(1); } /* Create the regular file */ sprintf(pathname, "%s/%s", argv[1], REGULAR_FILE); fd = creat(pathname, 0644); if (fd == -1) { perror("creat"); exit(1); } close(fd); /* Create the directory */ sprintf(pathname, "%s/%s", argv[1], DIRECTORY_FILE); ret = mkdir(pathname, 0700); if (ret == -1) { perror("mkdir"); exit(1); } }
前述のサンプル・プログラムを実行すると,上に示した省略時の ACL の
mktg
グループから,読み取り/書き込み許可が削除されます。プログラムはその後,このディレクトリに通常ファイルとディレクトリを作成して,ACL が継承されたことを示します。サンプル・プログラムを実行するには,次のコマンドを入力します。
% ./acl_inheritance /usr/john/acl_dir mktg
上記のコードを実行すると,新たに作成されたファイルのアクセス ACL と,新たに作成されたディレクトリのアクセス ACL および省略時のアクセス ACL は,次のようになります。
% getacl /usr/john/acl_dir/regular # file: /usr/john/acl_dir/regular # owner: john # group: prog # user::rw- user:june:r-x user:sally:r-x group::r-- group:mktg:--x other::r--
所有しているユーザ,所有しているグループ,およびその他のアクセス許可には,省略時のアクセス ACL と,creat
() 呼び出しで指定されたモードの論理和が設定されます。ACL が継承されるときには,umask
は使用されません。その他のエントリは,親ディレクトリの省略時のアクセス ACL に基づいて設定されます。
% getacl /usr/john/acl_dir/dir # file: /usr/john/acl_dir/dir # owner: john # group: prog # user::rwx user:june:r-x user:sally:r-x group::--- group:mktg:--x other::---
省略時のアクセス ACL を持つディレクトリ内に作成されるサブディレクトリの継承規則は,ファイルの規則と同じです。これは,親ディレクトリに,省略時のアクセス ACL のほかに省略時のディレクトリ ACL がない場合のみ適用されます。
次のコマンド行は,省略時のアクセス ACL を表示します。
% getacl -d /usr/john/acl_dir/dir # file: /usr/john/acl_dir/dir # owner: john # group: prog # user::rwx user:june:r-x user:sally:r-x group::rwx group:mktg:--x other::rwx
省略時の ACL は,ディレクトリの親から継承されます。