TYPEBOUNSとマルチスレッド

SELinux: add boundary support and thread context assignment

先月から議論を続けていたパッチがカーネルにマージされた。
linux-next経由2.6.28行きという形になるだろう。
このパッチの目的は、WebサーバやAPサーバがクライアントのリクエストを処理する際に、リクエストハンドラ(例えばPHPスクリプト)をクライアントに応じた適切な権限で実行する事である。

Apacheに手を入れ、PHPスクリプトを呼び出す前にSELinuxのセキュリティコンテキストを設定すれば良いではないかと思うなかれ。スそう単純でない問題があるのである。
近頃のWeb/APサーバはマルチスレッド化で性能を稼ぐ事が多々あるが、SELinuxはスレッド単位でのドメイン付与を認めていない。1プロセス=1ドメインなのである。

しかし、そんな事を言っていては埒が開かないのでと考えた末に出てきたアイデアが『元々のドメインに比べて、権限が完全に縮退している場合に限り、スレッド単位のドメイン遷移を認める』というものであった。

スレッドはメモリ空間を共有しており、OSが捕捉する事なく他のスレッドが読み出した情報を参照できるが、元のドメインよりも弱い権限で動いている限り、当該メモリ空間に存在してはならない情報がドメインの内部に入ってくる事はない。

上の図は、各ドメインの権限をベン図で示したもの。
httpd_php_tドメインは、完全にhttpd_tドメインに包含されており、この場合 httpd_t → httpd_php_t への遷移は可能。一方、httpd_perl_tドメインはhttpd_tに無い権限を持っているため、ドメイン遷移は認められない。

このドメイン間の強弱関係を規定するのが、新しくポリシー構文に追加した TYPEBOUNDS 文である。

書式:
TYPEBOUNDS <境界ドメイン> <被制約ドメイン> [, <被制約ドメイン> ... ] ;
例:
TYPEBOUNDS httpd_t httpd_php_t ;
この一文を追加する事で、httpd_php_tドメインの権限は、決してhttpd_tドメインを越える事は無くなる。無理やりパーミッションを与えても、実行時にマスクされるので無駄。

で、スレッドにドメインを設定する際には、既存のlibselinuxのAPIである setcon() を利用するが、この時、呼出しプロセスがマルチスレッド化されている場合、『新しいドメインが、元のドメインを境界ドメインとして持つ』事がドメイン遷移の条件になる。

これを使う事で、Web/APサーバがユーザのリクエストを処理する際に、ユーザに応じた適切な権限を割り当てる事が可能になる。

大仰に言えば、SELinuxがWeb Application Flawの悪夢に対して処方箋となるための第一歩。技術の普及という点でも、今まで全く関係の無かったWeb2.0の人たちとの接点を作ると言うのは大きい。
SELinuxの普及にはキラーアプリケーションが必要だとかねがね言ってきたが、Webとの連携はブレークスルーとなり得るか。今後の展開を乞うご期待。

gitメモ

CELinux Forum Japan Technical Jamboreeで、ルネサスの岩松さんから git についてのお話。

ちょうど、前の日に James Morris が俺のパッチを security-testing-2.6 ツリーの next ブランチにマージしたと言ってきたものの、リモートのリポジトリのブランチを手元に持ってくる方法がわからなかったので、これ幸いと質問。

最後のLTの時間までの間にわざわざ資料を作って教えて頂きました。多謝。
キーワードは --track で、手元のブランチが追跡すべきリモートのブランチを指定する事。これで、リモートが更新された時にも git-pull で取ってこれる。

以下は、security-testing-2.6ツリーからnextブランチを引っ張ってくる例

[kaigai@masu repo]$ git-clone git://git.kernel.org/(略)/security-testing-2.6.git
Initialized empty Git repository in /home/kaigai/repo/security-testing-2.6/.git/
remote: Counting objects: 897923, done.
remote: Compressing objects: 100% (161001/161001), done.
remote: Total 897923 (delta 749238), reused 884130 (delta 735518)
Receiving objects: 100% (897923/897923), 218.38 MiB | 2810 KiB/s, done.
Resolving deltas: 100% (749238/749238), done.
Checking out files: 100% (24333/24333), done.
[kaigai@masu repo]$ cd security-testing-2.6
[kaigai@masu security-testing-2.6]$ git-checkout --track -b next origin/next
先ずは普通に git-clone をした後、git-checkout コマンドの -b next で、新しいブランチ(名前: next)を作成する。で、このブランチは origin/next をトラッキング(--track)するという事を指定する。

これで、nextブランチのコピーを手元に持ってこれる。
無事に git-log で自分のパッチがコミットされている事を確認できた。めでたしめでたし。

commit d9250dea3f89fe808a525f08888016b495240ed4
Author: KaiGai Kohei
Date: Thu Aug 28 16:35:57 2008 +0900

SELinux: add boundary support and thread context assignment

The purpose of this patch is to assign per-thread security context
under a constraint. It enables multi-threaded server application
to kick a request handler with its fair security context, and
helps some of userspace object managers to handle user's request.