Kimura Fuyuki
fuyuk****@nigre*****
2003年 11月 3日 (月) 12:13:58 JST
たぶんユーザーは私しかいないと思いますが、せっかく書いたのでさらしてお きます。 http://www.nigredo.org/fuyuki/Gauche-file-acl-0.0.tar.gz POSIX.1eのACL機能を利用するためのモジュールです。POSIX.1e ACLが有効に なっていることが前提になります。FreeBSD 5.xには最初から組み込まれてい るので、 http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/fs-acl.html を見ながらやれば、そう苦労せずに使えるようになるはずです。Linuxの場合 は、libacl.soというファイルが存在するなら、POSIX.1e ACLが有効になって いる可能性が高いです。もしない場合は、 http://acl.bestbits.at/ からパッチなどをもらってくる必要があるかもしれません。 * POSIX.1eというのは初耳の人も多いと思うので、まずはそこから解説します。 ヌルい解説などいらん仕様書よこせという方はこちらへどうぞ。 http://wt.xpilot.org/publications/posix.1e/ で、解説。UNIXの世界では 「9ビットのパーミッションだけじゃもたないよね」 とか 「無敵のroot 様に権限が集中してるのってまずいよね」 というのは石器時代から言われてきたと思うのですが、POSIX.1eはそのへんを 改善するための規格です。それはいいのですが、困ったことに、この規格は withdrawnになってしまいました。 「ならほっとけばいいやん」 という向きもあろうかと思いますが、そうはいきません。現状に問題があるの はたしかだし、ほかに代替になるような規格もないからです。 というわけで、POSIX.1eの最終ドラフトをベースにしてあちこちで実装がすす められています。全体的な感触をつかむには、 http://www.trustedbsd.org/trustedbsd-bsdcon-2000.ps.gz を見るといいでしょう。 * POSIX.1e ACLは、現状の9ビットのパーミッションの制限を打破するための規 格です。ある程度UNIX歴のある人なら、一度はパーミッションの表現力の貧し さに泣かされたことがあるはずですが、ACL機能があればそういった問題はだ いたい解決するはずです。 ACLはACLエントリの集合体です。ACLエントリというのは、従来のファイルモー ドでいうところのrwx(3ビット)をあらわすものと思ってください。 ACL機能は従来のパーミッションと整合性を保つように設計されているので、 特にACLを設定していないファイルからACLを読み込むと、単に9ビットのパー ミッションがそのまま取れてくる感じになります。 (number->string (ref (sys-stat "test") 'perm) 8) => "644" (define facl (get-file-acl "test")) (coerce-to <list> facl) => (#,(<file-acl-entry> other #f #t #f #f) #,(<file-acl-entry> group #f #t #f #f) #,(<file-acl-entry> user #f #t #t #f)) q r w x rwxはいいとして"q"のところがわからないと思いますが、これはqualifierで、 実質的にはuidかgidのいずれかです。ここに値を設定したACLエントリを足し てやると、特定のユーザーやグループに対してパーミッションを開けてやるこ とができます(ファイルのowner/groupとは別に)。 たとえば、グループ"staff"に読み書き権限を与えるには、次のようにしてACL エントリを追加してやります。 (file-acl-add! facl 'group (sys-group-name->gid "staff") 'read 'write) (set-file-acl! "test" facl) これで、コマンドラインから $ setfacl -m g:staff:rw test としたのと同じ結果が得られるはずです。 * 制限。このモジュールは基本的にPOSIX.1e ACLライブラリの理解と検証のため に書いたので、何か変なことをやっているかもしれません。 で、現時点での感想としては、 - けっこうよく考えて設計されているらしい - が、やはりPOSIXというか、妙に機能が半端だったり、抜けがあったりする といったところです。 たとえば、ACLエントリからパーミッションを読み取るためのAPIがありません。 「ありません」ではすまないので、実際には実装のレベルでなんとかしていま す。が、コミュニティ間の連係がうまくいっているようなので、それほどAPI がバラけることはないでしょう。 -- 木村 冬樹