[Tomoyo-dev 874] ポリシーファイルを分割して管理する方法について

Back to archive index

Tetsuo Handa from-****@I-lov*****
2008年 8月 26日 (火) 21:54:47 JST


 熊猫です。

 出来合いのポリシーをパッケージとして配布するのを容易にするために、
/etc/ccs/ 以下のポリシーファイルを「パッケージによりインストールされたもの」と
「ユーザの作業により作成されたもの」の2つに分割してみてはどうかという実験を
しています。

 現在のポリシーファイルは、

/etc/ccs/system_policy.conf
/etc/ccs/exception_policy.conf
/etc/ccs/domain_policy.conf
/etc/ccs/profile.conf
/etc/ccs/manager.conf

の5つですが、このままだと rpm や deb を使ってポリシーをインストール/
アンインストールする際に、個々のアプリケーションの部分だけを挿入/除去できない
という問題があります。そのため、これらのポリシーファイルを

パッケージ用            ユーザ操作用
/etc/ccs/base_system_policy.conf    /etc/ccs/system_policy.conf
/etc/ccs/base_exception_policy.conf /etc/ccs/exception_policy.conf
/etc/ccs/base_domain_policy.conf    /etc/ccs/domain_policy.conf
/etc/ccs/base_profile.conf          /etc/ccs/profile.conf
/etc/ccs/base_manager.conf          /etc/ccs/manager.conf

のように分割してみました。個々のアプリケーション用のポリシーを
例えば /etc/ccs/conf.d/ のようなディレクトリ以下に配置し、
rpm や deb でインストール/アンインストールした際には

  cat /etc/ccs/conf.d/system_*.conf > /etc/ccs/base_system_policy.conf
  cat /etc/ccs/conf.d/exception_*.conf > /etc/ccs/base_exception_policy.conf
  cat /etc/ccs/conf.d/domain_*.conf > /etc/ccs/base_domain_policy.conf
  cat /etc/ccs/conf.d/profile_*.conf > /etc/ccs/base_profile.conf
  cat /etc/ccs/conf.d/manager_*.conf > /etc/ccs/base_manager.conf

という操作により更新します。
そして、 ccs-tools パッケージは /etc/ccs/base_\*.conf を読み取り専用として
利用し、 /proc/ccs/\* との差分だけを /etc/ccs/\*.conf\-base_\*.conf に
読み書き用として保存します。

/sbin/ccs-init や ccs-loadpolicy や ccs-editpolicy などは
/etc/ccs/system_policy.conf の前に /etc/ccs/base_system_policy.conf を、
/etc/ccs/exception_policy.conf の前に /etc/ccs/base_exception_policy.conf を、
/etc/ccs/domain_policy.conf の前に /etc/ccs/base_domain_policy.conf を、
/etc/ccs/profile.conf の前に /etc/ccs/base_profile.conf を、
/etc/ccs/manager.conf の前に /etc/ccs/base_manager.conf を
読み込むようにします。また、 ccs-savepolicy などは
/proc/ccs/system_policy から /etc/ccs/base_system_policy.conf を
引いたものを /etc/ccs/system_policy.conf に、
/proc/ccs/exception_policy から /etc/ccs/base_exception_policy.conf を
引いたものを /etc/ccs/exception_policy.conf に、
/proc/ccs/domain_policy から /etc/ccs/base_domain_policy.conf を
引いたものを /etc/ccs/domain_policy.conf に、
/proc/ccs/profile から /etc/ccs/base_profile.conf を引いたものを
/etc/ccs/profile.conf に、
/proc/ccs/manager から /etc/ccs/base_manager.conf を引いたものを
/etc/ccs/manager.conf に保存するようにします。

例えば、 /proc/ccs/domain_policy の内容が

<kernel>
allow_execute /sbin/init
allow_execute /sbin/modprobe
use_profile 1

となっており、 /etc/ccs/base_domain_policy.conf の内容が

<kernel>
allow_execute /sbin/init
allow_execute /sbin/hotplug
use_profile 1

<kernel> /sbin/init
use_profile 1

となっていた場合、 ccs-savepolicy は /etc/ccs/domain_policy.conf を

delete <kernel> /sbin/init

<kernel>
delete allow_execute /sbin/hotplug
allow_execute /sbin/modprobe

という内容で保存するようになります。
この状態で ccs-init や ccs-editpolicy や ccs-loadpolicy が
/etc/ccs/base_domain_policy.conf → /etc/ccs/domain_policy.conf の順に
読み込むことで、 /proc/ccs/domain_policy の内容を復元できます。

ちょうど、 LDAP の LDIF 形式で変更点(差分)だけを記述して読み込ませるイメージ
です。(と書かれても困ると思いますが、何故か TOMOYO Linux の操作は
ldapmodify コマンドによる LDAP 操作と似ているようです。)

ccs-loadpolicy や ccs-savepolicy で標準入力から読み込む/標準出力へ書き出す
場合には /etc/ccs/base_\*.conf を無視すべきかどうか迷っています。
とりあえずリビジョン 1485 では /etc/ccs/base_\*.conf を無視する仕様に
しています。 ccs-savepolicy -d の場合に /etc/ccs/base_domain_policy.conf の
内容を減算してくれると便利な場合もあるかもしれませんが、 ccs-loadpolicy -d の
場合に /etc/ccs/base_domain_policy.conf の内容を加算してしまうと、せっかく
/etc/ccs/domain_policy.conf により消去されたエントリ(上の例では
allow_execute /sbin/hotplug )が復活してしまうので、
ccs-loadpolicy -d の場合には /etc/ccs/base_domain_policy.conf を加算すべきでは
ないと考えて、 ccs-savepolicy -d の場合にも /etc/ccs/base_domain_policy.conf を
減算しないようにしました。

 リリースは9/3を予定しています。期間が短いですが、何かご意見やご質問が
ありましたら返信ください。




tomoyo-dev メーリングリストの案内
Back to archive index