以下では、Debian GNU/Linux 3.1 (sarge)にTOMOYO Linux 1.2を導入する手順を解説します。この手順書に従って操作すれば、TOMOYO Linuxの基本的な機能を理解し、簡単な設定と運用が行えるようになります。
導入の流れは以下の通りです。
TOMOYO LinuxはLinuxカーネルへのパッチとして提供されており、本来はLinuxカーネルのソースコードにパッチを適用する作業が必要になります。しかしsargeの場合は、TOMOYO Linuxのパッチを当てたコンパイル済みカーネルパッケージが提供されているので、今回はそれを利用します。
まずはパッケージをダウンロードします。
# wget http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-image-2.6.8-16sarge5-ccs_1.2_i586.deb
次に、ダウンロードしてきたパッケージをインストールします。
# dpkg --install kernel-image-2.6.8-16sarge5-ccs_1.2_i586.deb
Selecting previously deselected package kernel-image-2.6.8-16sarge5-ccs-i586.
(Reading database ... 11049 files and directories currently installed.)
Unpacking kernel-image-2.6.8-16sarge5-ccs-i586 (from kernel-image-2.6.8-16sarge5-ccs_1.2_i586.deb) ...
Setting up kernel-image-2.6.8-16sarge5-ccs-i586 (1.2) ...
Searching for GRUB installation directory ... found: /boot/grub .
Testing for an existing GRUB menu.list file... found: /boot/grub/menu.lst .
Searching for splash image... none found, skipping...
Found kernel: /boot/vmlinuz-2.6.8-16sarge5-ccs
Found kernel: /boot/vmlinuz-2.6.8-2-386
Updating /boot/grub/menu.lst ... done
インストールに成功すれば/boot/grub/menu.lstに以下の記述が追加されているはずです。
title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot
今後カーネルの選択を行いやすくするために、/boot/grub/menu.lstの"timeout"の行をコメントアウトしておきます。
#timeout 5
カーネルの次は、TOMOYO Linuxのツールをインストールします。ツールには、ポリシーの管理を行うプログラムが収録されています。
カーネルと同様、sargeにはコンパイル済みのtarballが用意されていますので、それをダウンロードします。 ツールは/root/ccstoolsディレクトリに置くことにします。
# cd /root # wget http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-Sarge.tar.gz
ダウンロードしてきたファイルを解凍すればツールのインストールは終了です。
# tar zxf ccs-tools-1.2-i386-Sarge.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の起動モードの設定をおこないましょう。
カーネルのインストール時にも一部確認しましたが、/boot/grub/menu.lstの末尾は以下のようになっているはずです。
title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-2-386 root (hd0,0) kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro initrd /boot/initrd.img-2.6.8-2-386 savedefault boot title Debian GNU/Linux, kernel 2.6.8-2-386 (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.8-2-386 savedefault boot
今回はprofile0.txtを読み込むモードとprofile1.txtを読み込むモード2つを選択したいので、TOMOYO Linuxカーネルの項目を2つにして、それぞれのタイトルと引数を変えます。引数のCCSは大文字でなければいけないことに注意してください。
title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs ACCEPT MODE root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro CCS=0 initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs ENFORCE MODE root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro CCS=1 initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-16sarge5-ccs (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.8-16sarge5-ccs root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.8-16sarge5-ccs savedefault boot title Debian GNU/Linux, kernel 2.6.8-2-386 root (hd0,0) kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro initrd /boot/initrd.img-2.6.8-2-386 savedefault boot title Debian GNU/Linux, kernel 2.6.8-2-386 (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.8-2-386 savedefault boot
"ACCEPT MODE"がprofile0.txtを読み込む自動学習モード、"ENFORCE MODE"がprofile1.txtを読み込む強制アクセス制御モードです。
TOMOYO Linuxのポリシーの作成は、先ほどカーネルの起動オプションで設定した自動学習モードでおこなえますが、その前にいくつか準備が必要です。この準備作業はTOMOYO Linuxのカーネルではなく、必ず通常のカーネルで行ってください。TOMOYO Linuxのカーネルで準備作業を行っても、シャットダウン時に設定が上書きされてしまいます。
現在動作中のカーネルの情報を出力するには、unameコマンドを使います。
# uname --kernel-release
2.6.8-2-386
上記のように、kernel-releaseに"ccs"が含まれていなければOKです。
ポリシーの作成準備は以下の流れでおこないます。
ポリシーの設定ファイルは、プロファイルと同様にすべて/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が実行されるように修正を加えます。
まずはシャットダウンスクリプトである/etc/init.d/haltの末尾を以下のように書き換えます。
変更前 | 変更後 |
---|---|
halt -d -f -i $poweroff $hddown : exit 0 |
halt --help 2> /dev/null /root/ccstools/savepolicy a halt -d -f -i $poweroff $hddown : exit 0 |
次に、リブートスクリプトである/etc/init.d/rebootの末尾を以下のように書き換えます。
変更前 | 変更後 |
---|---|
reboot -d -f -i |
reboot --help 2> /dev/null /root/ccstools/savepolicy a reboot -d -f -i |
savepolicyの前にhalt/rebootを一度実行しているのは、halt/rebootをポリシーに追加するためです。また、savepolicyの引数"a"は、すべてのポリシーを保存するオプションです。
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 /var/log/tomoyo
ポリシー生成の前には、以下の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に学習させることにします。
まずは学習モードで起動するために、Linuxを再起動します。
# reboot
カーネルの選択画面で"ACCEPT MODE"を選択してEnterを押します。
rootでログインし、上記の操作を行います。
一見普通のLinuxと変わりなく操作できますが、裏ではTOMOYO Linuxがアクセス許可を監視し、操作ごとにポリシーとしてメモリ上に記憶しています。
生成されたポリシーの参照・編集には、ccs-toolsのeditpolicyを用います。
editpolicyを起動すると、TOMOYO Linuxが学習したドメイン遷移が表示されます。
ドメイン遷移はプロセスの親子関係をそのまま反映しており、どのプロセスからどのプロセスが実行されたのかを見て取ることができます。
ドメイン遷移の中から、gettyを探してみてください。
/sbin/getty下の/bin/login以下では、ログインしてからのプロセス実行履歴が分かります。その中からさらに、/usr/bin/headコマンドを探してみてください。headコマンドの行でEnterキーを押すと、以下の画面が表示されます。
これは先ほどの操作で学習したポリシーで、
<kernel> /sbin/getty /bin/login /bin/bash /usr/bin/headというドメイン(赤下線)には/etc/passwdへの読み込みアクセス(青下線)を許可する
ということを意味しています。
このようにTOMOYO Linuxでは、絶対パスを用いたプロセスの実行履歴を用いてドメイン分けを行っており、同じコマンドであっても、実行履歴により区別されたアクセス制御を行うことができます。また、ドメインにおけるファイルに対するアクセス許可は、 通常のLinuxにおけるファイルに対するパーミッションと同様の3種類(読み込み・書き込み・実行)の他に、ファイルの新規作成・削除・名前変更なども設定できます。
学習モードで学習されたポリシーはシャットダウン時にファイルに保存され、次回の起動時には自動的に読み込まれます。実際の運用では、再起動を含めて許可したい操作を何回か学習させ、ポリシーエディタで不要なアクセス許可を除いていく、という操作を繰り返します。
それでは、先ほど自動学習したポリシーを使って、強制アクセス制御を行います。Linuxを再起動し、今度は"ENFORCE MODE"のカーネルでLinuxを起動してください。このモードでは、TOMOYO Linuxは起動時にポリシーの読み込みを行い、ポリシーに含まれない操作を拒否します。
rootでログインした後、以下の操作を行ってみます。
図中の赤下線のコマンドは先ほど学習モードで行った操作ですので、問題なく実行できます。逆に青下線のコマンドはエラーになります。
エラーになった操作のログは、ccs-toolsのccs-auditdによって/var/log/tomoyo/reject_log.txtに保存されています。
#2006-08-07 12:16:43# pid=1691 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 #2006-08-07 12:16:43# pid=1691 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 #2006-08-07 12:16:51# pid=1692 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 #2006-08-07 12:16:56# pid=1694 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 <kernel> /sbin/getty /bin/login /bin/bash /bin/tcsh 1 /bin/date