BusyBoxのアプレットごとにドメインを分ける方法を考える
BusyBoxは、一つのバイナリなので、普通にやっていると, SELinuxでは一つのドメインで動いてしまう。いい方法はないか考えてみる。
選択肢は、以下の3つか。
1: カーネルを拡張する
TOMOYO Linux方式。ドメイン遷移のエントリポイントのラベルは、今はbusyboxのバイナリのタイプとなってしまう。それを、シンボリックリンクのタイプになるようにする。
ちょっと考えてみて、相談してみたのだが、KaiGaiさんより、それは危険(パス名vsラベルの泥沼になる)&LSMではできないとのコメントを頂く。
私も、これ以上本家に悪者と思われたくないので、この選択肢はやめとく(汗
2:ラッパーを作る
LIDSでBusyBoxの方式↓に従う。
http://www.selinux.gr.jp/LIDS-JP/document/general/web_lids_busybox/main.html
その場はしのげるが、根本的でない気もする。
3: busyboxを拡張する
SELinux本家的なやり方としては、これがいいのではないだろうか。rpmとかcronも拡張してきてるし。
busyboxのデフォルトドメイン→applet読み込み→appletに応じたドメイン
としたい。
動的ドメイン遷移(やったことないが)を使えばできそうな気がする。
やることは以下か??
- (a) appletにラベルを付与する
- (b) security_compute_createを使って、busyboxのドメイン、appletのラベルのペアから、遷移先ドメインを得る
- (c) (b)で得たドメインに動的ドメイン遷移
問題は、appletへどうやってラベルを付与するかか。
busybox_contextsファイルみたいなファイルを作って、
<アプレット名> <セキュリティコンテキスト>
みたいに、列挙してラベルを付与するのが正攻法だが、
独自に処理を実装するのは面倒だし、コードサイズも増える。
file_contextsファイルを転用できないだろうか。
つまり、
<busyboxのパス>/<アプレット名> <セキュリティコンテキスト>
のように、file_contextsファイルに書く。
例えば、busyboxのパスが/usr/bin/busybox、アプレット名がpasswd、
アプレットに付与するラベルがapplet_passwd_tならば
/usr/bin/busybox/passwd system_u:object_r:applet_passwd_t
のように書く。
で、busybox側では、上の(a)の処理のところで、
matchpathcon(/usr/bin/busybox/passwd)
のようにして、ラベルを得る。
# /usr/bin/busybox -> xreadlink関数で取得で、concat_pathfile
うーむ。上の方法でうまくいくのかなぁ。