Solaris における File ACL (Access Control List)の設定方法

ACL とは

ここで言うACLとは、ファイルやディレクトリへのパーミッションの新しい拡張の事であり、
従来のパーミッションが、user,group,otherの種別しかなく、それぞれ1種類しか設定出来
なかったのに対して、新しい仕組みでは複数の user, group に対してそれぞれパーミッショ
ンを設定できるようになった。
ACLの設定
ACL の設定はそれほど難しくない。基本は、getfacl コマンドで設定を取得、setfaclコマ
ンドで設定を行う。ちなみに、setfacl を行うと、ls -l などでは拡張ビットが見える。

ACLを設定していないディレクトリの場合には、以下のようになっているが、
    # ls -ld test
    drwxr-xr-x   2 root     other        512 12月  3日  16:09 test

ACLを設定すると、以下のようにパーミッションの最後に + が付いている。
    # ls -ld test
    drwxr-xr-x+  2 root     other        512 12月  3日  16:09 test

ACL を見るには以下のように getfacl を用いる。
    # getfacl test

    # file: test
    # owner: root
    # group: other
    user::rwx
    user:kanayama:rwx               #effective:r-x
    group::r-x              #effective:r-x
    mask:r-x
    other:r-x

このディレクトリには、以下のように setfacl で user kanayama に rwx権限を与えた。

    # setfacl -m user:kanayama:rwx test

ここで、-m は modify(変更)の意味で、新たに設定し直す時には -s オプションを用いる。

さて、ここで問題なのは、ディレクトリに ACL を与える時と、ファイルに与える時では、
考え方が異なる点である。次の節でこの点について解説しよう。
 

ACLとデフォルト設定
ACLをディレクトリに設定する場合、二つの利用方法が考えられる。一つは、あるユーザー
あるいはグループに対して、r-x を許可する場合でこれは先のsetfaclでの権限付与で
問題ない。今ひとつは、ディレクトリ下に対する rwx 権限を与える場合である。

先の方法で、kanayama に rwx 権限を与えても、実は mask が r-x であるために、実際に
は r-x 権限となっているために、ディレクトリ内で kanayama はファイルを作成出来ない。
これは、

    user:kanayama:rwx               #effective:r-x

の右側の #effective:r-x となっていることからも分かる。これを変更するには、maskを
変更する必要がある。

    # setfacl -m mask:rwx test

これによって、

    # getfacl test
    ...
    user:kanayama:rwx               #effective:rwx
    group::r-x              #effective:r-x
    mask:rwx
    ...

となり、目出度く、ディレクトリ内で kanayama はファイルを作成できる。

    kanayama> mkdir test2
    kanayama> ls -la
    合計 6
    ...
    drwxr-xr-x   2 kanayama staff        512 12月  3日  16:20 test2

しかし、この場合には完全に kanayama の権限のみが与えられたディレクトリが出来てしまう。
(これはこれで必要な場合もある)

あるグループに対しては最初から r-x の権限を与えておきたいような場合には、それを作った
ユーザーがどうであろうと、その設定が引き継がれるような場合をここでは想定している(し
かも、このグループが複数であるような場合など)。

このために、ACL にはデフォルト設定というものが用意されているが、このデフォルト設定の
やり方が man には書かれておらず、また注意深く読まないと落とし穴にはまってしまう。

まず、デフォルト設定を行うには、最初に test ディレクトリに対して、user(u), group(g),
other(o), mask(m) について全てを設定しておく必要がある。

    # chmod o-rwx test
    # setfacl -m d:u::rwx,d:g::r-x,d:o:---,d:m:r-x  test
    # getfacl test

    # file: test
    # owner: root
    # group: other
    user::rwx
    user:kanayama:rwx               #effective:rwx
    group::r-x              #effective:r-x
    mask:rwx
    other:---
    default:user::rwx
    default:group::r-x
    default:mask:r-x
    default:other:---

次に、group teacher に r-x 権限を与える。

    # setfacl -m g:teacher:r-x test

この状態で、kanayama の権限で test/ 以下にディレクトリを作ると、

    kanayama> mkdir test/test3
    kanayama> getfacl test/test3

    # file: test/test3
    # owner: kanayama
    # group: staff
    user::rwx
    group::r-x              #effective:r-x
    group:teacher:r-x         #effective:r-x
    mask:r-x
    other:---
    default:user::rwx
    default:group::r-x
    default:group:teacher:r-x
    default:mask:r-x
    default:other:---

となり、kanayama の group staff以外に、staff teacherについても r-x 権限が与え
られている。更には、default 設定も引き継がれる。

但し、このディレクトリの owner はやはり kanayama なので、kanayama が setfacl
コマンドでこの ACL を変更する事は依然として可能である。