# TOMOYO Linux 導入手順書 （Turbolinux 11 Server版）

- 概要
- ツールのインストール
- 自動設定スクリプトの実行
- 監査ログの取得準備
- 運用
  - システムの起動
  - ログイン後の操作の学習
  - ポリシーの参照
  - 強制アクセス制御

## 概要

以下では、Turbolinux 11 Server で TOMOYO Linux 1.6.6を利用する手順を解説します。 この手順書に従って操作すれば、TOMOYO Linuxの基本的な機能を体験し、簡単な設定と運用が行えるようになります。

導入の流れは以下の通りです。

1. ツールのインストール
2. 基本的な設定
3. ポリシーの自動学習と試験運用

## ツールのインストール

TOMOYO Linuxのツールをインストールします。ツールには、ポリシーの管理を行うプログラムが収録されています。

Turbolinux 11 Serverにはバイナリパッケージが提供されていますので、それを利用します。

    # wget -O ccs-tools-1.6.6-1.TL11S.i686.rpm 'http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/30299/ccs-tools-1.6.6-1.TL11S.i686.rpm'
    # rpm -ivh ccs-tools-1.6.6-1.TL11S.i686.rpm

以上でTOMOYO Linuxのインストールは終了です。続いて設定に移ります。

## 自動設定スクリプトの実行

この節の操作を自動で行うスクリプトが付属しているのでそれを実行します。

    # /usr/lib/ccs/init_policy.sh --file-only-profile

init_policy.shは10分以上時間を要する場合がありますので気長にお待ちください。

### 設定の保存ディレクトリについて

TOMOYO Linuxの設定を保存するディレクトリは/etc/ccsです。

### プロファイルについて

TOMOYO Linuxには多くの機能があり、どの機能をON/OFFにするのかの設定をプロファイルとよびます。 プロファイルは複数作成して切り替えて使うことができます。 すべてのプロファイルは/etc/ccs/profile.confという単一のファイルに保存します。

今回はファイルに対するアクセス制御の機能のみを利用するため、 /etc/ccs/profile.confの内容は以下のようなっているはずです。

    0-COMMENT=-----Disabled Mode-----
    0-MAC_FOR_FILE=disabled
    0-TOMOYO_VERBOSE=disabled
    1-COMMENT=-----Learning Mode-----
    1-MAC_FOR_FILE=learning
    1-TOMOYO_VERBOSE=disabled
    2-COMMENT=-----Permissive Mode-----
    2-MAC_FOF_FILE=permissive
    2-TOMOYO_VERBOSE=enabled
    3-COMMENT=-----Enforcing Mode-----
    3-MAC_FOR_FILE=enforcing
    3-TOMOYO_VERBOSE=enabled

profile.confの1行は以下のような構文になっています。

    （プロファイル番号）-（設定項目）=（制御モード）

すなわち、行頭の番号がプロファイルを切り替えるためのプロファイル番号で、 '=' の左が設定項目、'=' の右が制御モードです。

設定項目COMMENTは、プロファイルを区別しやすくするためのコメントで、TOMOYO Linuxの機能には影響を与えません。

設定項目MAC_FOR_FILEは「ファイルに対するアクセス制御」を表しており、 制御モードがdisabledなら無効、learningなら学習、permissiveなら確認（アクセス拒否ログを出力するが実際には拒否しない）、enforcingなら強制、という設定が行えます。

設定項目TOMOYO_VERBOSEは「アクセス拒否の情報をコンソールに出力するかどうか」を表しており、 制御モードがdisabledなら出力なし、enabledなら出力ありになります。

上記設定では、プロファイル番号が0～3の4つのプロファイルを作成しており、それぞれの意味は以下のようになります。

プロファイル0 | ファイルに対するアクセス制御を無効にする、コンソールにアクセス拒否を出力しない
プロファイル1 | ファイルに対するアクセス制御を学習モードにする、コンソールにアクセス拒否を出力しない
プロファイル2 | ファイルに対するアクセス制御を確認モードにする、コンソールにアクセス拒否を出力する
プロファイル3 | ファイルに対するアクセス制御を強制モードにする、コンソールにアクセス拒否を出力する

プロファイル1の学習モードで行ったアクセスを元にポリシーを作成し、 プロファイル2の確認モードで仮運用して必要なポリシーが作成できているかを確かめ、 プロファイル3の強制モードで本運用としてアクセス制御を行う、 というのが基本的な運用の流れです。

### ポリシーの変更を許可するプログラムについて

ポリシーを変更することができるプログラムは、/etc/ccs/manager.confというファイルで指定します。 以下のプログラムが指定されているはずです。

    /usr/lib/ccs/loadpolicy
    /usr/lib/ccs/editpolicy
    /usr/lib/ccs/setlevel
    /usr/lib/ccs/setprofile
    /usr/lib/ccs/ld-watch
    /usr/lib/ccs/ccs-queryd

### 例外ポリシーについて

/etc/ccs/exception_policy.conf には以下の 12 種類の例外が指定されています。

1. パス名のパターン
2. パス名のグループ
3. アドレスのグループ
4. 無条件に参照を許可するファイル
5. 無条件に利用を許可する環境変数
6. 内容を上書きすることを禁止するファイル
7. シンボリックリンク経由で実行できるプログラム
8. 類似するプログラムの集約
9. ドメイン遷移を初期化させるプログラム
10. ドメイン遷移の初期化を抑制させるプログラム
11. ドメイン遷移を抑制させるプログラム
12. ドメイン遷移を再開させるプログラム

## 監査ログの取得準備

TOMOYO Linuxのログは、アクセスが許可された要求のログと、アクセスが拒否された要求のログの2種類に分けることができます。 今回は、アクセス拒否ログのみを保存する設定を行います。

ログを保存するには、ccs-toolsのccs-auditdというデーモンプログラムを使用します。 アクセス拒否ログのみを保存する設定でccs-auditdをLinuxの起動時に実行するには、 以下のコマンドで/etc/rc.d/rc.localの末尾にccs-auditdの起動コマンドを追加します。

    # echo "/usr/sbin/ccs-auditd /dev/null /var/log/tomoyo/reject_log.txt" >> /etc/rc.d/rc.local

この設定では、/var/log/tomoyo/reject_log.txtにアクセス拒否ログが保存されます。 ログを保存するディレクトリをあらかじめ作っておきます。

    # mkdir -p /var/log/tomoyo

以上でTOMOYO Linuxを使うための基本的な設定は終わりです。

## 運用

### システムの再起動

/sbin/ccs-init を実行してください。

    # /sbin/ccs-init

問題が無ければすぐに終了します。

Linux を再起動してください。

    # reboot

起動プロセスが終了するとログインプロンプトが表示されるので、rootでログインしてください。

### ログイン後の操作の学習

今回は、以下の操作をTOMOYO Linuxに学習させ、強制モードでは学習させた操作以外が拒否されることを確かめます。

1. dateコマンドを実行する
2. headコマンドで/etc/passwdの先頭3行を表示する
3. tcshを起動する
4. tailコマンドで/etc/passwdの末尾3行を表示する
5. tcshを終了する

まずは学習モードの設定を行います。

プロファイル1が学習モードです。 このプロファイルを以下のコマンドで/sbin/mingettyから起動されるプログラムに割り当てます。

    # /usr/sbin/ccs-setprofile -r 1 '<kernel> /sbin/mingetty'

このコマンドは、

> /sbin/mingettyから起動されるプログラムすべてにプロファイル1を割り当てる

という意味です。/sbin/mingettyはログインシェルを起動するプログラムで、 /sbin/mingetty以下にプロファイル1を割り当てることで、ログイン後の操作を学習する設定になります。 設定は即時に有効になるので、上記ccs-setprofileコマンドを実行したあとは既に学習モードになっています。

<kernel> /sbin/mingettyを引用符で囲まないと、シェルのリダイレクト機能が働いて /sbin/mingettyの内容が書き換えられてしまいますのでくれぐれもご注意ください。

それでは、前述の4つの操作を学習させましょう。学習は通常のLinuxのように操作することで行えます。

一見普通のLinuxと変わりなく操作できますが、 裏ではTOMOYO Linuxがアクセス許可を監視し、 操作ごとにポリシーとしてメモリ上に記憶しています。

### ポリシーの参照

生成されたポリシーの参照・編集には、ccs-toolsのccs-editpolicyを用います。

    # /usr/sbin/ccs-editpolicy

ccs-editpolicyを起動すると、TOMOYO Linux起動後に、プロセスがどのように呼び出されたかが表示されます。 この「プロセスの呼び出し」を、TOMOYO Linuxでは「ドメイン遷移」とよびます。

ドメイン遷移の中から、mingettyを探してみてください。ドメイン遷移からmingettyを検索するには、 'f'キーを押して、下に出たプロンプトで"mingetty"と入力してEnterキーを押します。

行番号の右側に表示されている数字は、そのドメインに割り当てられているプロファイル番号です。 /sbin/mingetty 以下のドメインが 1 になっているのは、先ほど ccs-setprofile コマンドを用いて 1 を割り当てたためです。

/sbin/mingetty下の/bin/login以下では、ログインしてからのプロセス実行履歴が分かります。 その中からさらに、/bin/headコマンドを探してみてください。 headコマンドの行でEnterキーを押すと、以下の画面が表示されます。

これは先ほどの操作で学習したポリシーで、

> <kernel> /sbin/mingetty /bin/login /bin/bash /bin/headというドメイン（赤下線）は、

> - /etc/passwdへの読み込みアクセスを許可する（青下線）

ということを意味しています。

TOMOYO Linuxでは、 「プログラムの絶対パスで表現したプロセスの実行履歴」をドメインとよびます。 すべてのプロセスはいずれか1つのドメインに所属しており、 アクセス制御はドメインごとにポリシーとして設定します。

ドメインにおけるファイルに対するアクセス許可は、 通常のLinuxにおけるファイルに対するパーミッションと 同様の3種類（読み込み・書き込み・実行）の他にも、 ファイルの新規作成・削除・名前変更なども設定できます。

ポリシーはメモリ上に置かれており、このままLinuxをシャットダウンしてしまうと、 学習したポリシーも失われてしまいます。ポリシーをハードディスクの/etc/ccs以下に 保存するには以下のようにします。

    # /usr/sbin/ccs-savepolicy

### 強制アクセス制御

それでは、先ほど自動学習したポリシーを使って、強制アクセス制御を体験してみましょう。

'q'キーでccs-editpolicyを終了してから、以下のコマンドを実行します。

    # /usr/sbin/ccs-setprofile -r 3 '<kernel> /sbin/mingetty'

この操作により、/sbin/mingetty以下のドメインに強制アクセス制御が適用されるようになります。

この状態で以下の操作を行ってみます。

1. dateコマンドを実行
2. headコマンドで/etc/passwdの先頭3行を表示
3. tailコマンドで/etc/passwdの末尾3行を表示（エラー）
4. headコマンドで/etc/shadowの先頭3行を表示（エラー）
5. tcshを起動
6. dateコマンドを実行（エラー）

図中の赤下線のコマンドは先ほど学習モードで行った操作ですので、問題なく実行できます。 逆に青下線のコマンドはエラーになります。

エラーになった操作のログは、ccs-auditdによって/var/log/tomoyo/reject_log.txtに保存されています。

> #2009-02-20 16:16:35# profile=3 mode=enforcing pid=3664 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 state[0]=0 state[1]=0 state[2]=0 argc=3 envc=19 argv[]={ "tail" "-3" "/etc/passwd" } envp[]={ "HOSTNAME=localhost.localdomain" "TERM=linux" "SHELL=/bin/bash" "HISTSIZE=1000" "USER=root" "ENV=/root/.bashrc" "USERNAME=" "MAIL=/var/spool/mail/root" "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin" "PWD=/root" "PS1=[\\u@\\h\040\\W]\\$\040" "HISTCONTROL=ignoredups" "SHLVL=1" "HOME=/root" "LESS=-X" "LOGNAME=root" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/tail" }
> <kernel> /sbin/mingetty /bin/login /bin/bash
> allow_execute /bin/tail
> #2009-02-20 16:16:35# profile=3 mode=enforcing pid=3664 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 state[0]=0 state[1]=0 state[2]=0
> <kernel> /sbin/mingetty /bin/login /bin/bash
> allow_read /bin/tail
> #2009-02-20 16:16:44# profile=3 mode=enforcing pid=3665 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 state[0]=0 state[1]=0 state[2]=0
> <kernel> /sbin/mingetty /bin/login /bin/bash /bin/head
> allow_read /etc/shadow
> #2009-02-20 16:16:47# profile=3 mode=enforcing pid=3688 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 state[0]=0 state[1]=0 state[2]=0
> <kernel> /sbin/mingetty /bin/login /bin/bash /bin/tcsh
> allow_create /tmp/sysconfig-i18n.3666
> #2009-02-20 16:16:50# profile=3 mode=enforcing pid=3689 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 state[0]=0 state[1]=0 state[2]=0 argc=1 envc=26 argv[]={ "date" } envp[]={ "HOSTNAME=localhost.localdomain" "TERM=linux" "SHELL=/bin/bash" "HISTSIZE=1000" "USER=root" "ENV=/root/.bashrc" "USERNAME=" "MAIL=/var/spool/mail/root" "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin" "PWD=/root" "PS1=[\\u@\\h\040\\W]\\$\040" "HISTCONTROL=ignoredups" "SHLVL=2" "HOME=/root" "LESS=-X" "LOGNAME=root" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/tcsh" "HOSTTYPE=i386-linux" "VENDOR=intel" "OSTYPE=linux" "MACHTYPE=i386" "GROUP=root" "HOST=localhost.localdomain" "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" }
> <kernel> /sbin/mingetty /bin/login /bin/bash /bin/tcsh
> allow_execute /bin/date

上記のログから、 Turbolinux 11 Serverの「/bin/tcsh」を起動すると「/tmp/sysconfig-i18n.プロセスID」というテンポラリファイルを生成しようとすることが判明しました。その理由をアクセス許可ログ（上記の設定では /dev/null に捨てるようになっていますが、ログに保存することもできます）から探してみたところ、「/bin/tcsh」が「/etc/profile.d/glib2.csh」を読み込んで処理しているためであることを確認できました。
今回は確認モードによる確認を経ずに強制モードにしたので、エラーになってしまいました。実際のシステムで使う場合には、確認モードを利用してアクセス許可の不足が無いことを確認してから強制モードにするようにしてください。

このようにTOMOYO Linuxのファイルに対するアクセス制御を用いれば、

- どのような実行履歴を持つプロセスが
- いつ
- どんなファイルに
- どんなアクセスを

行ったかを監視することもできます。