SELinux Policy Editorのパス名→ラベル変換のメカニズム

開発者ですら忘れそう(実際忘れてた…)なので、まとめ直す。

1) パス名からタイプを生成

allow /etc r,s;
とあれば、
/etc -> etc_tというタイプを生成。
convert.c
create_file_label_table(domain_hash_table);
でそれをやってる。

2) type文を出力

convert.cの
out_file_type(policy_fp);
で行われる。
1)で生成されたタイプを宣言
type etc_t, file_type;
のように出力。

3) SELinuxのマクロを出力(その1)

allowルールで現れるファイル名に関するSELinuxマクロを出力。
allow_file_|パーミッション|(|ドメイン|,|タイプ|)
というマクロを使って出力
例えば,
hoge_tドメインで allow /etc r;
とあった場合,
allow_file_r(hoge_t, etc_t)
というのを出力
allow_file_rは, macros/seedit_macros.teで定義。
seedit_macros.teは,spdl_spec.xmlからgenmacros.pyスクリプトで自動生成(seedit-policyパッケージに同梱)。
http://seedit.sourceforge.net/doc/permission_integrate/
をみると,マクロでどんなパーミッションが許可されるか分かる(Integrated permissions for file allowというところ)

ソースで対応する場所は,
out_file_acl.cの
print_allow_consider_child関数の
print_allow(domain, filename, allowed, outfp);

4) SELinuxのマクロを出力(その2)

2)だけでは、不十分。

  • 解決すべき問題1

例えば,
domain hoge_t;
allow /etc r;

domain foo_t
allow /etc/sysconfig r;
とあったとする。
この場合
/etc以下に, etc_t
/etc/sysconfig以下に  etc_sys_config_t
というタイプが付与されることになる。

単純に
allow_file_r(hoge_t, etc_t)
を出力しただけだと,
hoge_tドメインは,/etc/sysconfig/に
アクセスできない。
なので,
allow_file_t(hoge_t, etc_sys_config_t)
も出力してやる必要。
つまり,子ディレクトリに対してラベルが付与されている場合
それに対するマクロも出力してやる必要がある。

  • 解決すべき問題2

domain hoge_t
allow /a r;
allow /a/b w;

domain foo_t
allow /a/b/c r;

というSimplified Policyのルールがあったとする。
hoge_tは,
/aに「r」可能,/a/b以下に「w」可能という意味。
/a/bの下位ディレクトリは「w」可能。
つまり,
allow /a r;の設定は, allow /a/b w;によって打ち消されている
この仕様を実現するため
/a -> a_t
/a/b -> a_b_t
/a/b/c -> a_b_c_t
というタイプが生成されるが,

allow_file_w(hoge_t, a_b_c_t)
という文が生成される必要。

3)4)を解決するため,register_child_buf_tableという関数を使って,
ディレクトリのタイプ一覧を作成している。