SELinux + LAPP

というワケで、TLFJシンポジウムの併設BoFで発表したアイデアを、SELinux-MLに投げてみた。

http://marc.info/?l=selinux&m=121611666013230&w=2

階層化ドメインを利用して、子ドメインへの遷移に限り、スレッドが異なるドメインを持てるようにするというアイデアに対しては、特に異論は無いようだ。

しかし、これを ApacheTomcat に適用する際に難関が立ちはだかる。奴らは、一度クライアントのリクエストを処理した後、別のリクエストを処理するためにバックエンドを再利用するのだ。
(素直に死んでくれれば嬉しいのだが…。セキュリティ的な意味で。)

なので、Apache/Tomcatのこの構造を守る限り、一度遷移したドメインからの復帰という作業を考える必要が出てくる。が、この事は、アプリケーションからの自発的な意思表明による権限の昇格を意味するため、「リクエスト正常終了後のドメイン復帰」なのか「悪意あるユーザの操作によるドメイン復帰」なのかを判断する事ができない。

Stephenからの提案は、予め権限に応じたスレッド/プロセスのプールを作成しておき、それを割り当てるようにしてはどうか?
しかし、これにはApache自体にかなり修正を加えねばならない上、原理的にHTTP認証に応じた権限のアサインができなくなる。

やはり、一番素直なのは、クライアントの接続に対して1プロセスを割当て、リクエストの処理が終わったら死ぬようなモデル。
パフォーマンス的には明らかに劣るが、SELinux + SE-PostgreSQLを入れたい用途に関しては、パフォーマンスが最優先事項とも考えにくい。

幸い、ApacheにはMPM(Multi Processing Module)といって、コネクションのaccept()からプロセス/スレッドの生成などの処理をモジュール化するための仕組みがある。
Stephenへの返信の中で「そんな大きな改造をする位なら、SELinux専用のMPMを作った方が良くないだろうか?」と書いたが、案外、考慮するに値するアイデアではないだろうか。

という訳で、週末は Apache のコードとにらめっこ。

【追記】
Tomcatに関しては、Thread Poolを切れば各リクエスト毎にスレッドが死ぬとの記述を見かけたが、本当ならありがたい。誰か詳しい人の情報求ム。