--- tags/htdocs/ja/1.6.x/new-policy-reference.html 2008/04/08 05:48:22 1093 +++ tags/htdocs/ja/1.6.x/new-policy-reference.html 2008/04/09 05:14:41 1094 @@ -3,37 +3,35 @@ -TOMOYO Linux ポリシー解説書 +TOMOYO Linux ポリシ解説書

English Page

-

TOMOYO Linux ポリシー解説書

+

TOMOYO Linux ポリシ解説書

Last modified: $Date: 2008-03-03 16:32:30 +0900 (Mon, 3 Mar 2008) $

目次

-

1. キーワード一覧

+

1. キーワード一覧

2. はじめに

2.1 単語の表記規則

2.2 パターンの表記規則

2.3 単語の長さに関する制約

2.4 1行の長さに関する制約

2.5 メモリ使用量に関する制約

-

3. ポリシーファイルに関して

+

3. ポリシファイルに関して

3.1 所在について

3.2 変更について

4. ドメインに関して

4.1 ドメインとは

4.2 ドメイン遷移とは

4.3 アクセスログについて

- -

中級者向けの機能

-

ポリシー違反時のペナルティ指定

-

条件付きアクセス許可の指定

-

上級者向けの機能

-

ステートフルなアクセス許可の指定

-

許可されていないプログラムの実行が要求された場合の代替処理指定

-

プログラムの実行可否をカーネルの外部で判断

- +

5. キーワード詳細

+

6. 便利な機能

+

6.1 条件付きアクセス許可の指定

+

6.2 ステートフルなアクセス許可の指定

+

6.3 ポリシ違反時のペナルティ指定

+

6.4 プログラムの実行可否をカーネルの外部で判断

+

6.5 許可されていないプログラムの実行が要求された場合の代替処理指定


1. キーワード一覧

@@ -83,7 +81,7 @@
  • RESTRICT_UNMOUNT
  • RESTRICT_PIVOT_ROOT
  • RESTRICT_AUTOBIND
  • -
  • MAX_ACCEPT_ENTRY
  • +
  • MAX_ACCEPT_ENTRY
  • MAX_GRANT_LOG
  • MAX_REJECT_LOG
  • TOMOYO_VERBOSE
  • @@ -208,6 +206,8 @@ tmp/無効なパス名 +

    ただし、例外として、 /proc/プロセスID/fd/ ディレクトリに表示されるパイプのパス名は pipe: で、ソケットのパス名は socket: で始まります。

    +

    2.2 パターンの表記規則

    パス名にはテンポラリファイルのように、毎回異なる文字が使われる場合があります。そのため、ワイルドカードを用いたパターン化を行うことが必要になります。 TOMOYO Linux に於いては以下のワイルドカードをサポートしています。

    @@ -235,11 +235,11 @@

    2.3 単語の長さに関する制約

    -

    Linux に於いてはパス名の長さに関する上限は存在しませんが、パス名を用いたアクセス制御を行うために無限の長さをサポートすることはできません。そのため、 TOMOYO Linux に於いては、単語の長さは4000バイトまでに制限されています。

    +

    Linux に於いてはパス名の長さに関する上限は存在しませんが、パス名を用いたアクセス制御を行うために無限の長さをサポートすることはできません。そのため、 TOMOYO Linux に於いては、単語の長さは終端の NUL 文字を含めて4000バイトまでに制限されています。

    2.4 1行の長さに関する制約

    -

    TOMOYO Linux に於いては、1行の長さは8192バイトまでに制限されています。

    +

    TOMOYO Linux に於いては、1行の長さは終端の NUL 文字を含めて8192バイトまでに制限されています。

    2.5 メモリ使用量に関する制約

    @@ -259,50 +259,50 @@ -

    3. ポリシーファイルに関して

    +

    3. ポリシファイルに関して

    3.1 所在について

    -

    ポリシーファイルとは、アクセスの可否を定義したファイルです。システムの起動時に自動的にカーネルへと読み込まれます。

    +

    ポリシファイルとは、アクセスの可否を定義したファイルです。システムの起動時に自動的にカーネルへと読み込まれます。

    システムの起動時には、 /sbin/init というプログラムが実行されます。 /sbin/init の実行が要求されたときに、 /sbin/ccs-init というプログラムが存在していた場合、 /sbin/ccs-init が実行され、 /sbin/ccs-init の処理が終了してから /sbin/init の実行が開始されます。

    -

    /sbin/ccs-init は /etc/ccs/ ディレクトリにあるポリシーファイルを /proc/ccs/ ディレクトリを通じてカーネルへと読み込みます。

    +

    /sbin/ccs-init は /etc/ccs/ ディレクトリにあるポリシファイルを /proc/ccs/ ディレクトリを通じてカーネルへと読み込みます。

    - + - +
    カーネルとのインタフェースポリシーファイル定義されている内容
    カーネルとのインタフェースポリシファイル定義されている内容
    /proc/ccs/profile/etc/ccs/profile.confプロファイル(制御レベルを定義したもの)
    /proc/ccs/manager/etc/ccs/manager.confマネージャ(ポリシーの変更ができるプログラムを定義したもの)
    /proc/ccs/manager/etc/ccs/manager.confマネージャ(ポリシの変更ができるプログラムを定義したもの)
    /proc/ccs/system_policy/etc/ccs/system_policy.confシステムポリシ(システム全体で適用される設定)
    /proc/ccs/exception_policy/etc/ccs/exception_policy.conf例外ポリシ(ドメインポリシの例外を定義したもの)
    /proc/ccs/domain_policy/etc/ccs/domain_policy.confドメインポリシ(ドメイン単位で適用される設定)
    -

    そのほかの情報を取得するためのインタフェースもあります。対応するポリシーファイルはありません。

    +

    そのほかの情報を取得するためのインタフェースもあります。対応するポリシファイルはありません。

    - - + + - +
    カーネルとのインタフェース内容
    /proc/ccs/query管理者の指示待ちとなっているアクセス要求
    /proc/ccs/.domain_status定義されているドメイン名とプロファイル番号
    /proc/ccs/meminfoメモリ使用状況
    /proc/ccs/grant_logポリシーに違反しなかったアクセス要求のログ
    /proc/ccs/reject_logポリシーに違反したアクセス要求のログ
    /proc/ccs/grant_logポリシに違反しなかったアクセス要求のログ
    /proc/ccs/reject_logポリシに違反したアクセス要求のログ
    /proc/ccs/self_domain自分が属しているドメインのドメイン名
    /proc/ccs/.process_statusプロセスが属しているドメイン名とプロファイル番号
    /proc/ccs/.updates_counterポリシーの変更カウンタ
    /proc/ccs/.updates_counterポリシの変更カウンタ
    /proc/ccs/versionTOMOYO Linux のバージョン

    3.2 変更について

    -

    カーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシーを変更することができるプログラム名を /proc/ccs/manager に登録します。プログラム名ではなくドメイン名で登録することもできます。

    +

    カーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシを変更することができるプログラム名を /proc/ccs/manager に登録します。プログラム名ではなくドメイン名で登録することもできます。

    -

    だけがカーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシーを変更できます。以下に例を示します。

    +

    だけがカーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシを変更できます。以下に例を示します。

    @@ -317,11 +317,11 @@
    -

    上記の制約に加えて、デフォルトではユーザIDと実効ユーザIDの両方が0であるプロセスだけがポリシーを変更できますが、 非 root ユーザによるポリシーの変更を認めたい場合には /proc/ccs/manager に対して

    +

    上記の制約に加えて、デフォルトではユーザIDと実効ユーザIDの両方が0であるプロセスだけがポリシを変更できますが、 非 root ユーザによるポリシの変更を認めたい場合には /proc/ccs/manager に対して

    -# echo manage_by_non_root | loadpolicy -m +# echo manage_by_non_root | /usr/lib/ccs/loadpolicy -m
    @@ -329,11 +329,32 @@ +
    -# echo delete manage_by_non_root | loadpolicy -m +# echo delete manage_by_non_root | /usr/lib/ccs/loadpolicy -m +
    + +

    のように delete manage_by_non_root というキーワードを書き込んでください。 /proc/ccs/ 以下のエントリの所有者は root なので、非 root ユーザによるアクセスを認めるためには必要に応じて chown/chmod を実行してください。
    +起動時に自動的にこの処理が行われるようにするために、 /sbin/ccs-init は /etc/ccs/ccs-post-init というプログラムが存在する場合には /etc/ccs/ccs-post-init も実行するようになっています。よって、例えば demo ユーザが /proc/ccs/ インタフェースへの読み書きができるように設定したい場合は、

    + + +
    +#! /bin/sh
    +echo manage_by_non_root > /proc/ccs/manager
    +chown -R demo /proc/ccs/
    -

    のように delete manage_by_non_root というキーワードを書き込んでください。 /proc/ccs/ 以下のエントリの所有者は root なので、非 root ユーザによるアクセスを認めるためには必要に応じて chown/chmod を実行してください。

    +

    という内容で /etc/ccs/ccs-post-init を作成し、

    + + + +
    +# chmod 755 /etc/ccs/ccs-post-init
    +# chown -R demo /etc/ccs/
    +# chmod 755 /usr/lib/ccs/ +
    + +

    を実行することで demo ユーザがポリシのあるディレクトリへのアクセスとポリシを編集するためのプログラムを実行できるようになります。

    なお、学習モード用のプロファイルが割り当てられているプロセスは、アクセスを要求するだけで/proc/ccs/system_policyまたは/proc/ccs/domain_policyへと自動的にアクセス許可が追加されていきます。

    @@ -341,62 +362,64 @@

    4.1 ドメインとは

    -

    TOMOYO Linux においては、全てのプロセスがそれぞれ1つのドメインに属し、全てのプログラムがそれぞれ異なるドメインに属する。現在実行されている2つのプロセスが同一のプログラムであっても、それぞれのプロセスの直前のドメインが異なっていれば異なるドメインに属する。

    +

    TOMOYO Linux においては、システム全体でアクセス許可を定義するものと、ドメイン単位でアクセス許可を定義するものの2種類があります。前者はシステムポリシと呼ばれ、/proc/ccs/system_policyを通じてアクセス許可を指定します。後者はドメインポリシと呼ばれ、/proc/ccs/domain_policy を通じてアクセス許可を定義します。

    -

    全てのドメインはカーネルが属するドメイン「<kernel>」を基点として定義される。 /sbin/init はカーネルの属するドメインから起動されるので、 /sbin/init のドメインは「<kernel> /sbin/init」と定義される。 /etc/rc.d/rc はカーネルから起動された /sbin/init の属するドメインから起動されるので、 /etc/rc.d/rc のドメインは「<kernel> /sbin/init /etc/rc.d/rc」と定義される。

    +

    TOMOYO Linux においては、全てのプロセスがそれぞれ1つのドメインに属し、全てのプログラムがそれぞれ異なるドメインに属します。現在実行されている2つのプロセスが同一のプログラムであっても、それぞれのプロセスの直前のドメインが異なっていれば異なるドメインに属します。

    + +

    全てのドメインはカーネルが属するドメイン「<kernel>」を基点として定義されます。 /sbin/init はカーネルの属するドメインから起動されるので、 /sbin/init のドメインは「<kernel> /sbin/init」と定義されます。 /etc/rc.d/rc はカーネルから起動された /sbin/init の属するドメインから起動されるので、 /etc/rc.d/rc のドメインは「<kernel> /sbin/init /etc/rc.d/rc」と定義されます。

    4.2 ドメイン遷移とは

    -

    実行時のプログラムの名前により異なる動作をするプログラムが存在する。例えば /sbin/pidof は /sbin/killall5 へのシンボリックリンクである。 TOMOYO Linux は正規化したパス名を使用するので、 /sbin/pidof を実行すると /sbin/killall5 が実行されたものとしてドメインが定義される。

    +

    実行時のプログラムの名前により異なる動作をするプログラムが存在します。例えば /sbin/pidof は /sbin/killall5 へのシンボリックリンクです。 TOMOYO Linux は正規化したパス名を使用するので、 /sbin/pidof を実行すると /sbin/killall5 が実行されたものとしてドメインが定義されます。

    -

    プロセスがプログラムを実行しようとすると、以下の処理が行われる。

    +

    プロセスがプログラムを実行しようとすると、以下の処理が行われます。

    Step内容
    プログラム名の取得 -

    実行しようとするプログラムの「正規化されたファイル名」を取得して「パス名候補1」とする。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決したパス名を取得する。

    -

    実行しようとするプログラムの「正規化されたファイル名」を取得して「パス名候補2」とする。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決する前のパス名を取得する。

    +

    実行しようとするプログラムの「正規化されたファイル名」を取得して「パス名候補1」とします。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決したパス名を取得します。

    +

    実行しようとするプログラムの「正規化されたファイル名」を取得して「パス名候補2」とします。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決する前のパス名を取得します。

    シンボリックリンクの識別 -

    「パス名候補1」と「パス名候補2」が一致しない場合、例外ポリシーから

    +

    「パス名候補1」と「パス名候補2」が一致しない場合、例外ポリシから

    • alias 「パス名候補1」 「パス名候補2」
    -

    というエントリを探す。見つかった場合は「パス名候補2」を「パス名候補1」とする。

    +

    というエントリを探します。見つかった場合は「パス名候補2」を「パス名候補1」とします。

    argv[0] のチェック -

    「パス名候補1」の最後の / 以降の部分と argv[0] の最後の / 以降の部分が異なっている場合、ドメイン別ポリシーから

    +

    「パス名候補1」の最後の / 以降の部分と argv[0] の最後の / 以降の部分が異なっている場合、ドメインポリシから

    • allow_argv0 「パス名候補1」 「argv[0]の最後の / 以降の部分」
    -

    というエントリを探す。見つからなければ拒否する。

    +

    というエントリを探します。見つからなければプログラムの実行要求は拒否されます。

    類似するプログラムの集約 -

    例外ポリシーから

    +

    例外ポリシから

    • aggregator 「パス名候補1」 「集約されたパス名」
    -

    というエントリを探す。見つかった場合は、「集約されたパス名」を「パス名候補1」とする。

    +

    というエントリを探します。見つかった場合は、「集約されたパス名」を「パス名候補1」とします。

    権限のチェック -

    ドメイン別ポリシーから

    +

    ドメインポリシから

    • allow_execute 「パス名候補1」
    • allow_execute @「パス名候補1」を含むグループ名
    -

    というエントリを探す。見つからなければ拒否する。

    +

    というエントリを探します。見つからなければプログラムの実行要求は拒否されます。

    遷移先の決定 -

    (1) 例外ポリシーから

    +

    (1) 例外ポリシから

    • no_initialize_domain 「パス名候補1」 from 「現在のプロセスが属しているドメインのドメイン名」 @@ -404,9 +427,9 @@
    • no_initialize_domain 「パス名候補1」
    -

    というエントリを探す。見つかった場合は (3) へ進む。

    +

    というエントリを探します。見つかった場合は (3) へ進みます。

    -

    (2) 例外ポリシーから

    +

    (2) 例外ポリシから

    • initialize_domain 「パス名候補1」 from 「現在のプロセスが属しているドメインのドメイン名」 @@ -414,9 +437,9 @@
    • initialize_domain 「パス名候補1」
    -

    というエントリを探す。見つかった場合は「カーネルが属しているドメインのドメイン名(<kernel>)」と「パス名候補1」とを連結して「遷移先ドメイン」として (6) へ進む。

    +

    というエントリを探します。見つかった場合は「カーネルが属しているドメインのドメイン名(<kernel>)」と「パス名候補1」とを連結して「遷移先ドメイン」として (6) へ進みます。

    -

    (3) 例外ポリシーから

    +

    (3) 例外ポリシから

    • no_keep_domain 「パス名候補1」 from 「現在のプロセスが属しているドメインのドメイン名」 @@ -425,9 +448,9 @@
    • no_keep_domain 「現在のプロセスが属しているドメインのドメイン名」の最後の要素
    -

    というエントリを探す。見つかった場合は (5) へ進む。

    +

    というエントリを探します。見つかった場合は (5) へ進みます。

    -

    (4) 例外ポリシーから

    +

    (4) 例外ポリシから

    • keep_domain 「パス名候補1」 from 「現在のプロセスが属しているドメインのドメイン名」 @@ -436,22 +459,22 @@
    • keep_domain 「現在のプロセスが属しているドメインのドメイン名」の最後の要素
    -

    というエントリを探す。見つかった場合は「現在のプロセスが属しているドメインのドメイン名」を「遷移先ドメイン」とし、 (7) へ進む。

    +

    というエントリを探します。見つかった場合は「現在のプロセスが属しているドメインのドメイン名」を「遷移先ドメイン」とし、 (7) へ進みます。

    -

    (5) 「現在のプロセスが属しているドメインのドメイン名」と「パス名候補1」とを連結して「遷移先ドメイン」とし、(6)へ進む。

    +

    (5) 「現在のプロセスが属しているドメインのドメイン名」と「パス名候補1」とを連結して「遷移先ドメイン」とし、(6)へ進みます。

    -

    (6) ドメイン別ポリシーから「遷移先ドメイン」を探す。見つからなければ拒否する。

    +

    (6) ドメインポリシから「遷移先ドメイン」を探します。見つからなければプログラムの実行要求は拒否されます。

    環境変数のチェック -

    (1)全ての環境変数名が「遷移先ドメイン」で許可されているかどうかを検査し、許可されていないものが見つかった場合は拒否する。

    +

    (1)全ての環境変数名が「遷移先ドメイン」で許可されているかどうかを検査します。1つでも許可されていないものが見つかった場合は、プログラムの実行要求は拒否されます。

    -

    (2)通常のプログラム実行処理を行い、正常に終了した場合は「遷移先ドメイン」に遷移する。

    +

    (2)通常のプログラム実行処理を行い、正常に終了した場合は「遷移先ドメイン」に遷移します。

    -

    ただし、

    +

    ただし、例外として