tomoyotitle.png

Chapter 9: より詳細なプロファイルの管理

9.1. プロファイルの初期化

/usr/lib/ccs/init_policy により実行される初期設定は、アクセスを制限したい内容だけを有効にすることでポリシーの作成を容易にするために、コマンドラインオプションを指定することでカスタマイズすることができます。例えば、ファイルに関するアクセス制御だけを有効にしたい場合には --file-only-profile オプションを指定できます。コマンドラインオプションで指定した内容はポリシーディレクトリに作成されるファイルの内容を変化させるだけであり、ポリシーの作成方法を制約するものではありません。これらのファイルはポリシーエディタを用いて後からあなたの要望に沿うように修正することができます。以下に、指定可能なコマンドラインオプションの一覧を示します:

オプション

デフォルト

内容

--full-profile

指定済

全ての機能を有効にするプロファイルを作成します。 --file-only-profile オプションが指定されない限り、このオプションが指定されたものとして扱われます。

--file-only-profile

未指定

ファイルに関するアクセス制御機能のみを有効にするプロファイルを作成します。

--use_profile="$number"

0

/etc/ccs/domain_policy.conf の作成時に <kernel> ドメインに割り当てられるプロファイルの番号を指定します。この数値は 0 ~ 255 の間の整数値です。

--use_group="$number"

0

/etc/ccs/domain_policy.conf の作成時に <kernel> ドメインに割り当てられるアクセス許可グループの番号を指定します。この数値は 0 ~ 255 の間の整数値です。

--root="$rootdir"

/

ポリシーファイル用ディレクトリを生成するときのルートディレクトリを指定します。

--policy_dir="$configdir"

/etc/ccs/

ポリシーファイル用ディレクトリを指定します。もし、このオプションを指定した場合、 $configdir へのシンボリックリンクを /etc/ccs という名前で作成する必要があります。

--module_name="$name"

ccsecurity

TOMOYO Linux がローダブルカーネルモジュールとしてコンパイルされた場合( CONFIG_CCSECURITY_LKM=y )に /sbin/ccs-init から実行される /etc/ccs/ccs-load-module を作成時に指定するモジュールの名前を指定します。

--grant_log="$bool"

no

アクセス許可ログを生成するかどうかを指定します。 yes または no を指定できます。

--reject_log="$bool"

yes

アクセス拒否ログを生成するかどうかを指定します。 yes または no を指定できます。

--max_audit_log="$number"

1024

/proc/ccs/audit インタフェースに保持しておくアクセスログ(許可ログ+拒否ログ)の件数の上限を指定します。 0 以上の整数値を指定できます。アクセスログが不要な場合には 0 を指定することができます。また、バイト数での上限を /proc/ccs/stat インタフェースから指定することもできます。

--max_learning_entry="$number"

2048

学習モードで動作中にカーネルが自動的に追加することができるアクセス許可の件数の上限を指定します。 0 以上の整数値を指定できます。 0 を指定すると学習モードは確認モードと同様に振舞うようになります。バイト数での上限を /proc/ccs/stat インタフェースから指定することもできます。

--enforcing_penalty="$number"

0

強制モードでポリシー違反が発生した場合にスリープさせる時間を 0.1 秒単位で指定します。 0 以上の整数値を指定できます。CPU時間を浪費してしまうのを避けるのに有効です。

もし --file-only-profile オプションを指定せずに /usr/lib/ccs/init_policy を実行した場合、 /etc/ccs/profile.conf の CONFIG 行は以下のようになります:

0-COMMENT=-----Disabled Mode-----
0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
0-CONFIG={ mode=disabled grant_log=no reject_log=yes }
1-COMMENT=-----Learning Mode-----
1-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
1-CONFIG={ mode=learning grant_log=no reject_log=yes }
2-COMMENT=-----Permissive Mode-----
2-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
2-CONFIG={ mode=permissive grant_log=no reject_log=yes }
3-COMMENT=-----Enforcing Mode-----
3-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
3-CONFIG={ mode=enforcing grant_log=no reject_log=yes }

もし /usr/lib/ccs/init_policy --file-only-profile のように実行した場合、 /etc/ccs/profile.conf の CONFIG 行は以下のようになります:

0-COMMENT=-----Disabled Mode-----
0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
0-CONFIG::file={ mode=disabled grant_log=no reject_log=yes }
1-COMMENT=-----Learning Mode-----
1-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
1-CONFIG::file={ mode=learning grant_log=no reject_log=yes }
2-COMMENT=-----Permissive Mode-----
2-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
2-CONFIG::file={ mode=permissive grant_log=no reject_log=yes }
3-COMMENT=-----Enforcing Mode-----
3-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
3-CONFIG::file={ mode=enforcing grant_log=no reject_log=yes }

9.2. プロファイルの構文

9.2.1. 書式

各プロファイルには3種類の行が存在します:

名前

内容

COMMENT

プロファイルの内容を説明するための1行コメント。

CONFIG

アクセス制御モードの設定。

PREFERENCE

様々なオプションの設定。

9.2.2. CONFIG 行

CONFIG 行では以下のオプションを指定できます:

オプション

デフォルト

内容

grant_log="$bool"

no

アクセス許可ログを生成するかどうかを指定します。 yes または no を指定できます。

reject_log="$bool"

yes

アクセス拒否ログを生成するかどうかを指定します。 yes または no を指定できます。

mode

disabled

アクセス制御モードを指定します。以下の表を参照してください。

CONFIG 行の mode パラメータは以下の値を指定できます:

意味

disabled

無効。通常のカーネルと同様に動作する。

learning

学習モード。アクセス要求がポリシーに違反しても拒否しない。アクセス要求をポリシーへ追加する。

permissive

確認モード。アクセス要求がポリシーに違反しても拒否しない。アクセス要求をポリシーへ追加しない。

enforcing

強制モード。アクセス要求がポリシーに違反したら拒否する。アクセス要求をポリシーへ追加しない。

デフォルトでは CONFIG 行に全てのカテゴリの全ての機能についてのアクセス制御モードの設定が行われます。 CONFIG 行が指定されていない場合、 mode=disabled が指定されたものとして解釈されます。ただし、カテゴリを指定した CONFIG 行を指定することにより、デフォルトの設定を上書きすることができます:

名前

アクセス制御モードが設定される範囲

CONFIG

全ての機能

CONFIG::capability

非 POSIX ケイパビリティのみ

CONFIG::file

ファイルに関する操作のみ

CONFIG::ipc

プロセス間通信に関する操作のみ

CONFIG::misc

その他の操作のみ

CONFIG::network

ネットワークに関する操作のみ

例えば、ファイルとネットワークに関する操作のみを制限するプロファイルをプロファイル番号 4 として作成する場合、以下のように指定します:

4-COMMENT=-----Enforcing file and network-----
4-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
4-CONFIG::file={ mode=enforcing grant_log=no reject_log=yes }
4-CONFIG::network={ mode=enforcing grant_log=no reject_log=yes }

また、1つのプロファイルの中で複数のアクセス制御モードを組み合わせることも可能です。例えば、ネットワークに関する操作には強制モードを適用しつつ、ファイルに関する操作には学習モードを適用するということができます:

5-COMMENT=-----Learning file and Enforcing network-----
5-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
5-CONFIG::file={ mode=learning grant_log=no reject_log=yes }
5-CONFIG::network={ mode=enforcing grant_log=no reject_log=yes }

カテゴリ単位の設定は、機能単位の設定により上書きすることができます:

名前

アクセス制御モードが設定される範囲

CONFIG::capability::use_kernel_module

create_module(2) init_module(2) delete_module(2) の使用

CONFIG::capability::use_packet

PACKET ソケットの使用

CONFIG::capability::use_route

ROUTE ソケットの使用

CONFIG::capability::SYS_KEXEC_LOAD

kexec_load(2) の使用

CONFIG::capability::SYS_NICE

nice(2) setpriority(2) の使用

CONFIG::capability::SYS_PTRACE

ptrace(2) の使用

CONFIG::capability::SYS_REBOOT

reboot(2) の使用

CONFIG::capability::SYS_SETHOSTNAME

sethostname(2) setdomainname(2) の使用

CONFIG::capability::SYS_TIME

stime(2) settimeofday(2) adjtimex(2) の使用

CONFIG::capability::SYS_VHANGUP

vhangup(2) の使用

CONFIG::file::execute

プログラムの実行およびドメイン遷移

CONFIG::file::open

読み込みまたは書き込みモードでのファイルのオープン

CONFIG::file::create

ファイルの作成

CONFIG::file::unlink

ファイルの削除

CONFIG::file::mkdir

ディレクトリの作成

CONFIG::file::rmdir

ディレクトリの削除

CONFIG::file::mkfifo

名前付きパイプの作成

CONFIG::file::mksock

UNIXドメインソケットの作成

CONFIG::file::truncate

ファイルの切り詰め

CONFIG::file::symlink

シンボリックリンクの作成

CONFIG::file::mkblock

ブロック型デバイスファイルの作成

CONFIG::file::mkchar

キャラクタ型デバイスファイルの作成

CONFIG::file::link

ハードリンクの作成

CONFIG::file::rename

ファイルやディレクトリの名前の変更

CONFIG::file::chmod

ファイルやディレクトリのモードの変更

CONFIG::file::chown

ファイルやディレクトリの所有者の変更

CONFIG::file::chgrp

ファイルやディレクトリのグループの変更

CONFIG::file::ioctl

IOCTL の使用

CONFIG::file::chroot

ルートディレクトリの変更

CONFIG::file::mount

マウント

CONFIG::file::unmount

アンマウント

CONFIG::file::pivot_root

ルートディレクトリの交換

CONFIG::network::inet_dgram_bind

UDP ソケットが使用するローカルアドレス

CONFIG::network::inet_dgram_send

UDP ソケットが送信時に使用するリモートアドレス

CONFIG::network::inet_dgram_recv

UDP ソケットが受信時に使用するリモートアドレス

CONFIG::network::inet_stream_bind

TCP ソケットの bind() 操作

CONFIG::network::inet_stream_listen

TCP ソケットの listen() 操作

CONFIG::network::inet_stream_connect

TCP ソケットの connect() 操作

CONFIG::network::inet_stream_accept

TCP ソケットの accept() 操作

CONFIG::network::inet_raw_bind

RAW ソケットが使用するローカルアドレス

CONFIG::network::inet_raw_send

RAW ソケットが送信時に使用するリモートアドレス

CONFIG::network::inet_raw_recv

RAW ソケットが受信時に使用するリモートアドレス

CONFIG::network::unix_dgram_bind

同一ホスト内でのデータグラムソケットが使用するローカルアドレス

CONFIG::network::unix_dgram_send

同一ホスト内でのデータグラムソケットが送信してよいリモートアドレス

CONFIG::network::unix_dgram_recv

同一ホスト内でのデータグラムソケットが受信してよいリモートアドレス

CONFIG::network::unix_stream_bind

同一ホスト内でのストリームソケットが使用するローカルアドレス

CONFIG::network::unix_stream_listen

同一ホスト内でのストリームソケットが待ち受けするローカルアドレス

CONFIG::network::unix_stream_connect

同一ホスト内でのストリームソケットが接続するリモートアドレス

CONFIG::network::unix_stream_accept

同一ホスト内でのストリームソケットが受け付けるリモートアドレス

CONFIG::network::unix_seqpacket_bind

同一ホスト内での SEQPACKET ソケットが使用するローカルアドレス

CONFIG::network::unix_seqpacket_listen

同一ホスト内での SEQPACKET ソケットが待ち受けするローカルアドレス

CONFIG::network::unix_seqpacket_connect

同一ホスト内での SEQPACKET ソケットが接続するリモートアドレス

CONFIG::network::unix_seqpacket_accept

同一ホスト内での SEQPACKET ソケットが受け付けるリモートアドレス

CONFIG::misc::env

プログラム実行時の環境変数名

CONFIG::ipc::signal

シグナルの送信

例えば、プログラムの実行のみを制限するプロファイルは以下のように指定できます:

6-COMMENT=-----Enforcing file::execute only-----
6-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
6-CONFIG::file::execute={ mode=enforcing grant_log=no reject_log=yes }

パフォーマンス上の理由から、ファイルやディレクトリの属性を取得する操作だけを無効モードにしながら、その他のファイルに関する操作は強制モードにするというプロファイルを作成することもできます:

7-COMMENT=-----Enforcing file operations without getattr-----
7-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
7-CONFIG::file={ mode=enforcing grant_log=no reject_log=yes }
7-CONFIG::file::getattr={ mode=disabled grant_log=no reject_log=yes }

CONFIG::file::getattr 行は CONFIG::file 行の設定を上書きすることに注目してください。また、 CONFIG::file 行は CONFIG 行の設定(指定されていないので mode=disabled として解釈されます)を上書きすることに注目してください。このように指定することで、アクセスを制限したい操作だけを制限する詳細なプロファイルを定義することができます。

9.2.3. PREFERENCE 行

PREFERENCE 行では以下のオプションを指定できます:

名前

内容

max_audit_log

/proc/ccs/audit インタフェースに保持しておくアクセスログ(許可ログ+拒否ログ)の件数の上限を指定します。 0 以上の整数値を指定できます。アクセスログが不要な場合には 0 を指定することができます。また、バイト数での上限を /proc/ccs/stat インタフェースから指定することもできます。

max_learning_entry

学習モードで動作中にカーネルが自動的に追加することができるアクセス許可の件数の上限を指定します。 0 以上の整数値を指定できます。 0 を指定すると学習モードは確認モードと同様に振舞うようになります。バイト数での上限を /proc/ccs/stat インタフェースから指定することもできます。

enforcing_penalty

強制モードでポリシー違反が発生した場合にスリープさせる時間を 0.1 秒単位で指定します。 0 以上の整数値を指定できます。CPU時間を浪費してしまうのを避けるのに有効です。