# TOMOYO Linux 導入手順書 （Fedora Core 5版）

- 概要
- インストール
- SELinuxを無効にする
  - TOMOYO Linuxのカーネルのインストール
  - TOMOYO Linuxのツールのインストール
- 設定
  - プロファイルの作成
  - 読み込むプロファイルの設定
  - ポリシーの作成準備
    - ポリシーの変更を許可するプログラムの指定
    - シャットダウン処理の修正
    - 監査ログの取得準備
    - 例外ポリシーの作成
- 運用
  - 自動学習モード
  - ポリシーの参照と編集
  - 強制アクセス制御モード

## 概要

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

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

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

## インストール

### SELinuxを無効にする

Fedora Core 5は、インストール時のデフォルトでSELinuxが有効になっています。本来TOMOYO LinuxとSELinuxは共存が可能ですが、Fedora Core 5の場合、うまく共存できない例が報告されています。現状では、Fedora Core 5でTOMOYO Linuxを使用する際にはSELinuxを無効にすることをお勧めします。

現在SELinuxが有効になっているかどうかは、getenforceコマンドで確認できます。

          # getenforce
          Enforcing

上記のように、"Enforcing"が表示されればSELinuxは有効になっています。

Linuxの起動時にSELinuxを無効にするには、SELinuxの設定ファイルである/etc/selinux/configの"SELINUX="の行を以下のように編集します。

          SELINUX=disabled

編集が終わったらLinuxを再起動します。

          # reboot

再度getenforceコマンドを実行し、"Disabled"が表示されることを確かめてください。

          # getenforce
          Disabled

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

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

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

          # wget http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.18-1.2200_FC5_tomoyo_1.2.i586.rpm

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

          # rpm --install kernel-2.6.18-1.2200_FC5_tomoyo_1.2.i586.rpm

この際特にメッセージは表示されませんが、インストールに成功すれば/etc/grub.confに以下の記述が追加されているはずです。

          title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2)
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00
          initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img

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

          #timeout=5

          #hiddenmenu

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

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

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

          # cd /root
          # wget http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC5.tar.gz

ダウンロードしてきたファイルを解凍すればツールのインストールは終了です。

          # tar zxf ccs-tools-1.2-i386-FC5.tar.gz

## 設定

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

TOMOYO Linuxには多くの機能があり、どの機能をON/OFFにするのかの設定をプロファイルとよびます。プロファイルは/root/security/profile$INDEX.txt（$INDEXは整数）というファイルに保存し、TOMOYO Linuxのカーネルの引数でどのプロファイルを用いるかを指定することができます。

今回はファイルに対するアクセス制御の機能のみを利用するため、そのためのプロファイルを2つ（1つは自動学習モード、もう1つは強制アクセス制御モード）用意します。

まず、プロファイルやその他の設定ファイルを保存するためのディレクトリをつくります。

          # mkdir /root/security
          # cd /root/security

そして、/root/securityに、profile0.txtとprofile1.txtというファイルを作成します。

          # cat > profile0.txt << EOF
          MAC_FOR_FILE=1
          EOF
          # cat > profile1.txt << EOF
          MAC_FOR_FILE=3
          EOF

MAC_FOR_FILE=1が「ファイルに対するアクセスの自動学習モード」であり、MAC_FOR_FILE=3が「ファイルに対する強制アクセス制御モード」です。自動学習モードでおこなったアクセスを元に、強制アクセス制御モードでアクセス制御をおこなう、というのが基本的な運用の流れです。

### 読み込むプロファイルの設定

カーネルの読み込み時にどのプロファイルを使用するかは、カーネルの引数で指定します。カーネルにCCS=$INDEXという引数を与えて起動すると、/root/security/profile$INDEX.txtというプロファイルを読み込みます。

それでは、TOMOYO Linuxの起動モードの設定をおこないましょう。

カーネルのインストール時にも一部確認しましたが、/etc/grub.conf全体は以下のようになっているはずです。

          # grub.conf generated by anaconda
          #
          # Note that you do not have to rerun grub after making changes to this file
          # NOTICE:  You have a /boot partition.  This means that
          #          all kernel and initrd paths are relative to /boot/, eg.
          #          root (hd0,0)
          #          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
          #          initrd /initrd-version.img
          #boot=/dev/sda
          default=0
          #timeout=5
          splashimage=(hd0,0)/grub/splash.xpm.gz
          #hiddenmenu
          title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2)
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00
          initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img
          title Fedora Core (2.6.18-1.2200_FC5)
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5 ro root=/dev/VolGroup00/LogVol00
          initrd /initrd-2.6.18-1.2200_FC5.img

今回はprofile0.txtを読み込むモードとprofile1.txtを読み込むモード2つを選択したいので、TOMOYO Linuxカーネルの項目を2つにして、それぞれのタイトルと引数を変えます。引数のCCSは大文字でなければいけないことに注意してください。

          # grub.conf generated by anaconda
          #
          # Note that you do not have to rerun grub after making changes to this file
          # NOTICE:  You have a /boot partition.  This means that
          #          all kernel and initrd paths are relative to /boot/, eg.
          #          root (hd0,0)
          #          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
          #          initrd /initrd-version.img
          #boot=/dev/sda
          default=0
          #timeout=5
          splashimage=(hd0,0)/grub/splash.xpm.gz
          #hiddenmenu
          title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) ACCEPT MODE
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 CCS=0
          initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img
          title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) ENFORCE MODE
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 CCS=1
          initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img
          title Fedora Core (2.6.18-1.2200_FC5)
          root (hd0,0)
          kernel /vmlinuz-2.6.18-1.2200_FC5 ro root=/dev/VolGroup00/LogVol00
          initrd /initrd-2.6.18-1.2200_FC5.img

"ACCEPT MODE"がprofile0.txtを読み込む自動学習モード、"ENFORCE MODE"がprofile1.txtを読み込む強制アクセス制御モードです。

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

TOMOYO Linuxのポリシーの作成は、先ほどカーネルの起動オプションで設定した自動学習モードでおこなえますが、 その前にいくつか準備が必要です。 この準備作業はTOMOYO Linuxのカーネルではなく、必ず通常のカーネルで行ってください。 TOMOYO Linuxのカーネルで準備作業を行っても、シャットダウン時に設定が上書きされてしまいます。

現在動作中のカーネルの情報を出力するには、unameコマンドを使います。

          # uname --kernel-release
          2.6.18-1.2200_FC5

上記のように、kernel-releaseに"tomoyo"が含まれていなければOKです。

ポリシーの作成準備は以下の流れでおこないます。

1. ポリシーの変更を許可するプログラムの指定
2. シャットダウン処理の修正
3. 監査ログの取得準備
4. 例外ポリシーの作成

ポリシーの設定ファイルは、プロファイルと同様にすべて/root/securityディレクトリに置きます。

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

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

          # cat > /root/security/manager.txt << EOF
          /root/ccstools/loadpolicy
          /root/ccstools/editpolicy
          /root/ccstools/setlevel
          EOF

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

TOMOYO Linuxの動作中、ポリシーはメモリ上に置かれています。電源が切れる直前のポリシーをファイルに保存するため、シャットダウンスクリプトの中で/root/ccstools/savepolicyが実行されるように修正を加えます。

Fedora Core 5のシャットダウンスクリプトは/etc/rc.d/init.d/haltです。haltの最後の行は以下のようになっているはずです。

          exec $command $HALTARGS

このコマンドの直前にsavepolicyを実行するように変更します。

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

savepolicyの引数"a"は、すべてのポリシーを保存するオプションです。

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

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

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

          /root/ccstools/ccs-auditd /dev/null /var/log/tomoyo/reject_log.txt

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

          # mkdir /var/log/tomoyo

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

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

1. /proc/PID のように同様のパス名をパターン化する際のパターン名
2. すべてのプログラムに対して参照することを許可するパス名
3. デーモンとして動作させるプログラムのパス名
4. 強制アクセス制御が適用されない信頼済みドメイン

以上の4種類の例外ポリシーを自動的に生成するスクリプトmake_exception.shが、ccs-toolsに用意されています。make_exception.shを使って例外ポリシーを生成して保存するには以下のようにします。

          # /root/ccstools/make_exception.sh > /root/security/exception_policy.txt

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

## 運用

### 自動学習モード

それでは、TOMOYO Linuxにポリシーを学習させましょう。 今回は、ログイン後の以下の操作をTOMOYO Linuxに学習させることにします。

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

まずは学習モードで起動するために、Linuxを再起動します。

          # reboot

カーネルの選択画面で"ACCEPT MODE"を選択してEnterを押します。

rootでログインし、上記の操作を行います。

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

### ポリシーの参照と編集

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

editpolicyを起動すると、TOMOYO Linuxが学習したドメイン遷移が表示されます。

ドメイン遷移はプロセスの親子関係をそのまま反映しており、どのプロセスからどのプロセスが実行されたのかを見て取ることができます。

ドメイン遷移の中から、mingettyを探してみてください。

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

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

> <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/headというドメイン（赤下線）には/etc/passwdへの読み込みアクセス（青下線）を許可する

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

このようにTOMOYO Linuxでは、絶対パスを用いたプロセスの実行履歴を用いてドメイン分けを行っており、同じコマンドであっても、実行履歴により区別されたアクセス制御を行うことができます。また、ドメインにおけるファイルに対するアクセス許可は、通常のLinuxにおけるファイルに対するパーミッションと同様の3種類（読み込み・書き込み・実行）の他に、ファイルの新規作成・削除・名前変更なども設定できます。

学習モードで学習されたポリシーはシャットダウン時にファイルに保存され、次回の起動時には自動的に読み込まれます。実際の運用では、再起動を含めて許可したい操作を何回か学習させ、ポリシーエディタで不要なアクセス許可を除いていく、という操作を繰り返します。

### 強制アクセス制御モード

それでは、先ほど自動学習したポリシーを使って、強制アクセス制御を行います。Linuxを再起動し、今度は"ENFORCE MODE"のカーネルでLinuxを起動してください。このモードでは、TOMOYO Linuxは起動時にポリシーの読み込みを行い、ポリシーに含まれない操作を拒否します。

rootでログインした後、以下の操作を行ってみます。

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

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

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

          #2006-08-07 16:12:29# pid=1677 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
          <kernel> /sbin/mingetty /bin/login /bin/bash
          1 /usr/bin/tail

          #2006-08-07 16:12:29# pid=1677 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
          <kernel> /sbin/mingetty /bin/login /bin/bash
          4 /usr/bin/tail

          #2006-08-07 16:12:38# pid=1678 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
          <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/head
          4 /etc/shadow

          #2006-08-07 16:12:45# pid=1692 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0
          <kernel> /sbin/mingetty /bin/login /bin/bash /bin/tcsh
          1 /bin/date