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時間を浪費してしまうのを避けるのに有効です。 |