This page is for TOMOYO 2.2 (for Linux 2.6.30 - 2.6.35 kernels). Please jump to this page for TOMOYO 2.3 (for Linux 2.6.36 and later kernels).

English Page

Last modified: $Date: 2024-03-30 20:25:00 +0900 (Sat, 30 Mar 2024) $

TOMOYO Linux ポリシー解説書

目次

1. キーワード一覧

2. はじめに

2.1 単語の表記規則

2.2 パターンの表記規則

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

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

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

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

3.1 所在について

3.2 変更について

4. ドメインに関して

4.1 ドメインとは

4.2 ドメイン遷移とは

5. キーワード詳細

6. 便利な機能

6.1 root 以外のユーザによるポリシーの変更を許可

6.2 ポリシーに割り当てられるメモリ量を制限


1. キーワード一覧

/sys/kernel/security/tomoyo/profile および /etc/tomoyo/profile.conf で使われるもの

/sys/kernel/security/tomoyo/exception_policy および /etc/tomoyo/exception_policy.conf で使われるもの

/sys/kernel/security/tomoyo/domain_policy および /etc/tomoyo/domain_policy.conf で使われるもの

/sys/kernel/security/tomoyo/manager および /etc/tomoyo/manager.conf で使われるもの

2. はじめに

2.1 単語の表記規則

TOMOYO Linux はパス名を用いたアクセス制御を行います。パス名には英数字だけでなく空白や改行などの文字、漢字のような複数バイトで構成される文字などが含まれる可能性があります。そのため、いかなる文字でも正しく処理できるようにするために、 TOMOYO Linux に於いては以下の規則に従って単語を表記します。単語とは、パス名だけでなくコメントや環境変数の名前やプログラム実行時のパラメータなど、文字列として扱う全ての情報を指します。

下位 4 ビット
上位 4 ビット
0x00x10x20x30x40x50x60x70x80x90xA0xB0xC0xD0xE0xF
0x0\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017
0x1\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037
0x2\040!"#$%&'()*+,-./
0x30123456789:;<=>?
0x4@ABCDEFGHIJKLMNO
0x5PQRSTUVWXYZ[\\]^_
0x6`abcdefghijklmno
0x7pqrstuvwxyz{|}~\177
0x8\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217
0x9\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237
0xA\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257
0xB\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277
0xC\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317
0xD\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337
0xE\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357
0xF\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377

以下に表記例を示します。

単語正しい表記誤った表記
Hello world!Hello\040world!"Hello world!"
/home/user/Documents and Settings//home/user/Documents\040and\040Settings//home/user/Documents and Settings/
コメント (UTF-8 の場合)\343\202\263\343\203\241\343\203\263\343\203\210\040(UTF-8\040\343\201\256\345\240\264\345\220\210)コメント\040(UTF-8\040の場合)

パス名は必ず / から始まります。パス名が / で終わる場合はディレクトリ、 / 以外で終わる場合にはディレクトリ以外であると解釈されます。

パス名解釈
/ディレクトリ
/tmp/ディレクトリ
/tmpディレクトリ以外
tmp/無効なパス名

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

2.2 パターンの表記規則

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

ワイルドカード意味使用例
\*/ 以外の 0 文字以上/var/log/samba/\*
\@/ と . 以外の 0 文字以上/var/www/html/\@.html
\?/ 以外の 1 文字/tmp/mail.\?\?\?\?\?\?
\$1 桁以上の 10 進数/proc/\$/cmdline
\+10 進数 1 桁/var/tmp/my_work.\+
\X1 桁以上の 16 進数/var/tmp/my-work.\X
\x16 進数 1 桁/tmp/my-work.\x
\A1 文字以上のアルファベット/var/log/my-work/\$-\A-\$.log
\aアルファベット 1 文字/home/users/\a/\*/public_html/\*.html
\-パス名を除外する演算子
使用例意味
/etc/\*/etc/ 直下の全ファイル
/etc/\*\-\*shadow\*/etc/\*shadow\* 以外の /etc/\*
/\*\-proc\-sys//proc/ と /sys/ 以外の /\*/
/\{dir\}// +1回以上の dir/ の繰り返しに一致する演算子(カーネル 2.6.33 以降のみ有効)
  • /var/www/html/\{\*\}/\*.html ・・・ /var/www/html/\*/\*.html /var/www/html/\*/\*/\*.html /var/www/html/\*/\*/\*/\*.html など
  • /home/\*/\{\*\-.\*\}/\* ・・・ /home/\*/\*\-.\*/\* /home/\*/\*\-.\*/\*\-.\*/\* /home/\*/\*\-.\*/\*\-.\*/\*\-.\*/\* など

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

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

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

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

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

カーネル 2.6.33 以前に搭載されている TOMOYO Linux に於いては、アクセス許可や単語を記憶するために一度割り当てられたメモリは解放されません。システムを再起動する以外に、不要になったメモリを解放する手段は存在しません。

ただし、運用開始後にはアクセス許可の変更は生じにくいという傾向があること、および、運用開始前に適切にチューニングすることによりメモリ消費量を通常は 1 メガバイト以内に抑えられることから、心配する必要はありません。

TOMOYO Linux が現在使用中のメモリ消費量は、 /sys/kernel/security/tomoyo/meminfo から確認できます。単位はバイトです。 Shared: が単語を記憶するために使用されている量、 Private: がアクセス許可を記憶するために使用されている量で、減少することはありません。 Dynamic: がアクセス許可のチェックやアクセスログの保持などのために一時的に使用されている量で、不要になると減少します。

# cat /sys/kernel/security/tomoyo/meminfo

Shared:          65536
Private:         49152
Dynamic:          5106
Total:          119794

カーネル 2.6.34 以降に搭載されている TOMOYO Linux に於いては、アクセス許可や単語を記憶するために割り当てられたメモリは自動的に解放されます。そのため、不要になったメモリを解放するためにシステムを再起動する必要はありません。

TOMOYO Linux が現在使用中のメモリ消費量は、 /sys/kernel/security/tomoyo/meminfo から確認できます。単位はバイトです。 Policy: がポリシーを記憶するために使用されている量です。

# cat /sys/kernel/security/tomoyo/meminfo
Policy:         119794
Total:          119794

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

3.1 所在について

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

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

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

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

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

カーネルとのインタフェース内容
/sys/kernel/security/tomoyo/.domain_status定義されているドメイン名とプロファイル番号
/sys/kernel/security/tomoyo/meminfoメモリ使用状況
/sys/kernel/security/tomoyo/self_domain自分が属しているドメインのドメイン名
/sys/kernel/security/tomoyo/.process_statusプロセスが属しているドメイン名とプロファイル番号
/sys/kernel/security/tomoyo/versionTOMOYO Linux のバージョン

3.2 変更について

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

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

# cat /sys/kernel/security/tomoyo/manager
/usr/sbin/tomoyo-loadpolicy
/usr/sbin/tomoyo-editpolicy
/usr/sbin/tomoyo-setlevel
/usr/sbin/tomoyo-setprofile
/usr/sbin/tomoyo-ld-watch
<kernel> /sbin/mingetty /bin/login /bin/bash

デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、 root 以外のユーザによるポリシーの変更を許可の設定を行えば、非 root ユーザによるポリシーの変更も可能です。

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

4. ドメインに関して

4.1 ドメインとは

TOMOYO Linux は、ドメイン単位でアクセス許可を定義します。アクセス許可はドメインポリシーと呼ばれ、 /sys/kernel/security/tomoyo/domain_policy を通じてアクセス許可を定義します。

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 が実行されたものとしてドメインが定義されます。

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

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

実行しようとするプログラムの絶対パス名を取得して「パス名候補 1 」とします。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決したパス名を取得します。

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

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

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

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

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

権限のチェック

ドメインポリシーから

  • allow_execute 「パス名候補 1 」

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

遷移先の決定

(1) 例外ポリシーから

  • no_initialize_domain 「パス名候補 1 」 from 「現在のプロセスが属しているドメインのドメイン名」
  • no_initialize_domain 「パス名候補 1 」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素
  • no_initialize_domain 「パス名候補 1 」

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

(2) 例外ポリシーから

  • initialize_domain 「パス名候補 1 」 from 「現在のプロセスが属しているドメインのドメイン名」
  • initialize_domain 「パス名候補 1 」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素
  • initialize_domain 「パス名候補 1 」

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

(3) 例外ポリシーから

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

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

(4) 例外ポリシーから

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

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

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

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

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

5. キーワード詳細

/sys/kernel/security/tomoyo/profile

有効にしたい機能とそのモードを「 プロファイル番号-項目=値 」という形式で定義します。プロファイル番号は 0 ~ 255 が指定可能です。プロファイルの内容を変更するには tomoyo-setlevel コマンドまたは tomoyo-loadpolicy コマンドを使用します。

各ドメインには 1 個のプロファイルが割り当てられます。ドメインにプロファイルを割り当てるには tomoyo-setprofile コマンドまたは tomoyo-editpolicy コマンドまたは tomoyo-loadpolicy コマンドを使用します。

現在ドメインに割り当てられているプロファイル番号は tomoyo-editpolicy コマンドで確認できます。
現在動作中のプロセスに割り当てられているプロファイル番号は tomoyo-pstree コマンドで確認できます。
現在のポリシーを tomoyo-savepolicy コマンドで保存した場合、 use_profile というキーワードに保持されます。

現在のプロファイルを読み出しまたは追加するには以下のように操作します。

(例)
cat /sys/kernel/security/tomoyo/profile
tomoyo-savepolicy -p
tomoyo-setlevel 1-MAC_FOR_FILE=learning
echo 1-MAC_FOR_FILE=learning | tomoyo-loadpolicy -p

関連項目:変更について

MAC_FOR_FILE

ファイルに対する強制アクセス制御のレベルを指定します。

値内容
disabled無効。通常のカーネルと同様に動作します。
learning学習モード。ポリシーに違反してもアクセス要求を拒否することはせず、再度同じアクセス要求が発生した場合にポリシー違反とならないようにするために、ポリシーへの自動追加を行います。
permissive確認モード。ポリシーに違反してもアクセス要求を拒否することはしませんが、ポリシーへの自動追加も行いません。
enforcing強制モード。ポリシーに違反するアクセス要求を拒否します。

MAX_ACCEPT_ENTRY

学習モードに於いて自動的に追加されるアクセス許可の上限を指定します。デフォルトは 2048 件です。

TOMOYO_VERBOSE

ドメインポリシーに対する違反を表示するかどうかを指定します。

値内容
disabledドメインポリシーに対する違反を表示しません。
enabledドメインポリシーに対する違反を表示します。

/sys/kernel/security/tomoyo/domain_policy

このファイルでは、全てのドメインを定義し、各ドメインに対して与えるアクセス許可を定義します。

ドメインを定義している行( <kernel> で始まる行)の次行から次のドメインを定義している行の前行までが、そのドメインに対するアクセス許可です。

現在のドメインポリシーを読み出しまたは追加または削除するには、以下のように操作します。

(例)ドメインを選択してアクセス許可を追加(ドメインが存在しない場合は作成されます)
printf "<kernel> /sbin/init\nallow_read /etc/passwd\n" | tomoyo-loadpolicy -d

(例)ドメインを選択してアクセス許可を追加(ドメインが存在しない場合は作成されません)
printf "select <kernel> /sbin/init\nallow_read /etc/passwd\n" | tomoyo-loadpolicy -d

(例)ドメインを選択してアクセス許可を削除
printf "select <kernel> /sbin/init\ndelete allow_read /etc/passwd\ndelete allow_read /etc/shadow\n" | tomoyo-loadpolicy -d

(例)特定のドメインを削除
printf "delete <kernel> /sbin/init\n" | tomoyo-loadpolicy -d

(例)ドメインポリシーの読み出し
cat /sys/kernel/security/tomoyo/domain_policy

関連項目:変更について

allow_execute

指定されたパス名を実行することを許可します。パス名にワイルドカードを使用することは認められていません。

(例) allow_execute /bin/ls

関連項目:ドメイン遷移

allow_write

指定されたパス名を書き込みモードでオープンすることを許可します。

(例) allow_write /dev/null

allow_read

指定されたパス名を読み込みモードでオープンすることを許可します。

(例) allow_read /proc/meminfo

allow_read/write

指定されたパス名を読み書きモードでオープンすることを許可します。

(例) allow_read/write /dev/null

allow_create

指定されたパス名のファイルを新規作成することを許可します。

(例) allow_create /var/lock/subsys/crond

allow_unlink

指定されたパス名を削除することを許可します。

(例) allow_unlink /var/lock/subsys/crond

allow_mkdir

パス名で指定されたディレクトリを作成することを許可します。

(例) allow_mkdir /tmp/logwatch.\*/

allow_rmdir

ディレクトリの削除を許可します。

(例) allow_rmdir /tmp/logwatch.\*/

allow_mkfifo

FIFO の作成を許可します。

(例) allow_mkfifo /dev/initctl

allow_mksock

UNIX ドメインソケットの作成を許可します。

(例) allow_mksock /dev/log

allow_mkblock

ブロック型デバイスファイルの作成を許可します。

(例) allow_mkblock /dev/\*

allow_mkchar

キャラクタ型デバイスファイルの作成を許可します。

(例) allow_mkchar /dev/\*

allow_truncate

ファイルの切り詰めと伸長を許可します。

(例) allow_truncate /etc/mtab

allow_symlink

シンボリックリンクの作成を許可します。

(例) allow_symlink /dev/cdrom

allow_link

ハードリンクの作成を許可します。

(例) allow_link /etc/mtab~\$ /etc/mtab~

allow_rename

ファイル名の変更を許可します。

(例) allow_rename /etc/mtab.tmp /etc/mtab

allow_rewrite

deny_rewrite によりファイルの内容の上書きが禁止されているパス名が指すファイル内容の上書きを許可します。

(例) allow_rewrite /var/log/messages

関連項目: deny_rewrite

allow_chmod

DACパーミッションの変更を許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_chmod /dev/mem

allow_chown

所有者の変更を許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_chown /dev/sda

allow_chgrp

グループの変更を許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_chgrp /dev/audio

allow_ioctl

IOCTL 要求を許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_ioctl socket:[\$]

allow_mount

指定された場所へのマウントを許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_mount /proc/

allow_unmount

指定された場所のアンマウントを許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_unmount /mnt/cdrom/

allow_chroot

ルートディレクトリの移動を許可します。(カーネル 2.6.34 以降のみ有効)

(例) allow_chroot /var/empty/sshd/

allow_pivot_root

ルートディレクトリの交換を許可します。(カーネル 2.6.34 以降のみ有効)
通常、このキーワードを使う必要はありません。

use_profile

これは、このドメインに対して割り当てられているプロファイル番号を示しています。プロファイル番号は 0 ~ 255 の値をとります。

ignore_global_allow_read

これは、このドメインに対しては例外ポリシーで指定されている allow_read を無視することを示しています。特定のドメインに対して特に読み込みモードでオープンできるファイルを制限したい場合に使います。

関連項目: allow_read

quota_exceeded

これは、学習モードで動作中にアクセス許可の数が MAX_ACCEPT_ENTRY で指定された値に到達したため、このドメインに対してはアクセス許可を学習しきれなかったことを示しています。チューニングを行うなどしてアクセス許可の数を減らすようにしてください。

関連項目: MAX_ACCEPT_ENTRY

transition_failed

これは、プログラムの実行時にドメインを新規作成しようと試みたが、「新規作成されるドメインのドメイン名が長すぎる」または「カーネルがメモリを割り当てることができなかった」という理由により、ドメイン遷移を行わないままプログラムの実行を許可したことを示しています。このドメインに対して MAC_FOR_FILE=enforcing のプロファイルを割り当てる予定がある場合には、「ドメイン遷移を抑制する」または「メモリ割り当て量を増やす」ようにしてください。

関連項目: keep_domain ポリシーに割り当てられるメモリ量を制限

/sys/kernel/security/tomoyo/exception_policy

現在の例外ポリシーを読み出しまたは追加または削除するには以下のように操作します。

(例)
echo 'file_pattern /proc/\$/status' | tomoyo-loadpolicy -e
echo 'delete file_pattern /proc/\$/status' | tomoyo-loadpolicy -e
cat /sys/kernel/security/tomoyo/exception_policy

関連項目: 変更について

file_pattern

パス名のパターン化を指示するには、 file_pattern というキーワードに続けて、パス名のパターンを指定します。パス名は正規化されたパス名でなければなりません。このキーワードは実行許可を与える場合とドメイン定義には適用されません。
例えば、プロセスIDを含む正規化されたパス名( /proc/PID/ )は、アクセス制御が正しく行われるようにグループ化されなければなりません。

学習モード( MAC_FOR_FILE が learning に設定されている状態)でパス名に対するアクセスを行うと、自動的にパターン化された状態で学習されます。学習モード以外には影響しません。この構文は、既知のパターンをテンプレート化することによって、後でチューニングを行うときの手間を軽減するためだけに使われます。

path_group

パス名のグループを定義するには、 path_group というキーワードに続けて、グループ名とパス名のパターンを指定します。(カーネル 2.6.35 以降のみ有効)
 例えば、ホームディレクトリ以下の全ファイルをまとめたい場合、

path_group HOME-DIR-FILE /home/\*/\*
path_group HOME-DIR-FILE /home/\*/\{\*\}/\*

のように定義しておくことで、ドメインポリシーのファイルに対するアクセス許可を指定する際に

allow_read @HOME-DIR-FILE

のように指定できます。

allow_read

無条件に読み込みを許可するファイルを指定するには、 allow_read というキーワードに続けて、正規化されたファイル名を指定します。このキーワードの目的は、 GLIBC がプログラム実行時に参照するファイルやエラーメッセージを表示する際に参照するファイルのように、どのようなプログラムから参照されても構わないというファイルを指定することで、各ドメインで記述しないで済むようにすることです。なお、各ドメインで ignore_global_allow_read という指定をすると、ここで指定された allow_read は無視されます。

関連項目: allow_read ignore_global_allow_read

deny_rewrite

deny_rewrite というキーワードを使用して、既に記録されている部分の書き換えを禁止したいファイル(ログファイル等)のパス名を登録します。パターンが使用できます。 deny_rewrite というキーワードを使用して登録されたファイルは、ドメイン用ポリシーの中で明示的に allow_rewrite というキーワードを用いて許可が与えられない限り、追記ではない書き込みモードでのオープンとファイルの切り詰めが禁止されます。

関連項目: allow_rewrite

alias

シンボリックリンクを解決した名前ではなくシンボリックリンクの名前のまま実行させるプログラムを指定するには、 alias というキーワードに続けてシンボリックリンクを解決したパス名とシンボリックリンクを解決する前のパス名を指定します。このキーワードの目的は、実行時の名前によって異なる振る舞いをするプログラムが、ハードリンクではなくシンボリックリンクで参照される場合に、シンボリックリンクの名前でドメインを遷移できるようにすることです。

例えば /sbin/pidof は /sbin/killall5 へのシンボリックリンクであるため、通常は /sbin/pidof を実行すると /sbin/killall5 が実行されたものとしてドメインが定義されます。しかし、 alias /sbin/killall5 /sbin/pidof という指定をすることで、 /sbin/pidof を実行すると /sbin/pidof が実行されたものとしてドメインが定義されるようにできます。

関連項目: allow_execute

initialize_domain

特定のプログラムが実行された場合にドメイン遷移を初期化させるには、 initialize_domain というキーワードを使用します。

from 以降が指定されていない場合は任意のドメインから実行された場合に適用されます。ドメイン名が <kernel> で始まらない場合は、ドメイン名の最後のプログラム名が一致する全てのドメインに適用されます。

このキーワードの目的は、常駐型プログラムや必要に応じてカーネルから起動されるプログラムを、通常とは異なるドメインに遷移させることで、ドメイン遷移を集約することです。

関連項目:ドメイン遷移 no_initialize_domain

no_initialize_domain

initialize_domain の効力を打ち消すには、 no_initialize_domain というキーワードを指定します。

このキーワードはドメイン遷移を初期化させたくない場合に使用します。

関連項目:ドメイン遷移 initialize_domain

keep_domain

特定のドメインからプログラムが実行されてもドメイン遷移を行わないようにするには、 keep_domain というキーワードを使用します。

from 以前が指定されていない場合は任意のプログラムが実行された場合に適用されます。ドメイン名が <kernel> で始まらない場合は、ドメイン名の最後のプログラム名が一致する全てのドメインに適用されます。

このキーワードの目的は、不要なドメイン遷移の発生を抑制することでドメイン数とメモリ消費を抑えることです。

ドメイン遷移を抑制するには、 keep_domain ディレクティブに続けてドメイン名を指定します。

このディレクティブで指定されたドメインに属しているプロセスは、 initialize_domain ディレクティブで指定されたプログラムが実行されない限り、同じドメインに残ります。

関連項目:ドメイン遷移 no_keep_domain

no_keep_domain

keep_domain の効力を打ち消すには、 no_keep_domain というキーワードを指定します。

このキーワードはドメイン遷移を行わせたい場合に使用します。

関連項目:ドメイン遷移 keep_domain

/sys/kernel/security/tomoyo/manager

ポリシーの読み書きを行えるプログラムまたはドメインの一覧を取得または追加します。

manage_by_non_root

デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、非 root ユーザによる変更を認めたい場合に使用します。

/sys/kernel/security/tomoyo/.domain_status

tomoyo-setprofile コマンドが行単位での処理を行いやすくするために domain_policy の内容からプロファイル番号とドメイン名の部分だけを抽出したもの。DBMSのビューに相当する機能を提供します。

/sys/kernel/security/tomoyo/meminfo

TOMOYO Linux がポリシーを保持するために使用しているカーネルのメモリ情報を取得します。

(例)
cat /sys/kernel/security/tomoyo/meminfo

/sys/kernel/security/tomoyo/self_domain

呼び出し元プロセスが属しているドメインの名前を取得します。

(例)
cat /sys/kernel/security/tomoyo/self_domain

/sys/kernel/security/tomoyo/.process_status

tomoyo-pstree コマンド(「現在動作中のプロセス」と「そのプロセスが属しているドメイン」と「そのドメインに割り当てられているプロファイル番号」を pstree のように一覧表示する)のためのインタフェース。例外的にポリシーマネージャとして登録されていないプログラムでも書き込みを行える。

/sys/kernel/security/tomoyo/version

TOMOYO Linux のバージョン番号を取得するためのインタフェースです。

(例)
cat /sys/kernel/security/tomoyo/version

6. 便利な機能

6.1 root 以外のユーザによるポリシーの変更を許可

デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、非 root ユーザによる変更を認めたい場合には

# echo manage_by_non_root | /usr/sbin/tomoyo-loadpolicy -m

のように manage_by_non_root というキーワードを書き込むことで、ユーザIDと実効ユーザIDのチェックを無効にすることができます。また、再びユーザIDと実効ユーザIDのチェックを有効にするには、

# echo delete manage_by_non_root | /usr/sbin/tomoyo-loadpolicy -m

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

#! /bin/sh
echo manage_by_non_root > /sys/kernel/security/tomoyo/manager
chown -R demo /sys/kernel/security/tomoyo/

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

# chmod 755 /etc/tomoyo/tomoyo-post-init
# chown -R demo /etc/tomoyo/

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

6.2 ポリシーに割り当てられるメモリ量を制限

TOMOYO Linux のポリシーを保持しておくために割り当てられるメモリの上限(クォータ)を設定することができます。

/etc/tomoyo/tomoyo-post-init から以下のように /sys/kernel/security/tomoyo/meminfo に書き込みを行うことで設定できます。

カーネル 2.6.33 以前の場合

echo Shared: 2097152 > /sys/kernel/security/tomoyo/meminfo
echo Private: 2097152 > /sys/kernel/security/tomoyo/meminfo

カーネル 2.6.34 以降の場合

echo Policy: 2097152 > /sys/kernel/security/tomoyo/meminfo

目次へ戻る

sflogo.php