今回は,アクセス制御リスト(以下,ACL)が子プロセスに継承される仕組みと,ACLをより簡単に設定できるACL_DISCOVERY機能について解説する。

親プロセスのアクセス権限を子プロセスが引き継ぐ条件

 プログラムの動作では,プロセス(親プロセス)が異なるプロセス(子プロセス)を生成して処理する場合がある。LIDSは,こうしたプロセスのアクセス権限を管理するために,ACLの継承機能を備える。継承機能の必要性を知るために,例として前回までに構築したシステム上で次のスクリプトを動作させた場合を考えてみよう。

●スクリプト /tmp/testwrite.sh

#!/bin/sh
cp /tmp/tmpfile /var/tmp

 システムでは,/varがREADONLYに設定されているので,その子ディレクトリの/var/tmpもREADONLYになる。そこで,スクリプトが/var/tmpに書き込みできるように権限を与えたとする。

# /sbin/lidsadm -S -- -LIDS
# /sbin/lidsconf -A -s /tmp/tempwrite.sh -o /var/tmp -j WRITE

/tmp/testwrite.shが正常に動作するか試してみよう。

# lidsadm -S -- +LIDS □
# /tmp/testwrite.sh □
cp: cannot create regular file `/var/tmp/tmpfile': Operation not permitted

すると,このようなエラーが表示されてしまう。/var/log/messagesを見てみると

Jan 28 01:00:28 nemesis kernel: LIDS: cp (dev 3:68 inode 289112) pid 1301 ppid 1300 uid/gid (0/0) on (pts) : Attempt to open /var/tmp/tmpfile for writing,flag=32834

と記述されている。このログからスクリプト内にあるcpコマンドが呼び出された時に,/var/tmp/tmpfileに書き込めない(書き込みの許可が与えられていない)ことが分かる。

 LIDSでは,親プログラムに対してアクセス権限を与えた際に,子プログラムがどのようなアクセス権限を持っているかは,次のように決定される。

(1)親プロセスと子プロセスが同じプログラムの場合は,全く同じアクセス権限になる。

(2)親プロセスと子プロセスが異なるプログラムの場合は,子プロセスは親のアクセス権を引き継がない。

 ただし,(2)の場合においても,起動スクリプトなどのように,あるプログラムから異なるプログラムを呼び出した際に,そちらのプログラムに対しても同じアクセス権を引き継がせたい場合がある。そのために,ACLの継承機能が用意されているわけだ。

継承の設定方法と継承レベル

 続いて,先ほどのACLをいったん削除し,代わりに新たなACLを設定しよう。

# lidsconf -D -s /tmp/tempwrite.sh -o /var/tmp
# lidsconf -A -s /tmp/tempwrite.sh -o /var/tmp -i 1 -j WRITE

新たなACLの設定で用いた「-i」は「inherit(継承)」を表し,上の例(「-i 1」)では「継承レベル1」となる。継承レベルとは,親プロセスから何世代目までのプロセスがACLを継承できるかを表す。レベル1では,子プロセス(第一世代)までがアクセス権限を継承できるが,孫プロセス(第二世代)にはアクセス権限は継承されない。lidsconf -Lの出力を見てみると

/tmp/testwrite.sh WRITE: 1 0000-0000 /var/tmp 0

となり,「inherit」の項目に1が設定されている。この状態で,設定ファイルを再度読み込んでから,スクリプトを実行してみる。

# lidsconf -U
# lidsadm -S -- +RELOAD_CONF
# lidsadm -S -- +LIDS
# /tmp/testwrite.sh

/var/tmp を見てみると

# ls /var/tmp
tmpfile

というように,tmpfileがきちんとコピーされていることが分かる。