2008年11月13日

[jsosug:00049] Re:SELinux を用いたアプリケーションの作成についてよい参考資料は無いでしょうか?

酒井さん

海外です。

> 海外様のSELinux-MLのREADME質問スレッドで投稿された
> How to Write a Userspace Object Manager
> を簡単に訳してみました。
> 駄文ですが、忘れそうなのであらかじめ投稿しておきます。

> http://www.engardelinux.org/modules/index/list_archives.cgi?list=selinux&page=0322.html&month=2008-11
> コメント等あればください。出来る範囲で対応します。

# 遅くなってしまいましたが
投稿されました Eamon Walsh のメモ和訳を拝見させて頂きました。

まず、気がついた点としては
・タイトル
→ 「ユーザスペース・オブジェクト・マネージャーの実装方法」としました
この場合の write は、コードを書く = 実装 という事だと思いますので。
・許認可
→ パーミッション の方が馴染みやすいのではないでしょうか
・「クラス」「オブジェクトクラス」「セキュリティクラス」
→ 原文でも使い方がまちまちですが、これらは全て同じものを表しています
ひとまず「セキュリティクラス」で統一しました。
・ドメインタイプ遷移
→ 「ドメイン遷移」又は「タイプ遷移」のどちらかの用語を使います。
しかし、ドメイン遷移はプロセスのセキュリティコンテキストが変化する
際に用いる用語ですので、「タイプ遷移」に統一しました。

その他、Eamon Walshが馴染みの薄い用語をいきなり使ったりしてますので、
適宜、脚注『(())内です』を入れてみました。
また、直訳調になっていた箇所を(多少、意訳して)直してみました。

よろしければ、書式等を修正の上、ユーザ会の wiki に掲載させて頂きたいと思います。

では
-----------------------------------------------------
How to Write a Userspace Object Manager
http://www.engardelinux.org/modules/index/list_archives.cgi?list=selinux&page=0322.html&month=2008-11

ユーザスペース・オブジェクト・マネージャー((X-WindowオブジェクトやDatabaseオブジェクト
など、アプリケーション独自のオブジェクトを管理するソフトウェア))の実装方法

1. 開発するオブジェクトマネージャで制御するセキュリティクラス((アクセス制御の対象となる
オブジェクトの種類。例えば、fileやsocket))とパーミッションを決める。

これらは、既にポリシーに存在するかもしれない。もしくは、独自のサービスを提供する場合、
新しくセキュリティクラスとパーミッションの組を設定する必要がある。

この手順は、難しい。というのは、トレードオフがあるためである。

すなわち、あるオブジェクトに対して、2つの”異なった”アクションがあるということは、
以下の3つの可能性が考えられる。
a) 2つのオブジェクトに対して異なるセキュリティクラスがあるということ
b) 異なったパーミッションが同じオブジェクトタイプにつく
c) 異なったタイプが、同じオブジェクトの同じパーミッションにつけられているということ
このため、オブジェクトのセキュリティクラスとパーミッションの組を選択し、意図する変更に
備えた準備を行う。

2. オブジェクトをどうやってラベル付けするかを決める。

例えば、何が動作の主体であるのか?
各々のオブジェクトのラベル付けは、どのようなタイプ遷移によって行われるのか?
オブジェクトは(タイプ遷移に拠らず)直接ラベル付けされるのか?
オブジェクトは名前によってラベル付けされるのか?
オブジェクトはポリインスタンス((同一の名前に対し、機密レベルに応じて異なったオブジェクト
が存在する事。元々はデータベース・セキュリティにおける概念で、機密レベルが異なれば、主キ
ー値が同一であるタプルの存在を許すデザイン。隠れチャネルへの対策。))化されるのか?

個々のオブジェクトはラベル付けされている必要があり、これらのラベル情報は(何かセキュリテ
ィ用のプライベート・フィールドを用いて)オブジェクト自身が内包するか、SELinuxのコードが
保持/管理するかのどちらかを行う必要がある。

3. 開発するオブジェクトマネージャーにSELinuxのコードフック(libselinuxのAPI等)を入れる。
このことにより、以下の時に制御をおこなうことが出来る。
a) プログラムが動き出す。この時点で、AVCが初期化される。
そして、selinuxのコールバックの設定は、は、selinux_set_callback(3)で行う。
あなたのセキュリティクラスやパーミッションのための名前から番号へのマッピングは、
selinux_set_mapping(3)で行う。
AVCの初期化は、avc_open(3)で行う。そして、ラベルの処理は、selabel_open(3)で行う。
もし、ファイルコンテキストや似たような文字列から名前のマッピングを使っており、
"unlabeled"コンテキストの検索を行う場合、security_get_initial_context(3)
を用いる。そして、そのほかに必要な初期化作業を行う。

b) オブジェクトは、生成/破棄される。したがって、オブジェクトは適切にラベル付けされる。
カーネルのインターフェースを反映した関数としては、
compute_create()とcompute_number()がある。これらに対応するSID((Security Identifier、AVCが
動的に生成するセキュリティコンテキストと1:1で対応する識別子))用の関数は、それぞれ
avc_compute_create(3), avc_compute_member(3)である。
そして、セキュリティコンテキストの文字列を直接扱う関数は、それぞれ
security_compute_create(3)とsecurity_compute_member(3)である。
名前の検索は、selabel_lookup(3)で行うことが出来る。
SID's(security_id_tポインター)はリファレンスカウンタを持っており、
メモリリークを防ぐため、sidput()とsidget()で管理を行う。

c) セキュリティ上の意思決定が行われる。この時点でセキュリティポリシーへの問い合わせを行う。
ここで鍵となる関数は、avc_has_perm(3)とsecurity_compute_av(3)である。

4. SELinuxコードをどうやって設定するかを決める。
もし、名前からコンテキストへのマッピングを持っているなら、
これを設定ファイルか、libselinuxに追加した新規のバックエンドにより
保持することが出来る。
いくつかの付随するオプションがある。例えばPermissiveモードとか、
ユーザ空間AVCで設定したhandle_unknownの振る舞いなどである。
これらのオプションは、設定ファイルオプションやコマンドラインパラメータにより
ユーザが変更する事ができる。

--
KaiGai Kohei <kaigai@xxxxx>

_______________________________________________
Japan secure operating system users group
users-ml@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/jsosug-users


投稿者 xml-rpc : 2008年11月13日 22:28
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/78937
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。