SEDiet? (typoじゃない

某himainu氏とSELinuxの組み込み対応についてやり取りしている間に思いついたネタ。

リソースが限られた状況では、カーネルにロードされたポリシーが消費するメモリをできる限り節約したい。あまり知られていないが、attributeを利用することでポリシーの大きさを節約できる。

その原理はこうだ。SELinuxの場合、明示的に許可したパーミッションでなければ全て拒否(ホワイトリスト方式)というポリシーを採用しているが、『お約束』的に与えなければならないパーミッションというのもある。
例えば、/lib 以下の *.so ファイルをリンクしたり、/etc/ 以下の設定ファイルを読んだりという権限である。マクロによってこれらの権限をドメインに付与した場合、バイナリポリシー中にはドメイン毎にルールが作成されることになる。イメージとしては以下の通り。

[マクロ展開]
unconfined_t <-- file:{getattr read execute} --> lib_t
httpd_t <-- file:{getattr read execute} --> lib_t
sshd_t <-- file:{getattr read execute} --> lib_t
mysqld_t <-- file:{getattr read execute} --> lib_t
initrc_t <-- file:{getattr read execute} --> lib_t

これをATTRIBUTEでまとめた場合のイメージは次の通り。
[ATTRIBUTEでまとめる]
unconfined_t <--+
httpd_t <--+
sshd_t <--+--> aaa_type <-- file:{getattr read execute} --> lib_t
mysqld_t <--+
initrc_t <--+
というように、ポリシー中に記述しなければならないルールの数が圧倒的に減る。

実証したわけではないが、標準の Reference Policy よりも、himainu氏のSPDL(Simplified Policy)の方が複数のパーミッションを統合して単純化している分、attributeによって統合可能なルールの出現頻度が高いと思われる。理由は、100の要素から成る組み合わせ問題よりも10の要素から成る組み合わせ問題の方が単純だから。

で、今までの記述言語を踏襲した上で、自動的に統合可能なルールを見つけ出してattribute化してくれれば最高に嬉しいわけだが、SPDLだからSEEdit内蔵…とせずに、policy.21のようなバイナリポリシーを読み込んで、attribute化すれば本家の Reference Policyer な人たちにも存在感をアピールできると思われる。

libsepolの勉強がてら自分でやってみたい気もするが、まだSE-PostgreSQL最優先という状況は継続なので、もうしばらくペンディング。

himainu氏が手がけるなら、ぜひSEEditのアナグラムでSEDietとしてもらいたい。(結局駄洒落かよ)