[tomoyo-users 754] AKARI 1.0 をリリースしました。

アーカイブの一覧に戻る

Tetsuo Handa from-****@I-lov*****
2010年 10月 10日 (日) 19:19:52 JST


 AKARI ( http://akari.sourceforge.jp/ )は Linux 2.6 カーネル向けのアクセス
解析/制限モジュールです。現在開発中の TOMOYO 1.8 をベースに、純粋にローダブル
カーネルモジュール(LKM)として追加可能なLSMモジュールに改造しました。

 TOMOYO 1.7.2 で対応したようなフックだけをカーネル本体に埋め込んで残りをLKM
として切り離すという方法ではなく、カーネル本体に対する修正を全く必要としない
方法で実現されています。そのため、LSMがサポートされているカーネルであれば、
AKARI を使うことが可能です。つまり、少なくとも

  Red Hat Enterprise Linux (RHEL4(2.6.9)/RHEL5(2.6.18)/RHEL6(2.6.32))
  Fedora (from Fedora Core 2(2.6.5) to Fedora 14(2.6.36))
  Ubuntu (from Warty(2.6.8) to Maverick(2.6.35))
  Debian (Sarge(2.6.8)/Etch(2.6.18)/Lenny(2.6.26)/Squeeze(2.6.32))
  openSUSE (from 9.1(2.6.4) to 11.3(2.6.34))

などで利用可能です。(カーネルがLSMをサポートしていない場合は使えません。
また、ディストリビュータ独自のパッチが適用されていることにより使えない場合も
あることをご了承ください。)

 AKARI はLKMからアクセスできない関数や変数に強引にアクセスするために、
バイナリコードをスキャンします。そのため、動作しないCPUアーキテクチャが
あるかと思います。現時点では x86_32 での動作を確認していますが、 x86_64 や
IA64 などの他の環境での動作は確認していません(あるいは確認するための環境を
持っていません)。

 このような手法を採用するに至った背景については8月にボストンで開催された
Linux Security Summit のライトニングトークで紹介しましたが、参加していない人は
全然知らないでしょうからこのメールの末尾に書きます。

 AKARI はカーネル本体に対する修正を全く必要としないため、 TOMOYO 1.8 と比べて
導入のための心理的障壁が低くなっています。また、ネットワーク(送信系操作)の
制限やアクセスログ機能などもサポートされており、 TOMOYO 2.3 と比べてより多くの
機能を利用することができます。そして、 AKARI はLSMモジュールではありますが、
TOMOYO 1.x と同様に他のLSMモジュールとの併用が可能です。 AKARI を使うために
SELinux/Smack/TOMOYO/AppArmor などを無効にする必要はありません。

 カーネル本体に手を加えないで実現できる範囲で実装しているため、LSMフックが
提供されていないことにより AKARI では利用できない機能もあります。例えば、
ネットワーク(受信系操作)とシグナル送信とケイパビリティに対する制限には
対応していません。また、ファイルに関するアクセス制御についてもカーネルの
バージョンおよびカーネルコンフィグにより、チェック対象となるパーミッションや
パス名に対する差異が存在しています。アクセス解析ツールとして使う分には
気にならないと思いますが、アクセス制限ツールとして使うには不十分な部分が
あるかと思います。



このようなモジュールを作ることになった背景:

 今年の3月頃だったと思いますが、ある人から RHEL4/5 ユーザ向けに単機能な
 アクセス制御モジュールを作ってほしいという相談を受けました。その際、
 TOMOYO 1.x のようにカーネル本体を置き換える方法は利用者にとって心理的な障壁が
 高すぎるので、LKMとして追加可能な方法で実現してほしいと頼まれました。
 LKMであっても RedHat がサポートしていないLKMをロードした時点で RedHat
 によるサポートを受けられなくなるので、実際にはカーネル本体を置き換えるのと
 大差ないと私は思うのですが、エンドユーザはそうは思わないようです。

 ご存じの通り、カーネル本体を置き換えずにアクセス制御モジュールを使いたい場合
 LSMを使うしか方法がありません。しかし、カーネル 2.6.24 において、
 LSMモジュールを登録するための関数である register_security() およびLSM
 モジュールを呼び出すための変数である security_ops にLKMからアクセスする
 ことができなくなりました( http://lkml.org/lkml/2007/7/14/91 )。

 カーネル 2.6.24 以降、表向きにはLSMモジュールをLKMとして実装することは
 不可能になりましたが、抜け道として /proc/kallsyms から register_security() の
 アドレスを割り出すことによりLSMモジュールをLKMとして実装することは
 可能でした。しかし、カーネル 2.6.35 において register_security() 自身が
 initramfs/initrd の開始前に消滅するようになってしまったため、この抜け道も
 使えなくなりました( http://lkml.org/lkml/2010/2/26/239 )。

 これらの仕様変更は RHEL4/5 向けのアクセス制御モジュールを作る上では問題には
 なりません。しかし、 RHEL6 や Ubuntu 10.10 向けのアクセス制御モジュールを
 作る上では大問題です。

 どうやってこの問題を解決すれば良いのでしょう?単機能アクセス制御モジュールを
 LSMモジュールとして実装してメインラインにマージさせ、それから
 ディストリビュータに採用を働きかければ良いのでしょうか?
 残念ながら、この方法はうまくいかないのです。

 カーネル 2.6.36 へ向けて Yama という単機能LSMモジュールが提案されましたが
 マージされませんでした。LSMは排他的であるゆえ、一通りの基本的な機能を
 カバーしていないLSMモジュールはメインラインには採用しない方針だからです
 ( http://lkml.org/lkml/2010/8/3/464 http://lkml.org/lkml/2010/8/5/147 )。
 つまり、 Yama のように単機能なアクセス制御機能を掻き集めただけのLSM
 モジュールでは採用されないのです( http://lkml.org/lkml/2010/8/2/188 )。

 initramfs/initrd 開始後にLSMモジュールをロードすることができないという
 制約と、単機能LSMモジュールはメインラインには採用されないという制約、
 ディストリビュータはメインラインに採用されていないコードを採用したがらない
 という傾向が重なった結果、単機能LSMモジュールを導入したいユーザに対して
 「カーネルを再コンパイルして置き換えるか、さもなくばそのモジュールの導入を
 諦めるか」の二者択一を迫らざるをえないという状況が生じているわけです。
 ( Yama は例外で、 Ubuntu 10.10 のカーネルには組み込まれています。しかも、
 Ubuntu 10.10 のカーネルに組み込まれている Yama はLSMフックではなく独自
 フックを利用しているため、 AppArmor や TOMOYO など他のLSMモジュールと
 同時に使用することができます。)

 「メインラインに入っていないLSMモジュールにはLSMを使わせない」実装に
 しておきながら、「メインラインに入れるのに値しないLSMモジュールはマージ
 しない」と規制しているわけです。「メインラインに入っているLKMを利用する
 手段は提供するが、メインラインに入っていないLKMを利用する手段は提供
 しない」と言っているのに等しいのです。これではLKMやLSMモジュールを
 開発・利用する自由を剥奪してしまうことになります。

 エンドユーザの自己責任でメインラインに入っていないLKMやLSMモジュールを
 利用する自由は認められるべきだと私は思います。それ故、私はLKMからLSMに
 強引にアクセスする手法を確立し、LKMベースのLSMモジュールとして公開した
 わけです。今まで何処にも無かったものが、ここに誕生しました。

 AKARI のソースコードをテンプレートとして使うことにより任意の単機能LSM
 モジュールを開発することができるはずです。 Linux Security Summit では
 TOMOYO 2.3 を有効にしたまま Yama も有効にするというデモを見せました
 ( http://www.youtube.com/watch?v=wG8BTLMu5wo )。また、特定のユーザID
 によるソケット操作を全て遮断するというLSMモジュールもあります
 ( http://kerneltrap.org/mailarchive/linux-netdev/2010/8/26/6283942 )。




tomoyo-users メーリングリストの案内
アーカイブの一覧に戻る