himainuの日記

SELinux Policy Editor開発日誌SELinux一般執筆講演履歴

2007-02-19

[][] BusyBoxのアプレットごとにドメインを分ける方法を考える 23:04

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に応じたドメイン

としたい。

動的ドメイン遷移(やったことないが)を使えばできそうな気がする。

やることは以下か??

問題は、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

うーむ。上の方法でうまくいくのかなぁ。

PANDAPANDA 2007/02/20 20:48 >それは危険(パス名vsラベルの泥沼になる)&LSMではできない
LSM にはシンボリックリンク解決後の情報が渡されるので、
LSM を使用している限り不可能ですね。

>/usr/bin/busybox -> xreadlink
busybox の振る舞いを決めるのは argv[0] または argv[1] の
最後の / 以降の部分ですから、 matchpathcon(passwd) みたいな
方法でできないのでしょうか?

himainuhimainu 2007/02/20 23:15 どうもです。LSMは不便が多いですね。例のAppArmorの人が出したスレも流れがとまってますし、どうしたものでしょうか。

> 最後の / 以降の部分ですから、 matchpathcon(passwd) みたいな
方法でできないのでしょうか?
はい。まさしくそういう方法をとっています。
とはいえ、matchpathconの引数は、パス名の形式を取ってないと、
まずそうなので、
/usr/bin/busyboxとくっつけて
/usr/bin/busybox/passwordというダミーのパス名にしています。
/usr/bin/busyboxが「ファイル」として存在する以上、
/usr/bin/busybox/passwordという名前のファイルは実在しえないので、
問題も少ないかなぁと想像しています。