従来の UNIX ファイル保護機能は、所有者、グループ、その他という 3 つのユーザークラスに読み取り権、書き込み権、実行権を提供します。ACL を使用すると、所有者、所有者のグループ、その他、特定のユーザーおよびグループのファイルアクセス権を定義でき、またこれらのカテゴリごとにデフォルトのアクセス権を定義できるため、ファイルのセキュリティが強化されます。
たとえば、グループ内のすべてのユーザーがファイルを読み取れるようにしたい場合は、単にそのファイルにグループの読み取り権を設定します。その場合に、そのグループ内の 1 人のユーザーだけに書き込み権を与えたいとします。標準の UNIX ではファイルセキュリティをこのように設定することはできませんが、ACL では可能です。
ACL エントリはファイルの ACL を定義する手段であり、setfacl(1) コマンドにより設定します。ACL エントリは、次のようにコロンで区切ったフィールドからなっています。
entry_type:[uid|gid]:perms |
entry_type |
ファイルのアクセス権を設定する ACL エントリのタイプ。たとえば、entry_type は user (ファイルの所有者) または mask (ACL マスク) に設定できる |
uid |
ユーザー名または識別番号 |
gid |
グループ名または識別番号 |
perms |
entry_type に設定するアクセス権を表す。perms は、記号文字 rwx または番号 (chmod コマンドに使用するのと同じアクセス権番号) で指定できる |
次の例に、ユーザー nathan の読み取り権および書き取り権を設定する ACL エントリを示します。
user:nathan:rw- |
ACL などの UFS ファイルシステム属性は UFS ファイルシステムだけでサポートされます。つまり、/tmp ディレクトリ (通常は、TMPFS ファイルシステムとしてマウントされている) で ACL エントリを持つファイルを復元またはコピーすると、その ACL エントリは失われます。UFS ファイルの一時的な格納には、/var/tmp ディレクトリを使用してください。
表 17-8 に、有効な ACL エントリを示します。最初の 3 つの ACL エントリは、基本的な UNIX のファイル保護機能を提供します。
表 17-8 ファイルの ACL エントリ
表 17-8 に示した ACL エントリの他に、ディレクトリにはデフォルトの ACL エントリも設定できます。デフォルトの ACL エントリを持つディレクトリ内で作成されたファイルまたはディレクトリは、デフォルトの ACL エントリと同じ ACL エントリを持つことになります。表 17-9 に、ディレクトリのデフォルト ACL エントリを示します。
ディレクトリ上で特定のユーザーとグループのデフォルトの ACL エントリを初めて設定するときは、ファイル所有者、ファイルグループ、その他、および ACL マスクにデフォルトの ACL エントリも設定しなければなりません (表 17-9 の最初の 4 つのデフォルト ACL エントリでは、この設定は必須です)。
表 17-9 ディレクトリのデフォルト ACL エントリ
setfacl コマンドを使用してファイルの ACL エントリを設定します。
$ setfacl -s user::perms,group::perms,other:perms,mask:perms,acl_entry_list filename ... |
-s |
ファイルに対して ACL を設定する。すでに ACL が設定されている場合、新しい ACL に置き換える。このオプションには、少なくともファイル所有者、ファイルグループ、およびその他のエントリを指定する必要がある |
user::perms |
ファイル所有者のアクセス権を指定する |
group::perms |
ファイルグループのアクセス権を指定する |
other:perms |
ファイル所有者またはファイルグループのメンバー以外のユーザーのアクセス権を指定する |
mask:perms |
ACL マスクのアクセス権。マスクは、ユーザー (所有者以外) とグループに許される最大アクセス権を示す |
acl_entry_list |
ファイルまたはディレクトリ上で特定のユーザーとグループに関して設定する 1 つ以上の ACL エントリのリスト。ディレクトリ上でデフォルトの ACL エントリを設定することもできる。有効な ACL エントリについては、表 17-8 と表 17-9 を参照 |
filename |
ACL を設定する 1 つまたは複数のファイルまたはディレクトリを指定する |
ファイルに ACL が設定されたかどうかを確認する方法については、「ファイルに ACL が設定されているかどうかをチェックする方法」を参照してください。ファイルにどの ACL エントリが設定されているかを確認するには、getfacl コマンドを使用します。
$ getfacl filename |
すでにファイル上に ACL が存在する場合、-s オプションを指定すると、ACL 全体が新しい ACL に置き換えられます。
次の例は、ch1.doc ファイルで、ファイルの所有者に読み取り/書き込み権、ファイルグループに読み取り権のみ、その他のユーザーにアクセス権「なし」を設定します。また、ユーザー george には、このファイルの読み取り権/書き込み権が与えられ、ACL マスクに読み取り権/書き込み権が設定されます。これは、ユーザーやグループは実行権を持たないことを意味します。
$ setfacl -s user::rw-,group::r--,other:---,mask:rw-,user:george:rw- ch1.doc $ ls -l total 124 -rw-r-----+ 1 nathan sysadmin 34816 Nov 11 14:16 ch1.doc -rw-r--r-- 1 nathan sysadmin 20167 Nov 11 14:16 ch2.doc -rw-r--r-- 1 nathan sysadmin 8192 Nov 11 14:16 notes $ getfacl ch1.doc # file: ch1.doc # owner: nathan # group: sysadmin user::rw- user:george:rw- #effective:rw- group::r-- #effective:r-- mask:rw- other:--- |
次の例は、ch2.doc ファイルで、ファイル所有者に読み取り権/書き込み権/実行権、ファイルグループに読み取り権のみ、その他のユーザーにアクセス権「なし」を設定し、ACL マスクに読み取り権を設定します。さらに、ユーザー george には読み取り権/書き込み権が与えられます。ただし、ACL マスクの設定により、george の実効アクセス権は読み取りだけです。
$ setfacl -s u::7,g::4,o:0,m:4,u:george:7 ch2.doc $ getfacl ch2.doc # file: ch2.doc # owner: nathan # group: sysadmin user::rwx user:george:rwx #effective:r-- group::r-- #effective:r-- mask:r-- other:--- |
getfacl の出力先を変更することにより、ファイルの ACL を他のファイルへコピーします。
$ getfacl filename1 | setfacl -f - filename2 |
filename1 |
ACL のコピー元ファイルを指定する |
filename2 |
ACL のコピー先ファイルを指定する |
次の例は、ch2.doc の ACL を ch3.doc へコピーします。
$ getfacl ch2.doc | setfacl -f - ch3.doc |
ls コマンドを使用して、ファイルに ACL が設定されているかどうかをチェックします。
$ ls -l filename |
filename |
チェックするファイルまたはディレクトリを指定する |
モードフィールドの右側の (+) は、ファイルに ACL が設定されていることを示します。
さらにユーザーやグループの ACL エントリをファイルに追加しないかぎり、ファイルの ACL は「弱い」とみなされ、「+」は表示されません。
次の例は、モードフィールドの右側に + が付いているため、ch1.doc に ACL が設定されています。
$ ls -l ch1.doc -rwxr-----+ 1 nathan sysadmin 167 Nov 11 11:13 ch1.doc |
setfacl コマンドを使用してファイルの ACL エントリを変更します。
$ setfacl -m acl_entry_list filename1 [filename2 ...] |
-m |
既存の ACL エントリを変更する |
acl_entry_list |
ファイルまたはディレクトリで変更する 1 つ以上の ACL エントリのリスト。ディレクトリのデフォルト ACL エントリを変更することもできる。有効な ACL エントリについては、表 17-8 と表 17-9 を参照を指定する |
filename ... |
1 つまたは複数のファイルまたはディレクトリを指定する |
ファイルの ACL エントリが追加または変更されたことを確認するには、getfacl コマンドを使用します。
$ getfacl filename |
次の例は、ch3.doc ファイルのユーザー george のアクセス権を読み取り権/書き込み権に変更します。
$ setfacl -m user:george:6 ch3.doc $ getfacl ch3.doc # file: ch3.doc # owner: nathan # group: staff user::rw- user::george:rw- #effective:r-- group::r- #effective:r-- mask:r-- other:r- |
次の例は、book ディレクトリに関して、グループ staff のデフォルトのアクセス権を読み取りに変更し、デフォルトの ACL マスクを読み取り権/書き込み権に変更します。
$ setfacl -m default:group:staff:4,default:mask:6 book |
setfacl コマンドを使用してファイルから ACL エントリを削除します。
$ setfacl -d acl_entry_list filename1 ... |
-d |
指定した ACL エントリを削除する |
acl_entry_list |
ファイルまたはディレクトリから (アクセス権を指定せずに) 削除する ACL エントリのリスト。特定のユーザーとグループの ACL エントリとデフォルトの ACL エントリ以外は削除できない。有効な ACL エントリについては、表 17-8 と表 17-9 を参照 |
filename ... |
1 つまたは複数のファイルまたはディレクトリを指定する |
setfacl -s コマンドを使用すると、ファイルからすべての ACL エントリを削除して、新たに指定した ACL エントリに置き換えることができます。
ファイルから ACL エントリが削除されたことを確認するには、getfacl コマンドを使用します。
$ getfacl filename |
次の例は、ユーザー george を ch4.doc ファイルから削除します。
$ setfacl -d user:george ch4.doc |
getfacl コマンドを使用してファイルの ACL エントリを表示します。
$ getfacl [-a | -d] filename1 ... |
-a |
指定したファイルまたはディレクトリのファイル名、ファイル所有者、ファイルグループ、ACL エントリを表示する |
-d |
指定したディレクトリのファイル名、ファイル所有者、ファイルグループ、デフォルトの ACL エントリを表示する |
filename ... |
1 つまたは複数のファイルまたはディレクトリを指定する |
コマンド行で複数のファイル名を指定すると、各 ACL エントリはブランク行で区切られます。
次の例は、ch1.doc ファイルのすべての ACL エントリを示します。ユーザーエントリとグループエントリの隣の #effective: は、ACL マスクによって変更された後のアクセス権の設定を示します。
$ getfacl ch1.doc # file: ch1.doc # owner: nathan # group: sysadmin user::rw- user:george:r-- #effective:r-- group::rw- #effective:rw- mask:rw- other:--- |
次の例は、book ディレクトリのデフォルトの ACL エントリを示します。
$ getfacl -d book # file: book # owner: nathan # group: sysadmin user::rwx user:george:r-x #effective:r-x group::rwx #effective:rwx mask:rwx other:--- default:user::rw- default:user:george:r-- default:group::rw- default:mask:rw- default:other:--- |