TOMOYO Linux導入手順(保護対象限定版)

Last modified: $Date: 2006-11-25 10:18:46 +0900 (Sat, 25 Nov 2006) $

目次

準備
 カーネルのインストール
 ツールのインストール
 起動テスト
ポリシーの作成準備
 デフォルトポリシーについて
 ポリシーの変更を許可するプログラムの指定
 シャットダウン処理の修正
 プロファイルの作成
 例外ポリシーの作成
ポリシーの作成
 学習モードとチューニング
 学習モードで再学習
 確認モード
ポリシーの利用
 強制モード

準備

使用するディストリビューションの制限はありません。しかし、全てのディストリビューションで共通に使える手順書を作成することはできないため、この手順書では「RedHat Linux 9」「Fedora Core 3」「Debian Sarge」の3種類について記述します。

不要なアプリケーションは事前にアンインストールしておくことで、ポリシーのサイズを小さくすることができます。 どのアプリケーションが必要かを事前に把握しておくことを推奨します。

カーネルのインストール

TOMOYO Linux では、いくつかのコンパイル済みのカーネルをパッケージにして提供しています。コンパイル済みのカーネルを利用する場合は、以下のファイルをダウンロードしてインストールしてください。

RedHat Linux 9 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.4.20-46.9.legacy_tomoyo_1.2.i386.rpm
Fedora Core 3 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.12-2.3.legacy_FC3_tomoyo_1.2.i586.rpm
Fedora Core 4 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.17-1.2142_FC4_tomoyo_1.2.i586.rpm
Fedora Core 5 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.18-1.2200_FC5_tomoyo_1.2.i586.rpm
Fedora Core 6 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.18-1.2798_tomoyo_1.2.i586.rpm
CentOS 4.4 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.9-42.0.3.EL_tomoyo_1.2.i586.rpm
Debian Sarge (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-image-2.4.27-10sarge4-ccs_1.2_i586.deb
http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-image-2.6.8-16sarge5-ccs_1.2_i586.deb
OpenSUSE 10.1 (80586以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-default-2.6.16.21-0.25_tomoyo_1.2.i586.rpm

アーキテクチャが異なる場合やカスタマイズしたい場合には、カーネルをコンパイルする必要があります。カーネルをコンパイルする方法については、TOMOYO Linuxカーネルの作成手順を参照してください。

ツールのインストール

TOMOYO Linux では、いくつかのコンパイル済みのツールを提供しています。コンパイル済みのツールを利用する場合は、以下のファイルをダウンロードして /root/ ディレクトリの下に展開してください。

RedHat Linux 9 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-RHL9.tar.gz
Fedora Core 3 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC3.tar.gz
Fedora Core 4 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC4.tar.gz
Fedora Core 5 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC5.tar.gz
Fedora Core 6 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC6.tar.gz
CentOS 4.4 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-CentOS4.4.tar.gz
Debian Sarge (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-Sarge.tar.gz
OpenSUSE 10.1 (80386以降用) http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-SUSE10.1.tar.gz

アーキテクチャが異なる場合には、ツールをコンパイルする必要があります。ツールをコンパイルするには、以下のコマンドを実行してください。

# TOMOYO Linux ツールのソースをダウンロードする。
wget http://osdn.dl.sourceforge.jp/tomoyo/21579/ccs-tools-1.2-20060903.tar.gz
# 展開する。
tar -zxf ccs-tools-1.2-20060903.tar.gz
# コンパイルする。
make -sC ccstools/

起動テスト

TOMOYO Linux カーネルで起動して、正常に動作できることを確認できたら、 /proc/ccs/status の内容を /root/security/status.txt というファイルに保存しておいてください。このファイルに含まれる項目が、このカーネルで制御できる項目になります。このファイルは、後述する手順でプロファイルを作成する際のヒントとして使用します。

mkdir -p /root/security
cat /proc/ccs/status > /root/security/status.txt

ポリシーの作成準備

この章の作業は通常のカーネルで行うようにしてください。
TOMOYO Linux カーネルで行うと、シャットダウン時に /root/ccstools/savepolicy が実行されるために /root/security/exception_policy.txt に加えた変更内容が失われてしまいます。

デフォルトポリシーについて

TOMOYO Linux には、ソフトウェアと一緒に配布されるデフォルトポリシーはありません。学習モードを使用して策定する必要があります。
参考までに、サンプルのポリシーを置いてあります。参照は自由ですが、デフォルトポリシーとしての利用はしないでください。

ポリシーの変更を許可するプログラムの指定

/root/security/manager.txt を作成し、その中にポリシーの変更を許可したいプログラムを指定します。
具体的には、ポリシーを再読み込みする loadpolicy 、ポリシーを編集する editpolicy 、制御レベルを変更する setlevel 、無条件読み込み許可を更新する ld-watch 、対話的にアクセス要求を許可する ccs-queryd の5つを指定してください。

cat > /root/security/manager.txt << EOF
/root/ccstools/loadpolicy
/root/ccstools/editpolicy
/root/ccstools/setlevel
/root/ccstools/ld-watch
/root/ccstools/ccs-queryd
EOF

シャットダウン処理の修正

電源が切れる直前にメモリ上のポリシーをディスク上に保存するために、シャットダウンスクリプトの中で /root/ccstools/savepolicy が実行されるように修正します。具体的な修正箇所はディストリビューション毎に異なります。多くの場合、 /etc/init.d/ ディレクトリ直下にあるシャットダウンを行うスクリプトの最後に実行されるプログラムが電源を切るためのプログラムなので、その直前で保存するように修正します。

RedHat Linux 9 および Fedora Core 3 の場合は以下のように修正してください。

/etc/rc.d/init.d/halt
修正前修正後

exec $command $HALTARGS
/root/ccstools/savepolicy
exec $command $HALTARGS

Debian Sarge の場合は以下のように修正してください。 savepolicy の前に halt/reboot を一度実行しているのは halt/reboot を実行するドメインを作成するためです。

/etc/init.d/halt/etc/init.d/reboot
修正前修正後修正前修正後


halt -d -f -i $poweroff $hddown
halt --help 2> /dev/null
/root/ccstools/savepolicy
halt -d -f -i $poweroff $hddown


reboot -d -f -i
reboot --help 2> /dev/null
/root/ccstools/savepolicy
reboot -d -f -i

プロファイルの作成

TOMOYO Linuxでは、ファイル以外にもいくつかの項目について強制アクセス制御を行うことができますが、ポリシー管理の負担を減らすために、必要の無い機能を無効化できるようになっています。

有効にしたい機能とそのモードを記述した初期制御レベル定義ファイルを1つ以上作成し、カーネル起動時のコマンドラインから番号を指定することで切り替えができるようになっています。具体的には、カーネル起動時のコマンドラインで CCS=$INDEX ($INDEX は整数)というパラメータを指定すると、対応する /root/security/profile$INDEX.txt が読み込まれます。

以下の説明を参照しながら、用途毎のプロファイルを作成してください。 /root/security/status.txt に含まれる項目だけが指定可能です。 /root/security/status.txt に含まれる項目の数は、カーネルコンパイル時の設定により変化します。

項目制御する内容自動学習対応
MAC_FOR_FILEファイルの読み書き実行
MAX_ACCEPT_FILES学習モードで自動的に追加されるアクセス許可の上限を指定する。
MAX_GRANT_LOGメモリ上に保持するアクセス許可ログの上限を指定する。
MAX_REJECT_LOGメモリ上に保持するアクセス拒否ログの上限を指定する。
TOMOYO_VERBOSEドメイン別ポリシーに対する違反を syslog に表示する。
MAX_ENFORCE_GRACE強制モードでポリシー違反が発生した場合に、アクセス要求を拒否するまでの猶予時間を指定する。

MAX_ACCEPT_FILES については以下の値を指定できます。

内容
任意の整数学習モードで自動的に追加されるアクセス許可の上限。デフォルトはカーネルのコンパイル時に指定。

MAX_GRANT_LOG および MAX_REJECT_LOG については以下の値を指定できます。

内容
任意の整数カーネル内に保持するアクセスログの件数。デフォルトはカーネルのコンパイル時に指定。ログが不要ならば 0 を指定する。

TOMOYO_VERBOSE については以下の値を指定できます。

内容
0ドメイン別ポリシーに対する違反を表示しない。
1ドメイン別ポリシーに対する違反を表示する。

MAX_ENFORCE_GRACE については以下の値を指定できます。

内容
任意の整数強制モードで動作中にポリシー違反が発生してから、そのアクセス要求を拒否するまでの猶予期間を秒単位で指定する。この時間内に管理者がそのアクセス要求を許可するように指示した場合、そのアクセス要求は許可される。

上記以外については以下の値を指定できます。

内容
0無効。通常のカーネルと同様に動作する。
1学習モード。ポリシーに違反しても警告をエラーにせず、ポリシーへの自動追加を行う。
2許容モード。ポリシーに違反してもエラーにせず、ポリシーへの自動追加も行わない。
3強制モード。ポリシーに違反したらエラーとする。

例外ポリシーの作成

全てのシステムに共通して存在している可能性が高いパス名のパターンを事前に登録しておきます。
/root/security/exception_policy.txt に file_pattern というキーワードを使用してパス名のパターンを登録します。
アクセス許可を学習する際に、要求されたパス名が file_pattern というキーワードを使用して登録されたパス名のパターンと一致した場合、パターン化されたパス名でアクセス許可が学習されます。
目安としては以下のものが挙げられます。

システムにインストールされているアプリケーションやその設定により、上記以外にもパターン化されたパス名が必要になります。不足しているパターンは実際にアクセス許可を学習させてから、適切にパターン化して追加します。

全てのプログラムへの読み込みアクセスを許可するファイルを登録しておきます。
/root/security/exception_policy.txt に allow_read というキーワードを使用してパス名を登録します。パターンは使用できません。
読み込みモードで要求されたパス名が allow_read というキーワードを使用して登録されたパス名と一致した場合、その場で読み込みアクセスが許可されます。
目安としては以下のものが挙げられます。

以上の操作を自動的に行うためのスクリプトが用意されています。以下のように実行してください。

/root/ccstools/make_targeted_exception.sh | sort | uniq > /root/security/exception_policy.txt

次に、強制アクセス制御を適用したいプログラムを指定します。以下のコマンドを実行すると、いくつかのプログラムが表示されます。

/root/ccstools/make_exception.sh | grep '^initializer' | sort | uniq

もし、 /usr/sbin/httpd と /usr/sbin/httpd から起動されるプログラムだけを強制アクセス制御の対象としたい場合、以下のように指定してください。

initializer /usr/sbin/httpd

このようにすると、 /usr/sbin/httpd および /usr/sbin/httpd から起動されるプログラムは「<kernel> /usr/sbin/httpd」ドメインおよびその子孫ドメインに属することで強制アクセス制御が適用されます。

もし、 /usr/sbin/sshd と /usr/sbin/sshd から起動されるプログラムだけを強制アクセス制御の対象としたい場合、以下のように指定してください。

initializer /usr/sbin/sshd

このようにすると、 /usr/sbin/sshd および /usr/sbin/sshd から起動されるプログラムは「<kernel> /usr/sbin/sshd」ドメインおよびその子孫ドメインに属することで強制アクセス制御が適用されます。

ポリシーの作成

学習モードとチューニング

起動方法

起動時のブートプロンプトで TOMOYO Linuxカーネルを選択し、学習モード用のプロファイル番号を CCS= に指定して起動します。1回目は TOMOYO_NOLOAD パラメータも指定してください。 TOMOYO_NOLOAD というパラメータを指定すると、ドメイン単位のポリシー(domain_policy.txt)をロードしないで再起動することができます。(つまり、起動時のブートプロンプトで TOMOYO Linuxカーネルを選択し、学習モード用のプロファイル番号を CCS= に指定するのに加えて、 TOMOYO_NOLOAD も指定して起動します。)

保護対象の確認

以下のコマンドを実行すると、強制アクセス制御が適用されていないプロセスのIDの一覧が表示されます。

cat /proc/ccs/info/trusted_pids

保護したいプログラムのプロセスIDが表示されていないことを確認してください。もし、保護したいプログラムが表示される場合、以下の手順を実行してください。

・/root/ccstools/editpolicy e を実行する。
・矢印キーで上下へ移動し、「initializer 保護したいプログラム」という行が存在しないことを確認する。例えば、 /usr/sbin/squid を保護したい場合、「initializer /usr/sbin/squid」という行が存在しないことを確認する。
・a を押すと「Enter new entry>」というプロンプトが表示されるので、 「initializer 保護したいプログラム」と入力し、 Enter を押す。
・矢印キーで上下へ移動し、「initializer 保護したいプログラム」という行が存在していることを確認する。
・q を押して終了する。
・保護したいプログラムを再起動させる。
・/proc/ccs/info/trusted_pids の内容を確認し、保護したいプログラムのプロセスIDが表示されないことを確認する。

挙動の調査

許可したい操作に必要なアクセス許可を学習させます。

1回で全てのアクセスパターンを学習できるとは限らないので、何度か繰り返します。
また、起動時や終了時にのみ行われる操作も存在するため、再起動も何度か繰り返します。

学習モードで動作中には、以下のようなメッセージが表示される場合があります。

TOMOYO-WARNING: Domain '<kernel> ...' has so many ACLs to hold. Stopped auto-append mode.

これは、特定のプログラムがあまりにも多くのファイルにアクセスしたものだから、メモリの浪費と応答速度の悪化を防ぐために安全装置が作動したことを知らせるメッセージです。安全装置が作動すると、このドメインに対してはファイルに対するアクセス許可がこれ以上自動的に追加されないようになります。

このメッセージに対処するには、手作業でアクセス許可を修正する必要があります。
例えば、以下のメッセージが表示された場合、適切なパターンを利用してグループ化することで <kernel> /usr/sbin/hald というドメインに対するアクセス許可の数を減らす必要があります。

TOMOYO-WARNING: Domain '<kernel> /usr/sbin/hald' has so many ACLs to hold. Stopped auto-append mode.

パス名のパターン化

以下のコマンドを実行すると、テンポラリであると思われるパス名が表示されます。

/root/ccstools/findtemp < /proc/ccs/policy/domain_policy | sort | uniq

適切にパターン化した上で以下の手順を実行してください。

・/root/ccstools/editpolicy e を実行する。
・矢印キーで上下へ移動し、「file_pattern パス名のパターン」という行が存在しないことを確認する。例えば、 /tmp/sh-thd-\$ というパターンを追加したい場合、「file_pattern /tmp/sh-thd-\$」という行が存在しないことを確認する。
・a を押すと「Enter new entry>」というプロンプトが表示されるので、 「file_pattern パス名のパターン」と入力し、 Enter を押す。
・矢印キーで上下へ移動し、「file_pattern パス名のパターン」という行が存在していることを確認する。
・q を押して終了する。

テンポラリの基準としては、「最後の6文字だけが異なるパス名が複数存在している」「パス名の中の数値部分だけが異なるパス名が複数存在している」等があります。
パターン化する際の例を以下に示します。これらはインストールされているアプリケーションや設定により存在しなかったり違うディレクトリに存在していたりすることがあります。

アクセス許可条件の付与

TOMOYO Linux 1.2 では、個々のアクセス許可に対して必要に応じて条件を付けることができます。これにより、システムアカウントのユーザIDに基づくアクセス制御が可能です。

匿名ではない FTP サーバを保護する場合、以下のように条件を付けることで、当該ユーザのホームディレクトリ以外へのアクセスを禁止することができるようになります。ホームディレクトリ以下全部を FTP でアクセス可能にすることは、侵入された場合に被害が大きくなるため、自分のホームディレクトリにある ftp ディレクトリ以下だけのアクセスを認めます。 vsftpd を用いる場合、例えば以下のように許可を与えます。

修正前
<kernel> /usr/sbin/vsftpd

6 /home/\*/ftp/\*
6 /home/\*/ftp/\*/\*
6 /home/\*/ftp/\*/\*/\*
6 /home/\*/ftp/\*/\*/\*/\*

allow_mkdir /home/\*/ftp/\*/
allow_mkdir /home/\*/ftp/\*/\*/
allow_mkdir /home/\*/ftp/\*/\*/\*/

allow_rmdir /home/\*/ftp/\*/
allow_rmdir /home/\*/ftp/\*/\*/
allow_rmdir /home/\*/ftp/\*/\*/\*/

allow_create /home/\*/ftp/\*
allow_create /home/\*/ftp/\*/\*
allow_create /home/\*/ftp/\*/\*/\*
allow_create /home/\*/ftp/\*/\*/\*/\*

allow_truncate /home/\*/ftp/\*
allow_truncate /home/\*/ftp/\*/\*
allow_truncate /home/\*/ftp/\*/\*/\*
allow_truncate /home/\*/ftp/\*/\*/\*/\*

allow_unlink /home/\*/ftp/\*
allow_unlink /home/\*/ftp/\*/\*
allow_unlink /home/\*/ftp/\*/\*/\*
allow_unlink /home/\*/ftp/\*/\*/\*/\*

allow_rename /home/\*/ftp/\* /home/\*/ftp/\*
allow_rename /home/\*/ftp/\*/\* /home/\*/ftp/\*/\*
allow_rename /home/\*/ftp/\*/\*/\* /home/\*/ftp/\*/\*/\*
allow_rename /home/\*/ftp/\*/\*/\*/\* /home/\*/ftp/\*/\*/\*/\*

allow_rename /home/\*/ftp/\*/ /home/\*/ftp/\*/
allow_rename /home/\*/ftp/\*/\*/ /home/\*/ftp/\*/\*/
allow_rename /home/\*/ftp/\*/\*/\*/ /home/\*/ftp/\*/\*/\*/
修正後
<kernel> /usr/sbin/vsftpd

6 /home/\*/ftp/\* if task.uid=path1.uid
6 /home/\*/ftp/\*/\* if task.uid=path1.uid
6 /home/\*/ftp/\*/\*/\* if task.uid=path1.uid
6 /home/\*/ftp/\*/\*/\*/\* if task.uid=path1.uid

allow_mkdir /home/\*/ftp/\*/ if task.uid=path1.parent.uid
allow_mkdir /home/\*/ftp/\*/\*/ if task.uid=path1.parent.uid
allow_mkdir /home/\*/ftp/\*/\*/\*/ if task.uid=path1.parent.uid

allow_rmdir /home/\*/ftp/\*/ if task.uid=path1.uid
allow_rmdir /home/\*/ftp/\*/\*/ if task.uid=path1.uid
allow_rmdir /home/\*/ftp/\*/\*/\*/ if task.uid=path1.uid

allow_create /home/\*/ftp/\* if task.uid=path1.parent.uid
allow_create /home/\*/ftp/\*/\* if task.uid=path1.parent.uid
allow_create /home/\*/ftp/\*/\*/\* if task.uid=path1.parent.uid
allow_create /home/\*/ftp/\*/\*/\*/\* if task.uid=path1.parent.uid

allow_truncate /home/\*/ftp/\* if task.uid=path1.uid
allow_truncate /home/\*/ftp/\*/\* if task.uid=path1.uid
allow_truncate /home/\*/ftp/\*/\*/\* if task.uid=path1.uid
allow_truncate /home/\*/ftp/\*/\*/\*/\* if task.uid=path1.uid

allow_unlink /home/\*/ftp/\* if task.uid=path1.uid
allow_unlink /home/\*/ftp/\*/\* if task.uid=path1.uid
allow_unlink /home/\*/ftp/\*/\*/\* if task.uid=path1.uid
allow_unlink /home/\*/ftp/\*/\*/\*/\* if task.uid=path1.uid

allow_rename /home/\*/ftp/\* /home/\*/ftp/\* if task.uid=path1.parent.uid task.uid=path2.parent.uid
allow_rename /home/\*/ftp/\*/\* /home/\*/ftp/\*/\* if task.uid=path1.parent.uid task.uid=path2.parent.uid
allow_rename /home/\*/ftp/\*/\*/\* /home/\*/ftp/\*/\*/\* if task.uid=path1.parent.uid task.uid=path2.parent.uid
allow_rename /home/\*/ftp/\*/\*/\*/\* /home/\*/ftp/\*/\*/\*/\* if task.uid=path1.parent.uid task.uid=path2.parent.uid

allow_rename /home/\*/ftp/\*/ /home/\*/ftp/\*/ if task.uid=path1.parent.uid task.uid=path2.parent.uid
allow_rename /home/\*/ftp/\*/\*/ /home/\*/ftp/\*/\*/ if task.uid=path1.parent.uid task.uid=path2.parent.uid
allow_rename /home/\*/ftp/\*/\*/\*/ /home/\*/ftp/\*/\*/\*/ if task.uid=path1.parent.uid task.uid=path2.parent.uid

Samba サーバを保護する場合、以下のように条件を付けることで、当該ユーザのホームディレクトリ以外へのアクセスを禁止することができるようになります。ホームディレクトリ以下全部を Samba でアクセス可能にすることは、侵入された場合に被害が大きくなるため、自分のホームディレクトリにある samba ディレクトリ以下だけのアクセスを認めます。

修正前
<kernel> /usr/sbin/smbd

6 /home/\*/samba/\*
6 /home/\*/samba/\*/\*
6 /home/\*/samba/\*/\*/\*
6 /home/\*/samba/\*/\*/\*/\*

allow_mkdir /home/\*/samba/\*/
allow_mkdir /home/\*/samba/\*/\*/
allow_mkdir /home/\*/samba/\*/\*/\*/

allow_rmdir /home/\*/samba/\*/
allow_rmdir /home/\*/samba/\*/\*/
allow_rmdir /home/\*/samba/\*/\*/\*/

allow_create /home/\*/samba/\*
allow_create /home/\*/samba/\*/\*
allow_create /home/\*/samba/\*/\*/\*
allow_create /home/\*/samba/\*/\*/\*/\*

allow_truncate /home/\*/samba/\*
allow_truncate /home/\*/samba/\*/\*
allow_truncate /home/\*/samba/\*/\*/\*
allow_truncate /home/\*/samba/\*/\*/\*/\*

allow_unlink /home/\*/samba/\*
allow_unlink /home/\*/samba/\*/\*
allow_unlink /home/\*/samba/\*/\*/\*
allow_unlink /home/\*/samba/\*/\*/\*/\*

allow_rename /home/\*/samba/\* /home/\*/samba/\*
allow_rename /home/\*/samba/\*/\* /home/\*/samba/\*/\*
allow_rename /home/\*/samba/\*/\*/\* /home/\*/samba/\*/\*/\*
allow_rename /home/\*/samba/\*/\*/\*/\* /home/\*/samba/\*/\*/\*/\*

allow_rename /home/\*/samba/\*/ /home/\*/samba/\*/
allow_rename /home/\*/samba/\*/\*/ /home/\*/samba/\*/\*/
allow_rename /home/\*/samba/\*/\*/\*/ /home/\*/samba/\*/\*/\*/
修正後
<kernel> /usr/sbin/smbd

6 /home/\*/samba/\* if task.euid=path1.uid
6 /home/\*/samba/\*/\* if task.euid=path1.uid
6 /home/\*/samba/\*/\*/\* if task.euid=path1.uid
6 /home/\*/samba/\*/\*/\*/\* if task.euid=path1.uid

allow_mkdir /home/\*/samba/\*/ if task.euid=path1.parent.uid
allow_mkdir /home/\*/samba/\*/\*/ if task.euid=path1.parent.uid
allow_mkdir /home/\*/samba/\*/\*/\*/ if task.euid=path1.parent.uid

allow_rmdir /home/\*/samba/\*/ if task.euid=path1.uid
allow_rmdir /home/\*/samba/\*/\*/ if task.euid=path1.uid
allow_rmdir /home/\*/samba/\*/\*/\*/ if task.euid=path1.uid

allow_create /home/\*/samba/\* if task.euid=path1.parent.uid
allow_create /home/\*/samba/\*/\* if task.euid=path1.parent.uid
allow_create /home/\*/samba/\*/\*/\* if task.euid=path1.parent.uid
allow_create /home/\*/samba/\*/\*/\*/\* if task.euid=path1.parent.uid

allow_truncate /home/\*/samba/\* if task.euid=path1.uid
allow_truncate /home/\*/samba/\*/\* if task.euid=path1.uid
allow_truncate /home/\*/samba/\*/\*/\* if task.euid=path1.uid
allow_truncate /home/\*/samba/\*/\*/\*/\* if task.euid=path1.uid

allow_unlink /home/\*/samba/\* if task.euid=path1.uid
allow_unlink /home/\*/samba/\*/\* if task.euid=path1.uid
allow_unlink /home/\*/samba/\*/\*/\* if task.euid=path1.uid
allow_unlink /home/\*/samba/\*/\*/\*/\* if task.euid=path1.uid

allow_rename /home/\*/samba/\* /home/\*/samba/\* if task.euid=path1.parent.uid task.euid=path2.parent.uid
allow_rename /home/\*/samba/\*/\* /home/\*/samba/\*/\* if task.euid=path1.parent.uid task.euid=path2.parent.uid
allow_rename /home/\*/samba/\*/\*/\* /home/\*/samba/\*/\*/\* if task.euid=path1.parent.uid task.euid=path2.parent.uid
allow_rename /home/\*/samba/\*/\*/\*/\* /home/\*/samba/\*/\*/\*/\* if task.euid=path1.parent.uid task.euid=path2.parent.uid

allow_rename /home/\*/samba/\*/ /home/\*/samba/\*/ if task.euid=path1.parent.uid task.euid=path2.parent.uid
allow_rename /home/\*/samba/\*/\*/ /home/\*/samba/\*/\*/ if task.euid=path1.parent.uid task.euid=path2.parent.uid
allow_rename /home/\*/samba/\*/\*/\*/ /home/\*/samba/\*/\*/\*/ if task.euid=path1.parent.uid task.euid=path2.parent.uid

SSH サーバを保護する場合、以下のように条件を付けることで、 root ユーザとしてログインすることを禁止できます。

修正前修正後
<kernel> /usr/sbin/sshd

1 /bin/bash
<kernel> /usr/sbin/sshd

1 /bin/bash if task.uid!=0 task.euid!=0

指定可能な条件については条件付きアクセス許可を参照してください。

アクセス許可のパターン化

WWW サーバがアクセスするコンテンツのように、自動学習では必ずしもアクセスされないファイルに対するアクセス許可を /root/security/domain_policy.txt に追加します。
以下の例では、 /usr/sbin/httpd に対して /var/www/html/ 以下の読み込みを許可しています。

<kernel> /usr/sbin/httpd
4 /var/www/html/\*
4 /var/www/html/\*/\*
4 /var/www/html/\*/\*/\*
4 /var/www/html/\*/\*/\*/\*
4 /var/www/html/\*/\*/\*/\*/\*

同様に、パターンを使用して手作業でのグループ化を行います。
以下の例では、 /usr/sbin/smbd に対して全てのログファイルを同様に扱うように指示しています。

修正前修正後
<kernel> /usr/sbin/smbd
2 /var/log/samba/host1.log
2 /var/log/samba/host2.log
2 /var/log/samba/host3.log
2 /var/log/samba/host4.log
2 /var/log/samba/host5.log
<kernel> /usr/sbin/smbd
2 /var/log/samba/\*.log

学習モードで再学習

ドメイン別ポリシーを最初から学習しなおします。起動時のブートプロンプトで TOMOYO Linux カーネルを選択し、学習モード用のプロファイル番号を CCS= に指定して起動します。1回目は TOMOYO_NOLOAD パラメータも指定してください。

確認モード

起動時のブートプロンプトで TOMOYO Linux カーネルを選択し、許容モード用のプロファイル番号を CCS= に指定して起動します。

許可したい操作を行ってもエラーメッセージが表示されないことを確認してください。

正常に動作すればポリシーの完成です。

ポリシーの利用

強制モード

起動時のブートプロンプトで TOMOYO Linux カーネルを選択し、強制モード用のプロファイル番号を CCS= に指定して起動します。