Solaris のシステム管理 (セキュリティサービス)

アクセス制御リスト (ACL) の使用

従来の UNIX ファイル保護機能は、所有者、グループ、その他のユーザーという 3 つのユーザークラスに読み取り権、書き込み権、実行権を提供します。 ACL を使用すると、所有者、所有者のグループ、その他のユーザー、特定のユーザーおよびグループのファイルアクセス権を定義でき、これらのカテゴリごとにデフォルトのアクセス権を定義できるため、ファイルのセキュリティを強化できます。

たとえば、グループ内のすべてのユーザーがファイルを読み取れるようにしたい場合は、単にそのファイルにグループの読み取り権を設定します。その場合に、そのグループ内の 1 人のユーザーだけに書き込み権を与えたいとします。標準の UNIX ではファイルセキュリティをこのように設定することはできませんが、ACL では可能です。

ACL エントリはファイルの ACL を定義する手段であり、setfacl コマンドにより設定します。ACL エントリは、次のようにコロンで区切ったフィールドで構成されます。


entry-type:[uid|gid]:perms

entry-type

ファイルのアクセス権を設定する ACL エントリの種類。たとえば、entry-typeuser (ファイルの所有者) または mask (ACL マスク) に設定できる。ACL エントリの一覧については、表 16–8表 16–9 を参照

uid

ユーザー名またはユーザー ID (UID)  

gid

グループ名またはグループ ID (GID)  

perms

entry-type に設定するアクセス権を表す。perms は、記号文字 rwx または番号 (chmod コマンドに使用するのと同じアクセス権番号) で指定できる

次の例に、ユーザー nathan の読み取り権および書き込み権を設定する ACL エントリを示します。


user:nathan:rw-

注意 – 注意 –

ACL などの UFS ファイルシステム属性は UFS ファイルシステムだけでサポートされます。そのため、/tmp ディレクトリ (通常は、TMPFS ファイルシステムとしてマウントされている) で ACL エントリを持つファイルを復元またはコピーすると、その ACL エントリは失われます。UFS ファイルを一時的に格納するには、/var/tmp ディレクトリを使用してください。


ファイルの ACL エントリ

次の表は、ファイルに ACL を設定するときに使用する有効な ACL エントリの一覧です。最初の 3 つの ACL エントリは、基本的な UNIX のファイル保護機能を提供します。

表 16–8 ファイルの ACL エントリ

ACL エントリ 

説明 

u[ser]::perms

所有者のアクセス権 

g[roup]::perms

グループのアクセス権 

o[ther]:perms

所有者やグループのメンバー以外のユーザーのアクセス権 

m[ask]:perms

ACL マスク。マスクエントリは、ユーザー (所有者以外) とグループに許可される最大アクセス権を示す。マスクは、すべてのユーザーとグループのアクセス権を即時に変更する手段である。 

たとえば、mask:r-- マスクエントリは、ユーザーとグループが書き込み権および実行権を持っていても、読み取り権しか使用できないことを示す

u[ser]:uid:perms

特定のユーザーのアクセス権。uid には、ユーザー名または UID の数値を指定できる

g[roup]:gid:perms

特定のグループのアクセス権。gid には、グループ名または GID の数値を指定できる

ディレクトリの ACL エントリ

表 16–8 に示した ACL エントリの他に、ディレクトリにはデフォルトの ACL エントリも設定できます。デフォルトの ACL エントリを持つディレクトリ内で作成されたファイルまたはディレクトリは、デフォルトの ACL エントリと同じ ACL エントリを持つことになります。表 16–9 は、ディレクトリに使用するデフォルトの ACL エントリの一覧です。

ディレクトリ上の特定のユーザーおよびグループに対してデフォルトの ACL エントリを初めて設定するときは、所有者、グループ、その他のユーザー、および ACL マスクにもデフォルトの ACL エントリを設定する必要があります。これらのエントリは、必ず設定しなければなりません。具体的には、次の表のデフォルト ACL エントリのうち、最初の 4 つを設定する必要があります。

表 16–9 ディレクトリのデフォルト ACL エントリ

デフォルトの ACL エントリ 

説明 

d[efault]:u[ser]::perms

所有者のデフォルトアクセス権 

d[efault]:g[roup]::perms

グループのデフォルトアクセス権 

d[efault]:o[ther]:perms

所有者やグループのメンバー以外のユーザーのデフォルトアクセス権 

d[efault]:m[ask]:perms

デフォルトの ACL マスク 

d[efault]:u[ser]:uid:perms

特定のユーザーのデフォルトアクセス権。uid には、ユーザー名または UID の数値を指定できる

d[efault]:g[roup]:gid:perms

特定のグループのデフォルトアクセス権。gid には、グループ名または GID の数値を指定できる

ファイルの ACL を設定する方法

  1. 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 エントリについては、表 16–8表 16–9 を参照

    filename ...

    ACL に設定する 1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 


    注意 – 注意 –

    すでにファイル上に ACL が存在する場合、-s オプションを指定すると、ACL 全体が新しい ACL に置き換えられます。


    詳細は、setfacl(1) のマニュアルページを参照してください。

  2. ACL (ACL エントリ) がファイルに設定されたことを確認します。


    $ getfacl filename
    

    詳細は、ファイルに 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:---

ACL をコピーする方法

getfacl の出力先を変更することにより、ファイルの ACL を他のファイルへコピーします。


$ getfacl filename1 | setfacl -f - filename2

filename1

ACL のコピー元ファイルを指定する 

filename2

ACL のコピー先ファイルを指定する 

例 — ACL をコピーする

次の例では、ch2.doc の ACL が ch3.doc にコピーされます。


$ getfacl ch2.doc | setfacl -f - ch3.doc

ファイルに ACL が設定されているかどうかを検査する方法

ls コマンドを使用して、ファイルに ACL が設定されているかどうかを検査します。


# ls -l filename

filename には、ファイルまたはディレクトリを指定します。

出力のモードフィールドの右側にプラス記号 (+) が表示されているときは、そのファイルに ACL が設定されています。


注 –

ユーザーやグループの ACL エントリをファイルに追加しない場合、ファイルの ACL は「弱い」とみなされ、「+」は表示されません。


例 — ファイルに ACL が設定されているかどうかを検査する

次の例の ch1.doc ファイルでは、モードフィールドの右側にプラス記号 (+) が表示されているため、ACL が設定されています。


$ ls -l ch1.doc
-rwxr-----+  1 nathan   sysadmin      167 Nov 11 11:13 ch1.doc

ファイルの ACL エントリを変更する方法

  1. setfacl コマンドを使用してファイルの ACL エントリを変更します。


    $ setfacl -m acl-entry-list filename ... 
    
    -m

    既存の ACL エントリを変更する 

    acl-entry-list

    ファイルまたはディレクトリで変更する 1 つまたは複数の ACL エントリのリスト。ディレクトリのデフォルト ACL エントリを変更することもできる。有効な ACL エントリについては、表 16–8表 16–9 を参照

    filename ...

    1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

  2. ファイルの ACL エントリが変更されたことを確認するには、getfacl コマンドを使用します。


    $ getfacl filename
    

例 — ファイルの ACL エントリを変更する

次の例では、ユーザー 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

ファイルから ACL エントリを削除する方法

  1. setfacl コマンドを使用してファイルから ACL エントリを削除します。


    $ setfacl -d acl-entry-list filename ... 
    

    -d

    指定した ACL エントリを削除する 

    acl-entry-list

    ファイルまたはディレクトリから (アクセス権を指定せずに) 削除する ACL エントリのリスト。特定のユーザーとグループの ACL エントリとデフォルトの ACL エントリ以外は削除できない。有効な ACL エントリについては、表 16–8表 16–9 を参照

    filename ...

    1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

    setfacl -s を使用してファイルのすべての ACL エントリを削除してから、指定した新しい ACL エントリで置き換えることもできます。

  2. ファイルから ACL エントリが削除されたことを確認するには、getfacl コマンドを使用します。


    $ getfacl filename
    

例 — ファイルから ACL エントリを削除する

次の例では、ch4.doc ファイルからユーザー george を削除します。


$ setfacl -d user:george ch4.doc

ファイルの ACL エントリを表示する方法

getfacl コマンドを使用してファイルの ACL エントリを表示します。


$ getfacl [-a | -d] filename ...

-a

指定したファイルまたはディレクトリのファイル名、所有者、グループ、ACL エントリを表示する 

-d

指定したディレクトリのファイル名、所有者、グループ、デフォルトの ACL エントリを表示する 

filename ...

1 つまたは複数のファイルまたはディレクトリを空白で区切って指定する 

複数のファイル名をコマンド行に指定した場合は、各 ACL エントリの間に空白行が表示されます。

例 — ファイルの 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:---