Reference Policyを部分的に利用したモジュール作成方法

Rawhideに入ったばっかりだが、早速解析。
これは、昨日の「レベル4」の設定方法に該当する。
selinux-policy-develパッケージをまずインストール。
yum install selinux-policy-devel

yum install selinux-policy-devel
# rpm -ql selinux-policy-devel
/usr/share/selinux/refpolicy
/usr/share/selinux/refpolicy/include
/usr/share/selinux/refpolicy/include/Makefile.devel

と、/usr/share/selinux/refpolicy以下に、なにやら大量にできている。
これが、reference policyのマクロ。reference policyのソースをいれずとも、reference policyのマクロを使って開発できる。

.ifファイルが、他ドメインとのインターフェースとなるマクロ。
#つまり、他ドメインで定義されたラベルにアセスするためのマクロが定義されている
.sptファイルは,普通のマクロ(r_file_permsみたいなやつ)

さて、localモジュールを作成するとする。
例えば、audit2allow
以下、作業ディレクトリは、適当に。
私の場合、/rootを作業ディレクトリ(てきとうだ)

audit2allowでできたモジュールを整形する例で。
# audit2allow -d -m > local.te
私の場合。。

module local 1.0;

require {
        role object_r;
        role system_r;

        class dir getattr;
        class fifo_file write;

        type file_t;
        type firstboot_t;
        type hald_t;
        type ntpd_t;
 };


allow hald_t file_t:dir getattr;
allow ntpd_t firstboot_t:fifo_file write;

というlocal.teが生成された(今のrawhideだとログでないので、何も生成されないかも…)

Makefile.develを作業ディレクトリにコピー。

# cp /usr/share/selinux/refpolicy/include/Makefile.devel Makefile
追記:Makefile
TYPE?=strict

TYPE?=targeted-mcs
に変更。

local.fc,local.if

これらは、からでもいいので生成。
#touch local.fc local.if

とりあえずマクロを使う

で、なんの脈絡もないが、とりあえずマクロを使うということで…
allow hald_t file_t:dir getattr;

allow hald_t file_t:dir r_dir_perms;
としてみる。

設定反映

#make
local.te:18:ERROR 'permission read is not defined for class dir' at token ';' on line 33305:

みたいに、エラーが出ると思う。r_dir_permsで使われるパーミッションを宣言しないといけない。面倒。
class dir r_dir_perms;
をrequire{....}の間に追加。

もう一回設定反映
# make
今度はうまくいった。local.ppファイルが生成されているはず。

semodule -i local.pp
で設定反映。

それにしても、モジュールは便利だ。
今回、作業ディレクトリは/rootで、/etc/selinux...以下ではない。
ポリシ本体と、追加部分を別々に管理,開発できる。
ポリシ本体には、このように、
Reference Policyで書いたポリシも追加できるし、まったく別の書式で書いたポリシも追加できるかもしれない。
Simplified Policyをも追加できる可能性を秘めている。