# TOMOYO Linux 導入手順書 （Ubuntu 6.10版）

- 概要
- インストール
  - TOMOYO Linuxのカーネルのインストール
  - TOMOYO Linuxのツールのインストール
- 設定
  - 設定の保存ディレクトリの作成
  - プロファイルの作成
  - ポリシーの作成準備
  - ポリシーの変更を許可するプログラムの設定
  - 監査ログの取得準備
  - 例外ポリシーの作成
- 運用
  - TOMOYO Linuxカーネルでの起動
  - ログイン後の操作の学習
  - ポリシーの参照
  - 強制アクセス制御

## 概要

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

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

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

## インストール

### TOMOYO Linuxのカーネルのインストール

TOMOYO LinuxはLinuxカーネルへのパッチとして提供されており、 本来はLinuxカーネルのソースコードにパッチを適用する作業が必要になります。 しかしUbuntu 6.10の場合は、TOMOYO Linuxのパッチを当てたコンパイル済みカーネルパッケージが 提供されているので、今回はそれを利用します。

まずはパッケージをダウンロードします。

    # wget http://osdn.dl.sourceforge.jp/tomoyo/22799/linux-image-2.6.17.14-ubuntu1-ccs_1.3.1_i586.deb

次に、ダウンロードしてきたパッケージをインストールします。

    # dpkg --install linux-image-2.6.17.14-ubuntu1-ccs_1.3.1_i586.deb

インストールに成功すれば/boot/grub/menu.lstに以下の記述が追加されているはずです。

    title           Ubuntu, kernel 2.6.17.14-ubuntu1-ccs
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.17.14-ubuntu1-ccs root=/dev/sda1 ro quiet splash locale=ja_JP
    initrd          /boot/initrd.img-2.6.17.14-ubuntu1-ccs
    quiet
    savedefault
    boot

    title           Ubuntu, kernel 2.6.17.14-ubuntu1-ccs (recovery mode)
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.17.14-ubuntu1-ccs root=/dev/sda1 ro single
    initrd          /boot/initrd.img-2.6.17.14-ubuntu1-ccs
    boot

今後カーネルの選択を行いやすくするために、 /boot/grub/menu.lstの"timeout"の行を コメントアウトしておきます。

    #timeout 3

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

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

カーネルと同様、sargeにはコンパイル済みのtarballが用意されていますので、 それをダウンロードして解凍します。 ツールは/root/ccstoolsディレクトリに置くことにします。

    # cd /root
    # wget http://osdn.dl.sourceforge.jp/tomoyo/22799/ccs-tools-1.3.1-i386-Ubuntu6.10.tar.gz
    # tar zxf ccs-tools-1.3.1-i386-Ubuntu6.10.tar.gz

ツールのうち、ポリシーを読み込むスクリプトである.initは、ルートディレクトリに移動しておきます。

    # mv /root/ccstools/.init /

カーネルの起動時にポリシーを読み込むため、/.initをカーネルのコマンドラインに追加します。 /boot/grub/menu.lstのTOMOYOカーネルのエントリのkernel行に以下のようにinit=/.initを追加してください。

重要： /.init のプロンプトやコンソールログイン画面を表示できるようにするために、 splash オプションは削除してください。

    title           Ubuntu, kernel 2.6.17.14-ubuntu1-ccs
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.17.14-ubuntu1-ccs root=/dev/sda1 ro quiet locale=ja_JP init=/.init
    initrd          /boot/initrd.img-2.6.17.14-ubuntu1-ccs
    quiet
    savedefault
    boot

    title           Ubuntu, kernel 2.6.17.14-ubuntu1-ccs (recovery mode)
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.17.14-ubuntu1-ccs root=/dev/sda1 ro single init=/.init
    initrd          /boot/initrd.img-2.6.17.14-ubuntu1-ccs
    boot

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

## 設定

### 設定の保存ディレクトリの作成

TOMOYO Linuxの設定を保存するディレクトリは/etc/ccsです。このディレクトリをあらかじめ作っておきます。

    # mkdir -m 700 /etc/ccs

### プロファイルの作成

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

今回はファイルに対するアクセス制御の機能のみを利用するため、 以下のようにして/etc/ccs/status.txtを作成します。

    # cat > /etc/ccs/status.txt << EOF
    0-COMMENT=-----DISABLED_MODE-----
    0-MAC_FOR_FILE=0
    0-TOMOYO_VERBOSE=0
    1-COMMENT=-----ACCEPT_MODE-----
    1-MAC_FOR_FILE=1
    1-TOMOYO_VERBOSE=0
    2-COMMENT=-----PERMISSIVE_MODE-----
    2-MAC_FOF_FILE=2
    2-TOMOYO_VERBOSE=1
    3-COMMENT=-----ENFORCE_MODE-----
    3-MAC_FOR_FILE=3
    3-TOMOYO_VERBOSE=1
    EOF

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

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

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

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

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

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

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

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

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

### ポリシーの作成準備

TOMOYO Linuxのポリシーは先ほどの学習用のプロファイル（プロファイル1）を用いて作成できますが、 その前にいくつか準備が必要です。ポリシーの作成準備は以下の流れで行います。

1. ポリシーの変更を許可するプログラムの指定
2. 監査ログの取得準備
3. 例外ポリシーの作成

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

ポリシーを変更することができるプログラムを、/etc/ccs/manager.txtというファイルで指定します。 ccs-toolsの中の6つのプログラムを以下のように指定してください。

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

#### 監査ログの取得準備

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

ログを保存するには、ccs-toolsのccs-auditdというデーモンプログラムを使用します。 アクセス拒否ログのみを保存する設定でccs-auditdをLinuxの起動時に実行するには、 まず、以下のコマンドで/etc/init.dにシェルスクリプトを作成し、実行権限を与えます。

    # cat > /etc/init.d/ccs-auditd << EOF
    #!/bin/sh
    /root/ccstools/ccs-auditd /dev/null /var/log/tomoyo/reject_log.txt
    EOF
    # chmod +x /etc/init.d/ccs-auditd

そして、以下のコマンドでLinuxの起動時に呼び出すシンボリックリンクを作成します。

    # update-rc.d ccs-auditd start 99 2 3 4 5 .
     Adding system startup for /etc/init.d/ccs-auditd ...
       /etc/rc2.d/S99ccs-auditd -> ../init.d/ccs-auditd
       /etc/rc3.d/S99ccs-auditd -> ../init.d/ccs-auditd
       /etc/rc4.d/S99ccs-auditd -> ../init.d/ccs-auditd
       /etc/rc5.d/S99ccs-auditd -> ../init.d/ccs-auditd

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

    # mkdir -p /var/log/tomoyo

#### 例外ポリシーの作成

ポリシー生成の前には、以下の7種類の例外を設定しておく必要があります。

1. /proc/PID のように同様のパス名をパターン化する際のパターン名
2. すべてのプログラムに対して参照することを許可するパス名
3. デーモンとして動作させるプログラムのパス名
4. ドメイン遷移を行わないドメイン
5. 追記を許可して書き換えを禁止するファイルのパス名
6. 1つに集約して扱うプログラムのパス名
7. シンボリックリンクの名前で実行するプログラムのパス名

7種類のうち上から6種類の例外ポリシーを自動的に生成するスクリプトmake_exception.shと、 7種類目のシンボリックリンクに関する例外ポリシーを自動的に生成するスクリプトmake_alias.shが、 ccs-toolsに用意されています。

これらを使って例外ポリシーを生成して保存するには以下のようにします。

    # /root/ccstools/make_exception.sh > /etc/ccs/exception_policy.txt
    # /root/ccstools/make_alias.sh >> /etc/ccs/exception_policy.txt

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

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

## 運用

それでは、いよいよTOMOYO Linuxカーネルで起動してみましょう。

### TOMOYO Linuxカーネルでの起動

まずはLinuxを再起動します。

    # reboot

カーネルの選択画面でTOMOYO Linuxのカーネルを選択してEnterを押します。

起動途中で以下の画面が表示されます。

この状態でEnterキーを押すか10秒間待つと、先ほど作成した例外ポリシーが読み込まれ、 Linuxが起動します。 起動プロセスが終了するとログインプロンプトが表示されるので、rootでログインしてください。

グラフィカル画面からコンソール画面へ切り替えるには、 Ctrl-Alt-F1 を押してください。 VMware の場合は Alt-F1-CtrlまたはCtrl-F1-Altの順に押してください。

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

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

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

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

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

    # /root/ccstools/setprofile -r 1 '<kernel> /sbin/getty'

このコマンドは、

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

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

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

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

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

### ポリシーの参照

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

    # /root/ccstools/editpolicy

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

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

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

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

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

> - /etc/passwdへの読み込みアクセスを許可する（青下線）
> - プロファイル1を用いる（黄下線）

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

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

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

また、すべてのドメインにuse_profileというポリシーが存在しており、 この値がドメインが使用するプロファイル番号を表しています。

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

    # /root/ccstools/savepolicy

### 強制アクセス制御

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

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

    # /root/ccstools/setprofile -r 3 '<kernel> /sbin/getty'

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

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

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

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

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

    #2007-01-29 10:35:50# pid=4447 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
    <kernel> /sbin/getty /bin/login /bin/bash
    1 /usr/bin/tail

    #2007-01-29 10:35:50# pid=4447 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
    <kernel> /sbin/getty /bin/login /bin/bash
    4 /usr/bin/tail

    #2007-01-29 10:36:01# pid=4448 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
    <kernel> /sbin/getty /bin/login /bin/bash /usr/bin/head
    4 /etc/shadow

    #2007-01-29 10:36:17# pid=4450 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
    <kernel> /sbin/getty /bin/login /bin/bash /bin/sh
    1 /bin/date

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

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

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