本を読む

読書やコンピュータなどに関するメモ

TOMOYO Linuxでサンドボックス実行環境を動かす

 「404 Blog Not Found:perl - FreeBSD::i386::Ptrace released!」あたりを見たのをきっかけに、セキュアOSのことを思い出したので、TOMOYO Linux(のほんのさわり)を試してみました。

 以下、チュートリアルまんまの「動かしてみました」エントリってやつです。

TOMOYO Linuxってなに?

 TOMOYO Linuxは、LinuxカーネルにセキュアOS機能を追加するパッチです。もうじきLinuxカーネル本家にマージされるそうです。

 ちなみに、略称はなぜか「ccs」みたいです。関連プロジェクトには、SAKURA LinuxとかCERBERUS認証とかSYAORANファイルシステムとかYUEとかもあるみたいです。不思議ですね。

セキュアOSはシステムコールを制限する

 セキュアOSというのは、実行できるシステムコールをカーネルレベルで制限するOSです。root権限でも許可がなければブロックしちゃいます。多くの場合、誰がどのシステムコールを呼べるかのホワイトリストをもとに制限します。こういうのをMAC(Mandatory Access Control、強制アクセス制御)って呼びます。

 セキュアOSとしては、LinuxではSELinuxやLIDS、FreeBSDではTruestedBSDなど(の名前)が知られています。

 セキュアOSは、組み込みなどの特定用途向け環境に適しているようです。サンドボックス実行環境にも使えそうですね。

TOMOYO Linuxなら誰でも設定できる

 セキュアOSの問題は、設定がとても面倒なことです。ファイルやデバイスだけならまだしも、共有ライブラリの呼び出しや、共有ライブラリからアクセスするリソースなど、目に見えない部分まで、いちいち手で許可してやらなくちゃなりません。

 TOMOYO Linuxでは、これを解決するために、学習モードというのを用意しています。安全を確保した状態で学習モードで起動し、許可する対象の動作をいちど実行します。ここで呼び出しのログをとり、それをポリシーとしてまとめて許可します。

インストール

 では実際にやってみます。ここではCentOS 5.2を使います。

 といっても、インストール方法は公式サイトの「TOMOYO Linux 導入手順書 (CentOS 5.2版)」のとおりにやればいいので、以下省略します。

学習モードで実行

 さて、再起動を実行して、TOMOYO Linuxのカーネルで起動します。セキュアOSなので(?)rootでログインしちゃいます。

 まず、mingettyの子孫プロセスを学習モード(プロファイル1)に移行させます。

[root@localhost ~]# setprofile -r 1 '<kernel> /sbin/mingetty'
1 <kernel> /sbin/mingetty
1 <kernel> /sbin/mingetty /bin/login
1 <kernel> /sbin/mingetty /bin/login /bin/bash
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/egrep
1 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/id
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/hostname
1 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/dircolors
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/grep
1 <kernel> /sbin/mingetty /bin/login /bin/bash /sbin/consoletype
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/kbd_mode
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont /bin/sh
1 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont /bin/sh /bin/gzip
1 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/lib/ccs/setprofile

 ここで、Perlスクリプトを書いてみます。

[root@localhost ~]# vi hoge.pl

 中身はこんな感じ。

#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw(max);

print max(2, 10, 5), "\n";

 実行します。

[root@localhost ~]# perl hoge.pl
10

ポリシーを確認して保存

 記録したポリシーを確認してみます。

[root@localhost ~]# editpolicy

 キャラクタで画面が表示されました。プロセスの呼び出し関係がツリー状に表示されます。

ccs editpolicy #1

 図では、perlの実行部分にカーソルがあります。ここで、Enterキーを押すと、そのプロセスのアクセスしたものが表示されます。

ccs editpplicy #2

 qキーを押すと終了します。

 記録したポリシーは、忘れずに保存しておきます。

[root@localhost ~]# savepolicy

サンドボックスで実行

 いよいよサンドボックス環境(プロファイル3)に移行します。

[root@localhost ~]# setprofile -r 3 '<kernel> /sbin/mingetty'
3 <kernel> /sbin/mingetty
3 <kernel> /sbin/mingetty /bin/login
3 <kernel> /sbin/mingetty /bin/login /bin/bash
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/egrep
3 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/id
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/hostname
3 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/dircolors
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/grep
3 <kernel> /sbin/mingetty /bin/login /bin/bash /sbin/consoletype
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/kbd_mode
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont /bin/sh
3 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/unicode_start /bin/setfont /bin/sh /bin/gzip
3 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/lib/ccs/setprofile
3 <kernel> /sbin/mingetty /bin/login /bin/vi
3 <kernel> /sbin/mingetty /bin/login /usr/bin/perl
3 <kernel> /sbin/mingetty /bin/login /usr/lib/ccs/editpolicy
3 <kernel> /sbin/mingetty /bin/login /usr/lib/ccs/savepolicy

 さきほどのスクリプトを実行します。

[root@localhost ~]# perl hoge.pl
10

 問題ありません。

 では次の、学習していないワンライナーはどうでしょう。

[root@localhost ~]# perl -le 'print "Hello"'
TOMOYO-ERROR: Access 'read(open) /dev/null' defined for /usr/bin/perl
Can't open /dev/null: Operation not permitted

 TOMOYO Linuxでブロックされました。めでたしめでたし。それにしても、ここで/dev/nullをopenするなんて知りませんでした。

 ちなみにこのままでは/sbin/shutdownも実行できません。実行するには、無効モード(プロファイル0)に移行します。

[root@localhost ~]# setprofile -r 0 '<kernel> /sbin/mingetty'

まとめ

  • セキュアOSを使うと、ホワイトリスト(ポリシー)にないシステムコールを、rootでも実行できないように制限できる
  • TOMOYO Linuxでは学習モードでポリシーを設定できるのでらくちん

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/579-5cf508db

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad